From 6b49567b2c414ffcf85409f5bc5918b03678a61d Mon Sep 17 00:00:00 2001 From: arthurh <49833088+maxwellsdm1867@users.noreply.github.com> Date: Tue, 29 Sep 2026 21:51:59 -0700 Subject: [PATCH 1/6] Make projects portable and guide project folder selection --- docs/WORKSPACE_SHARING_AND_UPDATES.md | 59 ++++- docs/dev/NATIVE_E2E_VALIDATION.md | 123 +++++++++++ docs/dev/portable-project-chooser-design.png | Bin 0 -> 36492 bytes docs/dev/portable-project-naming-design.jpg | Bin 0 -> 47063 bytes .../dev/portable-project-receive-verified.jpg | Bin 0 -> 56677 bytes docs/dev/portable-project-restore-e2e.png | Bin 0 -> 38454 bytes .../dev/portable-project-root-suggestions.jpg | Bin 0 -> 82616 bytes docs/dev/portable-project-share-design.png | Bin 0 -> 76024 bytes docs/dev/portable-project-sidebar-e2e.png | Bin 0 -> 56438 bytes .../project-root-location-verification.json | 9 + python/recording_workspace.py | 79 +++++++ python/tests/test_workspace_api.py | 4 + python/tests/test_workspace_app_routes.py | 34 ++- python/tests/test_workspace_installation.py | 3 + python/tests/test_workspace_open_folder.py | 58 +++++ python/tests/test_workspace_portability.py | 184 ++++++++++++++++ .../tests/test_workspace_portability_app.py | 140 ++++++++++++ .../test_workspace_project_preferences.py | 95 ++++++++ .../tests/test_workspace_project_servers.py | 18 ++ .../test_workspace_project_validation.py | 123 ++++++++++- python/tests/test_workspace_projects.py | 97 ++++++++- python/tests/test_workspace_startup.py | 6 +- .../tests/test_workspace_startup_registry.py | 161 ++++++++++++++ python/workspace_api.py | 2 + python/workspace_app_routes.py | 5 + python/workspace_launcher.py | 36 +-- python/workspace_portability.py | 205 +++++++++++++++++- python/workspace_project_preferences.py | 185 ++++++++++++++++ python/workspace_project_servers.py | 12 +- python/workspace_project_validation.py | 85 +++++++- python/workspace_projects.py | 106 ++++++--- python/workspace_service.py | 3 +- python/workspace_startup_registry.py | 152 +++++++++++++ workspace-app/src/App.jsx | 3 +- .../src/components/ExportSelectionDialog.jsx | 16 +- .../src/components/MetadataExplorer.jsx | 18 +- .../src/components/PredicateDialog.jsx | 4 +- .../src/components/ProjectClosedNotice.css | 3 + .../src/components/ProjectClosedNotice.jsx | 9 +- .../src/components/ProjectFolder.css | 48 +++- .../src/components/ProjectFolder.jsx | 123 ++++++----- .../src/components/ProjectNavigator.jsx | 2 +- .../src/components/ProjectOnboarding.css | 19 +- .../src/components/ProjectOnboarding.jsx | 56 +++-- .../src/components/ProtocolSidebar.jsx | 55 ++--- .../src/components/ProtocolSuggestion.jsx | 5 +- .../src/components/SearchPresets.jsx | 8 +- workspace-app/src/ordering.js | 23 ++ workspace-app/src/projectPreferences.js | 115 ++++++++++ workspace-app/src/projectPreferences.test.js | 178 +++++++++++++++ workspace-app/src/projectTransfer.js | 17 ++ workspace-app/src/projectTransfer.test.js | 40 +++- workspace-app/src/useProjectPreference.js | 28 +++ 53 files changed, 2539 insertions(+), 215 deletions(-) create mode 100644 docs/dev/portable-project-chooser-design.png create mode 100644 docs/dev/portable-project-naming-design.jpg create mode 100644 docs/dev/portable-project-receive-verified.jpg create mode 100644 docs/dev/portable-project-restore-e2e.png create mode 100644 docs/dev/portable-project-root-suggestions.jpg create mode 100644 docs/dev/portable-project-share-design.png create mode 100644 docs/dev/portable-project-sidebar-e2e.png create mode 100644 docs/dev/project-root-location-verification.json create mode 100644 python/tests/test_workspace_portability_app.py create mode 100644 python/tests/test_workspace_project_preferences.py create mode 100644 python/tests/test_workspace_startup_registry.py create mode 100644 python/workspace_project_preferences.py create mode 100644 workspace-app/src/components/ProjectClosedNotice.css create mode 100644 workspace-app/src/projectPreferences.js create mode 100644 workspace-app/src/projectPreferences.test.js create mode 100644 workspace-app/src/useProjectPreference.js diff --git a/docs/WORKSPACE_SHARING_AND_UPDATES.md b/docs/WORKSPACE_SHARING_AND_UPDATES.md index 9f9caaf..41b7476 100644 --- a/docs/WORKSPACE_SHARING_AND_UPDATES.md +++ b/docs/WORKSPACE_SHARING_AND_UPDATES.md @@ -2,15 +2,48 @@ ## Choose the project folder itself +The left sidebar has two project actions: + +- **Add new project** opens an existing working project or a portable copy someone + gave you. Selecting a prepared copy checks its inventory and opens the restore + form automatically; choose a new local project folder, restore, then open it. +- **Start a brand new project** asks for a name and an empty folder and creates + the project manifests and managed storage. Opening initializes its database. + New project asks for a name and one **Project folder**. That exact folder is the project root: it can be anywhere writable, outside the application code. Choose a new or empty folder; existing project folders should be opened instead. No extra parent workspace or generated subfolder is required. +For example, name a new project **Spike response study** and choose a new or +empty folder named **Spike response study** in your own research location. +Matching names make the folder easier to recognize later. The project name is +shown in the app; the folder name can differ, and neither name is its unique +identity. A project's name can change without moving its files. + +When reopening or receiving that project, select the **Spike response study** +folder itself. Its project files and contents should be directly inside it. +Choose its top folder rather than the research folder above it or an `imports`, +`database` or other folder inside it. The app checks the files to identify the +project, so a renamed folder can still be recognized. + Open project checks the identity manifests, storage layout and database files before starting the project, then checks recording dependencies during opening. It opens the folder in place. The preferred projects location is optional. +Created, restored and successfully opened project roots are remembered in a +local user-profile index, so projects on other drives or outside the preferred +location remain in the chooser after closing or restarting. The index contains +folder references and display identities; the project files stay in their +chosen location. An unavailable drive leaves an unavailable project entry. + +Choose the top folder containing `project.json` and `catalog.json`, or the top +folder of a received portable copy. If you choose a project subfolder, the app +suggests its nearest valid project root. If you choose a parent, it lists valid +immediate child roots. Select **Use this folder**, then open or check that folder. +Several matches remain separate choices; the app does not open one automatically. +Nearby-folder discovery is bounded and read-only; it does not scan a whole drive. + To organize a closed native project, expand **Optional: move to a preferred location**, select **Move this folder before opening**, and review the new exact destination. The app moves the whole folder without overwriting an existing @@ -82,9 +115,25 @@ interchange. **Prepare to share** remains available when you want a separately verified copy with a logical database backup and all registered recordings included. It tests a -restore before reporting success. **Open prepared project** restores that optional -transfer to a new local folder with fresh native database credentials. Existing -projects are never overwritten. +restore before reporting success. After **Close project**, **Prepare portable +copy** opens sharing with that project's folder already selected. Give the entire +prepared folder to the recipient. Their **Add new project** action recognizes it +and restores it into a new folder with fresh native database credentials. +Existing projects are never overwritten. + +The logical backup includes all acquisition and project database tables: saved +predicates and every preset version, query run records, explorer revisions and +bindings, tags and authors, review decisions, inclusion masks, tree layouts, source +state, exports and event history. New copies record table row counts and content +checksums; restoration compares every table before updating current file paths. +Existing transfer copies without this additional database inventory remain readable. + +Recent search shortcuts and protocol pins/order are stored in +`protocols/ui-state/project-preferences.json`. The app migrates earlier browser +shortcuts when their project is opened, so these choices accompany subsequent +copies. Browser size, pane widths and the current user's author selection remain +local preferences. Durable import, app-job, error and storage history under +`logs/` is included; server process records and runtime logs are excluded. Legacy Docker projects keep their original configuration and data. They are not silently converted. Preparing a logical transfer from such a project still needs @@ -92,8 +141,8 @@ its original database available; restoring that transfer creates a native projec that no longer needs Docker. Native-to-native transfers use the bundled server and clients throughout. -The optional logical transfer currently requires an initialized project database. -Runtime logs, caches and existing backup directories are excluded from it. +Runtime logs, caches and existing backup directories are excluded from logical +transfers. Historical export files retain their original bytes; external readers of old exports may need embedded recording paths relinked. Interrupted logical restores do not resume automatically; inspect the reported destination before retrying. diff --git a/docs/dev/NATIVE_E2E_VALIDATION.md b/docs/dev/NATIVE_E2E_VALIDATION.md index 9d9a8a6..4bac244 100644 --- a/docs/dev/NATIVE_E2E_VALIDATION.md +++ b/docs/dev/NATIVE_E2E_VALIDATION.md @@ -158,3 +158,126 @@ Successful import completion now opens the global Review imported data dialog fr Removed the duplicate Import progress toolbar button. Import H5s now changes to Importing H5s while work is active and opens the same import/history page. File selection and drop accept multiple H5s, queued at app scope, with only one submitted import at a time. Upload uncertainty or failed imports stop the queue; no automatic POST retries occur. Keep the tab open for browser-held pending files. Browser file chooser confirmed multiple selection. Submitted a new synthetic H5 followed by an existing H5: first completed at 18:51:28 UTC, second started at 18:51:28.919 UTC and was skipped as duplicate. Review appeared after the queue drained, preserving the successful import review despite the last file being a duplicate. Frontend 211 tests and production build passed. + +## Project portability audit (2026-09-29) + +- Added explicit **Add new project** and **Start a brand new project** actions in + the left sidebar. The first recognizes an ordinary project or a received + transfer, and automatically shows the verified-copy restore form. The second + creates the selected exact project folder and its managed storage/database. +- The browser created a disposable native project, imported a read-only real + Symphony recording (5 cells, 690 epochs), closed it, prepared a checked copy, + added that received copy through the ordinary project action, restored it into + a fresh folder and opened its overview and protocols. Both sidebar actions and + the verified restore confirmation were visually checked. + [Recipient restore](portable-project-restore-e2e.png) and + [recipient sidebar](portable-project-sidebar-e2e.png). +- A production API integration test saved two named predicate versions, a query + run, an explorer baseline, authored tags, review/inclusion decisions, a tree + layout, recent-search shortcuts, protocol pins and a failed-job record. It + prepared a transfer, removed the entire disposable donor, restored to a fresh + runtime, then compared the actual recipient API responses and 16 waveform + samples. The recipient overview also opened successfully. +- Packages now preserve durable import/app-job/error/storage history, portable + search/navigation preferences and every SQL table. Each new package records + table columns, row counts and content checksums; restore compares these before + updating current file locators. H5 files with external dependencies and damaged + preferences are rejected before a recipient database is started. +- Native tests also exercise both never-opened and opened/closed empty projects, + independently restored copies, donor recording removal, safe rejection of + missing identity in populated projects and failed restore cleanup. +- Browser pinning and running a History noise search wrote both choices into + `protocols/ui-state/project-preferences.json` (72 epochs, 2 cells). Failed old + browser-preference migration preserves its cache across refresh until a save + succeeds; stale incoming/browser values and concurrent changes have coverage. +- Final backend workspace suite: **705 tests passed**, with native MySQL, + native transfer and production API portability gates enabled; no skips. + Frontend: **251 tests passed** and production build passed. Whitespace checks + passed. Original recordings and research projects were not modified. + +Reproduce the full backend checks with a suitable real Symphony fixture: + +```sh +RIEKE_TEST_NATIVE_MYSQL=1 RIEKE_TEST_NATIVE_TRANSFER=1 \ +RIEKE_TEST_PORTABLE_APP=1 RIEKE_PORTABILITY_H5=/absolute/path/to/recording.h5 \ +PYTHONPATH=python .rieke-runtime/venv/bin/python -m unittest discover \ + -s python/tests -p 'test_*workspace*.py' +``` + +These checks use fresh folders, credentials and native runtimes on one Apple +Silicon Mac. A physical second-computer or other-platform transfer remains +unverified. Restart existing app services to load the new backend before using +the rebuilt interface. + +### Project UI design follow-up + +The chooser now uses two icon-led action cards, a six-icon project contents +graphic, compact folder names and a collapsed preferred-location control. +The closed-project notice is a compact status row. The project dialog uses +**Open / Share / Receive** tabs and shows one task at a time, including concise +file verification and restore results. Native sharing shows the close action +before destination fields. Keyboard tab navigation and accessible control names +are preserved. + +The real received-copy flow was exercised again through the redesigned dialog. +Frontend: 251 tests passed and production build passed. Narrow layouts were +visually checked; the closed-notice dismiss/copy controls stay on the same row. + +Final browser checks also covered invalid-folder rejection and refusal to +restore into an existing destination. SHA-256 comparisons confirmed that the +existing project's manifest, catalog, database credentials and guard file were +unchanged. The new-project form created all managed folders, opened the empty +production overview, and closed cleanly. Design screenshots are saved as +`portable-project-chooser-design.png`, `portable-project-share-design.png` and +`portable-project-restore-e2e.png` alongside this report. + +### Project roots anywhere and nearby-folder suggestions + +Project creation, open, verified restore and relocation now remember exact +project roots in a local user-profile index. Inventories retain roots outside +the preferred location across closing and launcher restart, preserve independent +native copies by path, and show unavailable external drives. Exact creation and +opening do not write app registry or lock files into the project's parent. +Prepared transfer folders are excluded from live-project discovery. + +Folder inspection proposes the nearest fully validated containing root for +a nested selection, or valid immediate children for a parent selection. Searches +are bounded to eight ancestors and 128 immediate entries; no recursive drive +scan, runtime start or automatic candidate selection occurs. The UI lists each +candidate with **Use this folder**, followed by an explicit Open or Check action. + +The production service flow opened an external project after detecting its root +from `imports/`, closed its database cleanly and retained that exact root in the +launcher inventory. Receipt: `project-root-location-verification.json`. +Final full native backend suite: **803 tests passed**; frontend: **266 tests +passed** and production build passed. Live browser automation was unavailable +for a visual recheck of the new suggestion cards; API and frontend logic checks +passed. Refresh the preview after restarting its service to load the changes. + +### Final review before push + +The browser connection recovered for the final UI review. Naming guidance and +the matching name/folder preview, Back and Escape, parent and nested folder +suggestions, explicit candidate selection and prepared-copy detection all passed. +Editing a received path clears its earlier verification. Current screenshots: +`portable-project-naming-design.jpg`, `portable-project-root-suggestions.jpg` +and `portable-project-receive-verified.jpg`. + +Review fixes reject missing package metadata even when a checksum is null, +serialize managed and exact creation of the same folder, reapply sidebar move +intent after a preference conflict, preserve completed operations when saving +the local project index fails, and keep malformed old browser shortcuts from +crashing the search screen. The original browser cache is retained until a +successful save. Regression tests cover each failure. + +The push is prepared from a separate snapshot based on the current committed +code plus only the project portability changes and required dependencies. +Unrelated desktop, update, source-identity and performance edits are excluded. +The initial snapshot passed 693 backend tests with all native portability gates +enabled, 244 frontend tests and the production build. The final safeguards were +then incorporated and checked again before commit. + +Final feature-only snapshot: **697 backend tests passed**, all native gates +enabled with no skips; **245 frontend tests passed** and production build passed. +Whitespace checks passed. The additional tests in the larger shared working +tree belong to other ongoing changes and are not part of this push. diff --git a/docs/dev/portable-project-chooser-design.png b/docs/dev/portable-project-chooser-design.png new file mode 100644 index 0000000000000000000000000000000000000000..7d28d1f0cc562e22c9904c0588c2152f9a693f09 GIT binary patch literal 36492 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�K|io+LoDHB;R*6 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 literal 0 HcmV?d00001 diff --git a/docs/dev/portable-project-restore-e2e.png b/docs/dev/portable-project-restore-e2e.png new file mode 100644 index 0000000000000000000000000000000000000000..c28c533bb499315af62df05a5cd922e509cf3f61 GIT binary patch literal 38454 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�OODUIT`Z1+Qs+#uJ(;j*S{)V-z<)P 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%0DQ6fOz7lRvS(U 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 S89(jk+5dk^x4ZARzW)I=(@m@Z literal 0 HcmV?d00001 diff --git a/docs/dev/portable-project-share-design.png b/docs/dev/portable-project-share-design.png new file mode 100644 index 0000000000000000000000000000000000000000..327ae1867cb50c195bd027e2376eab8547ae4a65 GIT binary patch literal 76024 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%0D2g^Ct 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 hkLg^X$(yvN{M4P)bJ5aiIU)`19BN{{a7d=NkY3 literal 0 HcmV?d00001 diff --git a/docs/dev/portable-project-sidebar-e2e.png b/docs/dev/portable-project-sidebar-e2e.png new file mode 100644 index 0000000000000000000000000000000000000000..45670a90e9e9aa6de9fb8d3dd4ab0499ced3b580 GIT binary patch literal 56438 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�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 Q`5}dDIs2TSOV literal 0 HcmV?d00001 diff --git a/docs/dev/project-root-location-verification.json b/docs/dev/project-root-location-verification.json new file mode 100644 index 0000000..da5b02c --- /dev/null +++ b/docs/dev/project-root-location-verification.json @@ -0,0 +1,9 @@ +{ + "nested_folder_suggested_exact_root": true, + "external_root_opened": true, + "project_uuid": "96e2ddc1-f9ed-471b-86ce-6fa1f7751d51", + "database_closed_cleanly": true, + "external_root_remains_in_chooser": true, + "preferred_root": "/private/var/folders/41/tclkvrfs1v9386sxps6_w5t40000gn/T/rieke-portability-ui-s1wdbe4f/projects", + "selected_root": "/private/var/folders/41/tclkvrfs1v9386sxps6_w5t40000gn/T/rieke-portability-ui-s1wdbe4f/New design project" +} diff --git a/python/recording_workspace.py b/python/recording_workspace.py index c4e1a31..69d1d4a 100644 --- a/python/recording_workspace.py +++ b/python/recording_workspace.py @@ -21,6 +21,85 @@ import uuid +def validate_self_contained_h5(h5): + """Inspect links/layouts without reading samples or following external files. + + Walk physical hard-linked objects once: Symphony includes experiment/source + backlinks. Inspect every hard-link alias's containing group, and resolve soft + links only after external links everywhere in this file have been ruled out. + """ + import h5py + pending, seen, soft_links = ['/'], set(), [] + while pending: + obj = h5[pending.pop()] + address = h5py.h5o.get_info(obj.id).addr + if address in seen: + continue + seen.add(address) + if isinstance(obj, h5py.Dataset): + if obj.is_virtual: + raise ValueError(f'Virtual dataset dependencies are unsupported: {obj.name}') + if obj.external: + raise ValueError(f'External dataset storage is unsupported: {obj.name}') + elif isinstance(obj, h5py.Group): + for name in obj: + link = obj.get(name, getlink=True) + if isinstance(link, h5py.ExternalLink): + raise ValueError(f'External H5 links are unsupported: {obj.name}/{name}') + if isinstance(link, h5py.SoftLink): + soft_links.append(obj.name.rstrip('/') + '/' + name) + elif isinstance(link, h5py.HardLink): + pending.append(obj.name.rstrip('/') + '/' + name) + else: + raise ValueError(f'Unsupported H5 link: {obj.name}/{name}') + for path in soft_links: + target = resolve_sealed_h5_path(h5, path) + if h5py.h5o.get_info(target.id).addr not in seen: + raise ValueError(f'H5 link target is outside the sealed source: {path}') + + +def resolve_sealed_h5_path(h5, path): + """Resolve one locator without following unsealed links (bounded trace path). + + Inspect each soft-link expansion, including its intermediate components; + inspecting only the final object's filename misses external links that lead + back into this file, virtual mappings and external raw-storage datasets. + """ + import h5py + if not isinstance(path, str) or not path.startswith('/'): + raise ValueError('H5 locator must be an absolute path within its source') + parts, current, expansions = path.split('/')[1:], h5['/'], 0 + while parts: + name, parts = parts[0], parts[1:] + if not name or name == '.': + continue + if name == '..' or not isinstance(current, h5py.Group): + raise ValueError(f'Invalid H5 source locator: {path}') + link = current.get(name, getlink=True) + if isinstance(link, h5py.ExternalLink): + raise ValueError(f'External H5 links are unsupported: {path}') + if isinstance(link, h5py.SoftLink): + expansions += 1 + if expansions > 64: + raise ValueError(f'Unresolvable or cyclic H5 soft link: {path}') + target = link.path + if not target.startswith('/'): + target = current.name.rstrip('/') + '/' + target + parts, current = target.split('/')[1:] + parts, h5['/'] + continue + if not isinstance(link, h5py.HardLink): + raise ValueError(f'Missing or unsupported H5 source link: {path}') + current = current[name] + if current.file.id != h5.id: + raise ValueError(f'H5 link target is outside the sealed source: {path}') + if isinstance(current, h5py.Dataset): + if current.is_virtual: + raise ValueError(f'Virtual dataset dependencies are unsupported: {path}') + if current.external: + raise ValueError(f'External dataset storage is unsupported: {path}') + return current + + def now(): return dt.datetime.now(dt.timezone.utc).isoformat() diff --git a/python/tests/test_workspace_api.py b/python/tests/test_workspace_api.py index d067368..5d2e913 100644 --- a/python/tests/test_workspace_api.py +++ b/python/tests/test_workspace_api.py @@ -5,6 +5,7 @@ """ import hashlib import json +import os from pathlib import Path import tempfile import unittest @@ -124,6 +125,9 @@ def test_browser_metadata_preserves_exact_source_ticks(self): def setUp(self): self.temp = tempfile.TemporaryDirectory() self.addCleanup(self.temp.cleanup) + isolated_index = patch.dict(os.environ, {'RIEKE_PROJECT_INDEX': str(Path(self.temp.name) / 'user-state/project-index.json')}) + isolated_index.start() + self.addCleanup(isolated_index.stop) self.service = FixtureService(self.temp.name) self.curation = Table(('project_uuid', 'protocol_uuid', 'epoch_uuid')) self.datasets = Table(('project_uuid', 'dataset_uuid')) diff --git a/python/tests/test_workspace_app_routes.py b/python/tests/test_workspace_app_routes.py index 16898b5..cfef8af 100644 --- a/python/tests/test_workspace_app_routes.py +++ b/python/tests/test_workspace_app_routes.py @@ -72,7 +72,7 @@ def test_relocation_requires_local_explicit_paths_and_reports_destination(self): module = types.SimpleNamespace(relocate_project=move) path = '/api/projects/relocate' body = {'directory': '/received/study', 'destination': '/preferred/study'} - with patch.dict('sys.modules', workspace_portability=module): + with patch.dict('sys.modules', workspace_portability=module), patch('workspace_startup_registry.remember_project_path') as remember: self.assertEqual(self.client.post(path, json=body).status_code, 403) self.assertEqual(self.client.post(path, json=body, headers={**self.headers, 'Origin': 'https://foreign.test'}).status_code, 403) self.assertEqual(self.post(path, body, environ_overrides={'REMOTE_ADDR': '192.0.2.1'}).status_code, 403) @@ -85,6 +85,22 @@ def test_relocation_requires_local_explicit_paths_and_reports_destination(self): self.assertEqual(result.json['directory'], '/preferred/study') self.assertTrue(result.json['moved']) move.assert_called_once_with('/received/study', '/preferred/study') + remember.assert_called_once_with('/preferred/study', previous_directory='/received/study') + + def test_verified_restore_registers_exact_destination(self): + restored = {'directory': '/independent/restored study', 'verified': True} + module = types.SimpleNamespace(restore_project=Mock(return_value=restored), prepare_project=Mock()) + with patch.dict('sys.modules', workspace_portability=module), patch('workspace_startup_registry.remember_project_path') as remember: + response = self.post('/api/projects/restore-transfer', {'directory': '/received/copy', + 'destination': '/independent/restored study'}) + path = '/api/projects/transfers/' + response.json['job_id'] + for _ in range(100): + result = self.client.get(path).json + if result['state'] != 'running': + break + time.sleep(.01) + self.assertEqual(result['state'], 'complete') + remember.assert_called_once_with('/independent/restored study') def test_relocation_failure_is_actionable_and_never_reports_success(self): module = types.SimpleNamespace(relocate_project=Mock(side_effect=ValueError('Close the project before moving its folder'))) @@ -94,6 +110,22 @@ def test_relocation_failure_is_actionable_and_never_reports_success(self): self.assertIn('Close the project', result.json['error']) self.assertNotIn('moved', result.json) + def test_completed_restore_is_reported_when_local_index_cannot_save(self): + restored = {'directory': '/completed/restored study', 'verified': True} + module = types.SimpleNamespace(restore_project=Mock(return_value=restored), prepare_project=Mock()) + with patch.dict('sys.modules', workspace_portability=module), patch('workspace_startup_registry.remember_project_path', side_effect=OSError('Profile disk is full')): + response = self.post('/api/projects/restore-transfer', {'directory': '/received/copy', + 'destination': restored['directory']}) + path = '/api/projects/transfers/' + response.json['job_id'] + for _ in range(100): + result = self.client.get(path).json + if result['state'] != 'running': + break + time.sleep(.01) + self.assertEqual(result['state'], 'complete') + self.assertTrue(result['result']['verified']) + self.assertIn('registry_warning', result['result']) + def test_transfer_failure_and_invalid_paths_never_report_success(self): def fail(*args): raise ValueError('Stop the project service first') module = types.SimpleNamespace(prepare_project=fail, restore_project=fail) diff --git a/python/tests/test_workspace_installation.py b/python/tests/test_workspace_installation.py index 7aeee2b..1e78f87 100644 --- a/python/tests/test_workspace_installation.py +++ b/python/tests/test_workspace_installation.py @@ -1,5 +1,6 @@ """Workspace launch contracts, without Docker or installing dependencies.""" import json +import os from pathlib import Path import subprocess import sys @@ -73,6 +74,8 @@ class WorkspaceSelectionTests(unittest.TestCase): def setUp(self): self.temp=tempfile.TemporaryDirectory();self.addCleanup(self.temp.cleanup) self.base=Path(self.temp.name);self.app=self.base/'application';self.app.mkdir() + isolated_index=patch.dict(os.environ,{'RIEKE_PROJECT_INDEX':str(self.base/'user-state/project-index.json')}) + isolated_index.start();self.addCleanup(isolated_index.stop) self.root=self.base/'Research data' def test_select_initializes_preserves_files_and_reuses_existing_workspace(self): diff --git a/python/tests/test_workspace_open_folder.py b/python/tests/test_workspace_open_folder.py index 2e9867d..a5dbc0c 100644 --- a/python/tests/test_workspace_open_folder.py +++ b/python/tests/test_workspace_open_folder.py @@ -1,5 +1,6 @@ """Opening an explicit existing project must never initialize arbitrary folders.""" import json +import os from pathlib import Path import tempfile import unittest @@ -12,6 +13,8 @@ class OpenFolderTests(unittest.TestCase): def setUp(self): self.temp=tempfile.TemporaryDirectory(); self.addCleanup(self.temp.cleanup) self.root=Path(self.temp.name) + index = patch.dict(os.environ, {'RIEKE_PROJECT_INDEX': str(self.root / 'preferences/project-index.json')}) + index.start(); self.addCleanup(index.stop) self.current=self.project('workspace/current') self.other=self.project('other-workspace/other') self.client=create_launcher(self.current.parent,self.root/'parser').test_client() @@ -36,6 +39,39 @@ def test_explicit_other_workspace_opens_exact_project_without_rewriting_manifest opened.assert_called_once_with(self.other.resolve(),identity,self.root/'parser') self.assertEqual(before,{p.name:p.read_bytes() for p in self.other.iterdir()}) + def test_external_open_is_remembered_after_launcher_restart(self): + identity = json.loads((self.other / 'project.json').read_text())['project_uuid'] + with patch('workspace_launcher.open_project', return_value={'url': 'http://127.0.0.1:8877/', 'project_uuid': identity}): + self.assertEqual(self.post(self.other).status_code, 200) + restarted = create_launcher(self.current.parent, self.root / 'parser').test_client() + inventory = restarted.get('/api/projects').get_json() + external = next(project for project in inventory['projects'] if project['path'] == str(self.other.resolve())) + self.assertTrue(external['available']) + self.assertEqual(inventory['last_project_path'], str(self.other.resolve())) + with patch('workspace_launcher.open_project', return_value={'url': 'http://127.0.0.1:8877/', 'project_uuid': identity}) as opened: + response = restarted.post('/api/projects/' + identity + '/open', json={}, headers=self.headers) + self.assertEqual(response.status_code, 200) + opened.assert_called_once_with(self.other.resolve(), identity, self.root / 'parser') + + def test_new_project_at_arbitrary_root_is_indexed_without_parent_workspace(self): + directory = self.root / 'independent' / 'user chosen study' + response = self.client.post('/api/projects', json={'name': 'Independent study', + 'project_directory': str(directory)}, headers=self.headers) + self.assertEqual(response.status_code, 201, response.get_json()) + inventory = create_launcher(self.current.parent, self.root / 'parser').test_client().get('/api/projects').get_json() + self.assertIn(str(directory.resolve()), [project['path'] for project in inventory['projects']]) + self.assertFalse((directory.parent / '.rieke-workspace.json').exists()) + + def test_completed_creation_is_reported_when_local_index_cannot_save(self): + directory = self.root / 'created despite profile error' + with patch('workspace_startup_registry.remember_project_path', side_effect=OSError('Profile disk is full')): + response = self.client.post('/api/projects', json={'name': 'Completed creation', + 'project_directory': str(directory)}, headers=self.headers) + self.assertEqual(response.status_code, 201, response.get_json()) + self.assertEqual(response.get_json()['project']['path'], str(directory.resolve())) + self.assertIn('registry_warning', response.get_json()) + self.assertTrue((directory / 'project.json').is_file()) + def test_invalid_paths_and_bodies_never_start_services(self): empty=self.root/'empty';empty.mkdir() alias=self.root/'alias';alias.symlink_to(self.other,target_is_directory=True) @@ -76,6 +112,28 @@ def test_local_mutation_protection_applies(self): self.assertEqual(self.post(self.other,headers={**self.headers,'Origin':'https://foreign.example'}).status_code,403) opened.assert_not_called() + def test_normal_folder_inspection_detects_received_package_and_requires_restore(self): + import workspace_portability as transfer + package = self.root / 'received-package' + package.mkdir() + project = json.loads((self.other / 'project.json').read_text()) + transfer._write(package / 'project.json', project) + (package / 'database.sql').write_text('-- logical backup fixture\n') + transfer._write(package / transfer.MANIFEST, {'format': transfer.FORMAT, + 'version': 1, 'mode': 'complete', 'database_format': 'mysql8-logical-v1', + 'project_uuid': project['project_uuid'], 'sources': [], 'files': transfer._files(package)}) + before = {p.name: p.read_bytes() for p in package.iterdir()} + with patch('workspace_launcher.open_project') as opened: + response = self.client.post('/api/projects/inspect-folder', + json={'directory': str(package)}, headers=self.headers) + self.assertEqual(response.status_code, 200) + self.assertEqual(response.get_json()['kind'], 'prepared-transfer') + response = self.post(package) + self.assertEqual(response.status_code, 400) + self.assertIn('restore', response.get_json()['error']) + opened.assert_not_called() + self.assertEqual(before, {p.name: p.read_bytes() for p in package.iterdir()}) + def test_explicit_restored_instance_can_open_without_merging_original(self): app=Flask(__name__) register_project_routes(app,retinanalysis_dir=self.root/'parser',project_dir=self.current) diff --git a/python/tests/test_workspace_portability.py b/python/tests/test_workspace_portability.py index 1610382..7fc3c82 100644 --- a/python/tests/test_workspace_portability.py +++ b/python/tests/test_workspace_portability.py @@ -4,9 +4,13 @@ The integration test creates/removes only its own disposable project databases. """ import fcntl +import datetime as dt +from decimal import Decimal import json import os import shutil +import subprocess +import sys from pathlib import Path import tempfile import types @@ -80,6 +84,115 @@ def test_symbolic_links_and_runtime_configuration_are_not_transferable(self): with self.assertRaisesRegex(ValueError, 'runtime files'): transfer.inspect_package(self.package) + def test_non_object_project_and_malformed_database_inventory_are_rejected(self): + transfer._write(self.package / 'project.json', []) + self.seal() + with self.assertRaisesRegex(ValueError, 'identity|format'): + transfer.inspect_package(self.package) + transfer._write(self.package / 'project.json', {'format': 'recording-project', 'version': 1, + 'project_uuid': self.identity, 'name': 'Portable study'}) + for inventory in ([], {'mysql.user': {'rows': 1, 'sha256': 'a' * 64}}, + {'schema.epoch': {'rows': True, 'sha256': 'a' * 64}}, + {'recording_workspace.event': {'rows': 1, 'sha256': None}}): + with self.subTest(inventory=inventory): + self.seal(database_inventory=inventory) + with self.assertRaisesRegex(ValueError, 'database inventory'): + transfer.inspect_package(self.package) + + def test_durable_job_history_is_allowed_but_runtime_logs_are_rejected(self): + for directory in ('logs/imports', 'logs/app-jobs', 'logs/errors', 'logs/storage'): + transfer._write(self.package / directory / 'history.json', {'preserved': directory}) + self.seal() + self.assertEqual(len(transfer.inspect_package(self.package)['files']), 6) + (self.package / 'logs/workspace-server.json').write_text('{"port":12345}') + self.seal() + with self.assertRaisesRegex(ValueError, 'runtime files'): + transfer.inspect_package(self.package) + + def test_restore_rejects_missing_saved_state_before_rewriting_locators(self): + self.seal(database_inventory={'recording_workspace.search_preset': + {'rows': 2, 'sha256': 'a' * 64}}) + destination = self.root / 'missing-history' + with patch('workspace_project_database.ensure_project_database'), \ + patch.object(transfer, '_import'), \ + patch.object(transfer, '_connection', return_value=MagicMock()), \ + patch.object(transfer, '_database_inventory', return_value={}), \ + patch.object(transfer, '_sources') as sources, \ + patch.object(transfer, '_remove_runtime') as cleanup: + with self.assertRaisesRegex(ValueError, 'database content'): + transfer.restore_project(self.package, destination) + sources.assert_not_called() + cleanup.assert_called_once_with(destination) + self.assertFalse(destination.exists()) + + def test_empty_registration_never_reconstructs_populated_or_foreign_projects(self): + project = create_project(self.root / 'workspace', 'New project') + root = Path(project['path']) + for tables, identities, row in ( + ([('recording_workspace', 'project')], [(str(uuid.uuid4()),)], None), + ([('recording_workspace', 'project'), ('schema', 'epoch')], [], (1,)), + ([('recording_workspace', 'project'), ('recording_workspace', 'source')], [], (1,))): + connection = MagicMock() + cursor = connection.cursor.return_value.__enter__.return_value + cursor.fetchall.side_effect = [tables, identities] + cursor.fetchone.return_value = row + with self.subTest(tables=tables, identities=identities), self.assertRaisesRegex(ValueError, 'identity'): + transfer.register_empty_project(root, connection) + self.assertFalse(any(call.args[0].startswith(('CREATE', 'INSERT')) for call in cursor.execute.call_args_list)) + transfer._write(root / 'imports/registered.json', {'scientific': 'cannot reconstruct'}) + connection = MagicMock() + connection.cursor.return_value.__enter__.return_value.fetchall.return_value = [] + with self.assertRaisesRegex(ValueError, 'populated project'): + transfer.register_empty_project(root, connection) + + def test_external_h5_dependencies_cannot_claim_complete_transfer(self): + import h5py + recording = self.package / 'raw-uploads/linked.h5' + recording.parent.mkdir() + with h5py.File(recording, 'w') as handle: + handle['donor'] = h5py.ExternalLink('missing-donor.h5', '/waveform') + metadata = self.package / 'imports/source/metadata.catalog.json' + transfer._write(metadata, {'fixture': 'metadata'}) + sha = transfer._hash(recording) + self.seal(sources=[{'source_sha256': sha, + 'recording_ref': recording.relative_to(self.package).as_posix(), + 'metadata_ref': metadata.relative_to(self.package).as_posix(), + 'metadata_sha256': transfer._hash(metadata)}]) + with patch('workspace_project_database.ensure_project_database') as runtime: + with self.assertRaisesRegex(ValueError, 'External H5 links'): + transfer.restore_project(self.package, self.root / 'external-dependent') + runtime.assert_not_called() + self.assertFalse((self.root / 'external-dependent').exists()) + + def test_received_preferences_are_validated_before_database_start(self): + from workspace_project_preferences import ProjectPreferences, REFERENCE + preferences = ProjectPreferences(self.package, self.identity).read() + preferences['project_uuid'] = str(uuid.uuid4()) + transfer._write(self.package / REFERENCE, preferences) + self.seal() + with patch('workspace_project_database.ensure_project_database') as runtime: + with self.assertRaisesRegex(ValueError, 'preference file|identity'): + transfer.restore_project(self.package, self.root / 'foreign-preferences') + runtime.assert_not_called() + self.assertFalse((self.root / 'foreign-preferences').exists()) + + def test_complete_source_requires_valid_checksum_and_included_metadata(self): + import h5py + recording = self.package / 'raw-uploads/source.h5' + recording.parent.mkdir() + with h5py.File(recording, 'w') as handle: + handle.create_dataset('samples', data=[0.25, -2.0]) + source = {'source_sha256': transfer._hash(recording), + 'recording_ref': 'raw-uploads/source.h5', 'metadata_ref': 'imports/absent.json'} + for checksum in (None, '', 'a' * 64): + with self.subTest(checksum=checksum): + self.seal(sources=[{**source, 'metadata_sha256': checksum}]) + with patch('workspace_project_database.ensure_project_database') as runtime: + with self.assertRaisesRegex(ValueError, 'metadata checksum|missing a registered source dependency'): + transfer.restore_project(self.package, self.root / 'missing-metadata') + runtime.assert_not_called() + self.assertFalse((self.root / 'missing-metadata').exists()) + def test_existing_destination_is_never_overwritten(self): destination = self.root / 'existing' destination.mkdir() @@ -248,6 +361,35 @@ def test_foreign_project_and_external_artifact_refs_are_rejected(self): class NativeTransferCommandTests(unittest.TestCase): + def test_database_inventory_compares_every_row_independent_of_order_and_json_spacing(self): + from pymysql.cursors import SSCursor + + def inventory(rows): + connection, metadata, data = MagicMock(), MagicMock(), MagicMock() + metadata.__enter__.return_value = metadata + data.__enter__.return_value = data + metadata.fetchall.side_effect = [[('recording_workspace', 'search_preset_version')], + [('version', 'int'), ('recipe', 'json'), ('fingerprint', 'blob'), + ('created_at', 'datetime'), ('value', 'decimal(8,2)')]] + data.fetchmany.side_effect = [rows, []] + connection.cursor.side_effect = lambda kind=None: data if kind is SSCursor else metadata + result = transfer._database_inventory(connection) + data.execute.assert_called_once_with('SELECT * FROM `recording_workspace`.`search_preset_version`') + self.assertEqual(data.fetchmany.call_args.args, (1000,)) + return result + + date = dt.datetime(2026, 9, 29, 12, 30) + first = (1, '{"predicate": {"all":[]}, "tag":"kept"}', b'\x00\xff', date, Decimal('1.25')) + second = (2, '{"tag":"kept","predicate":{"all":[]}}', b'\x00\xff', date, Decimal('1.25')) + baseline = inventory([first, second]) + respaced = (1, '{"tag":"kept","predicate":{"all":[]}}', b'\x00\xff', date, Decimal('1.25')) + self.assertEqual(baseline, inventory([second, respaced])) + self.assertEqual(baseline['recording_workspace.search_preset_version']['rows'], 2) + changed = (1, '{"tag":"lost"}', b'\x00\xff', date, Decimal('1.25')) + self.assertNotEqual(baseline, inventory([changed, second])) + self.assertNotEqual(baseline, inventory([first])) + self.assertNotEqual(baseline, inventory([first, first])) + def test_native_catalog_never_carries_donor_runtime_or_credentials(self): identity, instance = str(uuid.uuid4()), str(uuid.uuid4()) catalog = transfer._catalog(identity, instance) @@ -302,6 +444,48 @@ def run(arguments, **options): @unittest.skipUnless(os.environ.get('RIEKE_TEST_NATIVE_TRANSFER') == '1', 'opt-in disposable native MySQL integration') class NativeRoundTripTests(unittest.TestCase): + def test_new_empty_projects_open_close_prepare_and_restore(self): + from workspace_project_database import ensure_project_database + open_app = """ +import sys +from workspace_api import create_app +app = create_app(sys.argv[1], sys.argv[2]) +response = app.test_client().get('/api/overview') +assert response.status_code == 200, response.get_json() +assert not app.extensions['workspace_service'].rows +""" + with tempfile.TemporaryDirectory(prefix='rieke-empty-transfer-test-') as temporary: + base = Path(temporary).resolve() + code = Path(__file__).resolve().parents[2] + def open_empty(path): + result = subprocess.run([sys.executable, '-c', open_app, str(path), str(code / '.rieke-runtime/retinanalysis')], + capture_output=True, text=True, timeout=60) + self.assertEqual(result.returncode, 0, result.stdout + '\n' + result.stderr) + for opened in (False, True): + project = create_project(base / ('workspace-' + str(opened)), 'New empty project') + root, identity = Path(project['path']), project['uuid'] + runtimes = [root] + try: + if opened: + ensure_project_database(root) + open_empty(root) + transfer._remove_runtime(root) + prepared = transfer.prepare_project(root, base / ('package-' + str(opened))) + self.assertEqual(prepared['source_count'], 0) + self.assertTrue(prepared['verified']) + transfer._remove_runtime(root) + shutil.rmtree(root) + destination = base / ('recipient-' + str(opened)) + received = transfer.restore_project(prepared['directory'], destination) + runtimes = [destination] + self.assertEqual(received['project_uuid'], identity) + self.assertEqual(received['source_count'], 0) + open_empty(destination) + finally: + for runtime in runtimes: + if runtime.exists(): + transfer._remove_runtime(runtime) + def save_export(self, connection, root, identity): # Match the production DatasetRevision fields; the locator is mutable, # while recipe and exported bytes are frozen scientific evidence. diff --git a/python/tests/test_workspace_portability_app.py b/python/tests/test_workspace_portability_app.py new file mode 100644 index 0000000..5d28dc2 --- /dev/null +++ b/python/tests/test_workspace_portability_app.py @@ -0,0 +1,140 @@ +"""Opt-in production API roundtrip with a real Symphony H5 fixture. + +Set RIEKE_TEST_PORTABLE_APP=1 and RIEKE_PORTABILITY_H5=/path/to/recording.h5. +All writes target disposable projects; the supplied recording is read only. +""" +import json +import os +from pathlib import Path +import shutil +import subprocess +import sys +import tempfile +import unittest + +import workspace_portability as transfer +from workspace_projects import create_project_at +from workspace_project_database import ensure_project_database +from workspace_recording_files import retain_recording + + +API_CHECK = r''' +import json, sys, uuid +from pathlib import Path +from workspace_api import create_app +root, parser, receipt, mode = map(str, sys.argv[1:]) +if mode == 'seed': + from recording_workspace import write_json + write_json(Path(root) / 'logs/app-jobs' / (str(uuid.uuid4()) + '.json'), + {'status': 'failed', 'source': '/historical/sender/failed.h5', + 'error': 'Preserved diagnostic fixture', 'started_at': '2026-09-29T01:00:00+00:00', + 'finished_at': '2026-09-29T01:00:02+00:00', 'catalog_committed': False}) +app = create_app(root, parser) +client = app.test_client() +headers = {'X-Workspace-Request': '1'} +def request(path, body=None, method='GET'): + response = client.open('/api/' + path, method=method, json=body, headers=headers) + assert response.status_code < 300, (path, response.status_code, response.get_json()) + payload = response.get_json() + if path == 'jobs': + for job in payload['jobs']: + job.pop('heartbeat_at', None) + return payload +service = app.extensions['workspace_service'] +if mode == 'seed': + row = next(row for row in service.rows.values() if row['streams']) + predicate = {'field': 'epoch', 'operator': 'eq', 'value': row['epoch_uuid']} + recipe = {'name': 'Portable audit query', 'description': 'Recipient reproduction check', + 'predicate': predicate, 'splits': 'cell', 'pinned': True} + preset = request('search-presets', recipe, 'POST') + request('search-presets/' + preset['preset_uuid'], + {**recipe, 'name': 'Portable audit query v2', 'expected_version': 1}, 'PUT') + request('explore/run', {'predicate': predicate, 'splits': 'cell'}, 'POST') + revision = request('explore/revisions', + {'predicate': predicate, 'splits': 'cell', 'name': 'Portable audit baseline'}, 'POST') + profile = request('annotation-profiles', {'display_name': 'Portable audit author'}, 'POST') + request('annotations', {'target_kind': 'epoch', 'target_uuids': [row['epoch_uuid']], + 'profile_uuid': profile['profile_uuid'], 'tags_add': ['portable-audit'], + 'expected_revisions': {row['epoch_uuid']: 0}}, 'POST') + protocol = next(identity for identity in service.protocols + if row['epoch_uuid'] in service.fingerprints(identity)) + detail = request('protocols/' + protocol) + request('protocols/' + protocol + '/curation', + {'epoch_uuids': [row['epoch_uuid']], 'changes': {'included': False, 'review_state': 'approved'}, + 'expected_revisions': {row['epoch_uuid']: 0}, 'query_revision': detail['query_revision']}, 'POST') + request('protocols/' + protocol + '/tree-layout', + {'split_order': ['cell', 'block'], 'expected_version': 0}, 'PUT') + request('project-preferences', + {'field': 'recent_searches', 'value': [{'id': 'portable-audit-search', + 'name': 'Portable audit recent search', 'predicate': predicate, 'splits': 'cell', + 'pinned': True, 'matched_count': 1, 'cell_count': 1}], 'expected_revision': 0}, 'PUT') + request('project-preferences', + {'field': 'protocol_shortcuts', 'value': {protocol: {'section': 'pinned', 'rank': 0}}, + 'expected_revision': 0}, 'PUT') + endpoints = ['search-presets', 'search-presets/' + preset['preset_uuid'] + '/versions', + 'explore/revisions/' + revision['revision_uuid'], + 'epochs/' + row['epoch_uuid'] + '/annotations', 'annotation-profiles', + 'events?limit=100', 'jobs', 'project-preferences', 'protocols/' + protocol + '/masks/export', + 'protocols/' + protocol + '/tree-layout', + 'epochs/' + row['epoch_uuid'] + '/trace?stream_uuid=' + row['streams'][0]['uuid'] + '&start=3&count=16'] + expected = {'project_uuid': service.project['project_uuid'], 'epochs': len(service.rows), + 'protocols': sorted(service.protocols), + 'responses': {endpoint: request(endpoint) for endpoint in endpoints}} + Path(receipt).write_text(json.dumps(expected)) +else: + expected = json.loads(Path(receipt).read_text()) + assert service.project['project_uuid'] == expected['project_uuid'] + assert len(service.rows) == expected['epochs'] + assert sorted(service.protocols) == expected['protocols'] + for endpoint, payload in expected['responses'].items(): + assert request(endpoint) == payload, endpoint + assert all(Path(manifest['source_path']).is_relative_to(Path(root)) + and Path(manifest['metadata_path']).is_relative_to(Path(root)) + for manifest in service.manifests.values()) + request('overview') + print('Recipient production API state and waveform checks passed', flush=True) +app.extensions['app_state_session_lock'].close() +service.dj.conn().close() +''' + + +@unittest.skipUnless(os.environ.get('RIEKE_TEST_PORTABLE_APP') == '1', + 'opt-in production API/native MySQL integration') +class PortableAppTests(unittest.TestCase): + def test_recipient_opens_all_saved_scientific_state_without_donor(self): + source = Path(os.environ['RIEKE_PORTABILITY_H5']).expanduser().resolve(strict=True) + code = Path(__file__).resolve().parents[2] + parser = code / '.rieke-runtime/retinanalysis' + with tempfile.TemporaryDirectory(prefix='rieke-portable-app-') as temporary: + base = Path(temporary).resolve() + root, restored = base / 'donor', base / 'recipient' + create_project_at(str(root), 'Production portability audit') + runtimes = [root] + try: + ensure_project_database(root) + managed = retain_recording(root, source, transfer._hash(source)) + env = {**os.environ, 'PYTHONPATH': str(code / 'python')} + self.run_checked([sys.executable, str(code / 'python/recording_workspace.py'), + str(managed), '--project-dir', str(root), '--retinanalysis', str(parser)], env) + receipt = base / 'expected.json' + self.run_checked([sys.executable, '-c', API_CHECK, str(root), str(parser), str(receipt), 'seed'], env) + prepared = transfer.prepare_project(root, base / 'portable-package') + self.assertTrue(prepared['verified']) + transfer._remove_runtime(root) + shutil.rmtree(root) + runtimes.remove(root) + received = transfer.restore_project(prepared['directory'], restored) + runtimes.append(restored) + self.assertTrue(received['verified']) + self.run_checked([sys.executable, '-c', API_CHECK, str(restored), str(parser), str(receipt), 'check'], env) + finally: + for runtime in runtimes: + transfer._remove_runtime(runtime) + + def run_checked(self, command, env): + result = subprocess.run(command, env=env, capture_output=True, text=True, timeout=240) + self.assertEqual(result.returncode, 0, result.stdout[-8000:] + result.stderr[-8000:]) + + +if __name__ == '__main__': + unittest.main() diff --git a/python/tests/test_workspace_project_preferences.py b/python/tests/test_workspace_project_preferences.py new file mode 100644 index 0000000..7316599 --- /dev/null +++ b/python/tests/test_workspace_project_preferences.py @@ -0,0 +1,95 @@ +import json +from pathlib import Path +import shutil +import tempfile +import threading +import unittest +import uuid + +from flask import Flask +from workspace_project_preferences import ProjectPreferences, PreferenceConflict, REFERENCE, register_project_preference_routes + + +class PortablePreferenceTests(unittest.TestCase): + def setUp(self): + self.temp = tempfile.TemporaryDirectory() + self.addCleanup(self.temp.cleanup) + self.root = Path(self.temp.name) / 'donor' + self.root.mkdir() + self.identity = str(uuid.uuid4()) + self.store = ProjectPreferences(self.root, self.identity) + self.protocol = str(uuid.uuid4()) + self.pins = {self.protocol: {'section': 'pinned', 'rank': 0}} + self.search = {'id': 'query', 'name': 'History noise', 'predicate': + {'field': 'protocol', 'operator': 'contains', 'value': 'History'}, + 'splits': 'date,cell', 'pinned': True, 'matched_count': 8, 'cell_count': 2, + 'lastRunAt': '2026-09-29T20:00:00Z'} + + def test_copy_preserves_search_and_sidebar_without_browser_or_sql(self): + self.store.save('recent_searches', [self.search], 0) + saved = self.store.save('protocol_shortcuts', self.pins, 0) + recipient = self.root.parent / 'recipient' + shutil.copytree(self.root, recipient) + shutil.rmtree(self.root) + reopened = ProjectPreferences(recipient, self.identity) + self.assertEqual(reopened.read(), saved) + self.assertEqual(saved['state']['recent_searches'], [self.search]) + self.assertEqual(saved['state']['protocol_shortcuts'], self.pins) + self.assertFalse(list((recipient / 'protocols').glob('*.json'))) + + def test_disjoint_updates_do_not_conflict_and_stale_same_field_refused(self): + saved = self.store.save('recent_searches', [self.search], 0) + self.assertEqual(saved['revisions']['recent_searches'], 1) + other = self.store.save('protocol_shortcuts', self.pins, 0) + self.assertEqual(other['state']['recent_searches'], [self.search]) + before = (self.root / REFERENCE).read_bytes() + with self.assertRaises(PreferenceConflict): + self.store.save('recent_searches', [], 0) + self.assertEqual((self.root / REFERENCE).read_bytes(), before) + self.assertEqual(self.store.save('recent_searches', [self.search], 1)['revisions']['recent_searches'], 1) + + def test_bad_shapes_and_future_or_foreign_files_cannot_replace_state(self): + self.store.save('recent_searches', [self.search], 0) + path = self.root / REFERENCE + before = path.read_bytes() + for field, value in [('protocol_shortcuts', {self.protocol: {'section': 'unknown', 'rank': 0}}), + ('protocol_shortcuts', {'not-a-uuid': {'section': 'main', 'rank': 0}}), + ('protocol_shortcuts', {self.protocol: {'section': 'main', 'rank': True}}), + ('recent_searches', [dict(self.search, cell_count=True)]), + ('recent_searches', [dict(self.search, predicate={'field': 'protocol', 'operator': 'execute', 'value': 'x'})]), + ('recent_searches', [self.search, self.search]), + ('pane_width', 900)]: + with self.subTest(field=field, value=value): + with self.assertRaises(ValueError): + self.store.save(field, value, 0) + self.assertEqual(path.read_bytes(), before) + for changes in ({'version': 2}, {'version': True}, {'project_uuid': str(uuid.uuid4())}): + value = json.loads(before) + value.update(changes) + path.write_text(json.dumps(value)) + with self.assertRaises(ValueError): + self.store.save('protocol_shortcuts', self.pins, 0) + self.assertEqual(json.loads(path.read_text()), value) + + def test_preference_symlinks_are_never_followed(self): + target = self.root.parent / 'outside' + target.mkdir() + (self.root / 'protocols').symlink_to(target) + with self.assertRaisesRegex(ValueError, 'symbolic'): + self.store.save('recent_searches', [self.search], 0) + self.assertEqual(list(target.iterdir()), []) + + def test_routes_expose_only_project_fields_with_conflict_status(self): + app = Flask(__name__) + register_project_preference_routes(app, self.root, self.identity, threading.RLock()) + client = app.test_client() + self.assertEqual(client.get('/api/project-preferences').json['state'], {}) + body = dict(field='recent_searches', value=[self.search], expected_revision=0) + self.assertEqual(client.put('/api/project-preferences', json=body).status_code, 200) + self.assertEqual(client.put('/api/project-preferences', json=body).status_code, 409) + self.assertEqual(client.put('/api/project-preferences', json={**body, 'field': 'port'}).status_code, 400) + self.assertEqual(client.get('/api/project-preferences?directory=/other').status_code, 400) + + +if __name__ == '__main__': + unittest.main() diff --git a/python/tests/test_workspace_project_servers.py b/python/tests/test_workspace_project_servers.py index 4d76378..6bfec0c 100644 --- a/python/tests/test_workspace_project_servers.py +++ b/python/tests/test_workspace_project_servers.py @@ -1,5 +1,6 @@ import io import json +import os import socket from pathlib import Path import tempfile @@ -15,6 +16,9 @@ def setUp(self): self.temp = tempfile.TemporaryDirectory() self.addCleanup(self.temp.cleanup) self.path = Path(self.temp.name) / 'project' + index = patch.dict(os.environ, {'RIEKE_PROJECT_INDEX': str(Path(self.temp.name) / 'preferences/project-index.json')}) + index.start() + self.addCleanup(index.stop) self.path.mkdir() bootstrap = patch('workspace_project_database.ensure_project_database') bootstrap.start() @@ -94,6 +98,20 @@ def test_existing_process_reused_without_spawn(self): self.assertEqual(result['project_uuid'], self.identity) spawn.assert_not_called() + def test_explicit_folder_wins_over_same_identity_native_copy(self): + copy = self.path.parent / 'copy' + copy.mkdir() + project = json.loads((self.path / 'project.json').read_text()) + project['name'] = 'A copy sorted before the selected project' + (copy / 'project.json').write_text(json.dumps(project)) + for directory in (self.path, copy): + catalog = json.loads((self.path / 'catalog.json').read_text()) + catalog['managed_database'] = {'kind': 'native-mysql'} + (directory / 'catalog.json').write_text(json.dumps(catalog)) + with patch('workspace_project_servers.ready_url', return_value='http://127.0.0.1:8877/') as ready: + open_project(self.path, self.identity, self.path) + ready.assert_called_once_with(self.path.resolve(), self.identity) + def test_copied_server_record_never_reuses_original_service(self): write_server_record(self.path,self.identity,8877) record=self.path/'logs/workspace-server.json' diff --git a/python/tests/test_workspace_project_validation.py b/python/tests/test_workspace_project_validation.py index 591f7c7..60d2b44 100644 --- a/python/tests/test_workspace_project_validation.py +++ b/python/tests/test_workspace_project_validation.py @@ -4,8 +4,8 @@ import unittest from unittest.mock import patch -from workspace_projects import create_project -from workspace_project_validation import validate_project_folder +from workspace_projects import create_project, create_project_at +from workspace_project_validation import inspect_project_folder, validate_project_folder class ProjectValidationTests(unittest.TestCase): @@ -33,6 +33,42 @@ def test_new_project_validation_does_not_create_or_modify_files(self): self.assertEqual(before, after) self.assertEqual(result['database_status'], 'not_initialized') self.assertEqual(result['project']['uuid'], self.record['uuid']) + self.assertEqual(inspect_project_folder(self.root)['kind'], 'project') + + def prepared(self): + import workspace_portability as transfer + package = Path(self.temp.name) / 'received package' + package.mkdir() + (package / 'project.json').write_text((self.root / 'project.json').read_text()) + (package / 'database.sql').write_text('-- logical backup fixture\n') + transfer._write(package / transfer.MANIFEST, { + 'format': transfer.FORMAT, 'version': 1, 'mode': 'complete', + 'database_format': 'mysql8-logical-v1', 'project_uuid': self.record['uuid'], + 'sources': [], 'files': transfer._files(package)}) + return package + + def test_prepared_copy_is_recognized_without_runtime_or_file_changes(self): + package = self.prepared() + before = {p.name: p.read_bytes() for p in package.iterdir()} + with patch('workspace_project_database.ensure_project_database', side_effect=AssertionError('No server')): + result = inspect_project_folder(package) + self.assertEqual(result['kind'], 'prepared-transfer') + self.assertEqual(result['database_status'], 'restore_required') + self.assertEqual(result['project']['uuid'], self.record['uuid']) + self.assertEqual(result['project']['name'], 'Validation') + self.assertEqual(result['source_count'], 0) + self.assertEqual(before, {p.name: p.read_bytes() for p in package.iterdir()}) + + def test_corrupt_received_copy_is_not_offered_as_an_openable_project(self): + package = self.prepared() + (package / 'database.sql').write_text('corrupt') + with self.assertRaisesRegex(ValueError, 'checksum|inventory'): + inspect_project_folder(package) + + def test_received_manifest_cannot_bypass_validation_with_project_catalog(self): + (self.root / 'transfer.json').write_text('{"format":"future","version":2}') + with self.assertRaisesRegex(ValueError, 'Unsupported prepared project'): + inspect_project_folder(self.root) def test_initialized_project_never_returns_credentials_or_chmods(self): self.initialized() @@ -93,6 +129,89 @@ def test_manifest_identity_mismatch_and_project_symlink_are_rejected(self): with self.assertRaisesRegex(ValueError, 'UUIDs do not match'): validate_project_folder(self.root) + def test_nested_selection_suggests_closest_root_without_opening_or_changes(self): + before = {str(p): (p.read_bytes(), p.stat().st_mode) for p in self.root.rglob('*') if p.is_file()} + with patch('workspace_project_database.ensure_project_database', side_effect=AssertionError('No server')): + result = inspect_project_folder(self.root / 'logs/imports') + self.assertFalse(result['valid']) + self.assertEqual(result['kind'], 'project-root-suggestions') + self.assertEqual(result['candidates'], [{'path': str(self.root), 'name': 'Validation', + 'kind': 'project', 'reason': 'containing-project'}]) + after = {str(p): (p.read_bytes(), p.stat().st_mode) for p in self.root.rglob('*') if p.is_file()} + self.assertEqual(before, after) + + def test_parent_with_several_projects_suggests_all_immediate_valid_roots(self): + second = create_project_at(str(self.root.parent / 'Exact second project'), 'Second project') + broken = self.root.parent / 'broken project' + broken.mkdir() + (broken / 'project.json').write_text('{"format":"unknown"}') + (self.root.parent / 'project alias').symlink_to(self.root, target_is_directory=True) + with patch('workspace_project_database.ensure_project_database', side_effect=AssertionError('No server')): + result = inspect_project_folder(self.root.parent) + self.assertFalse(result['valid']) + self.assertEqual(result['kind'], 'project-root-suggestions') + paths = {value['path'] for value in result['candidates']} + self.assertEqual(paths, {str(self.root), second['path']}) + self.assertTrue(all(value['reason'] == 'child-project' for value in result['candidates'])) + self.assertIn('Several projects', result['message']) + + def test_prepared_root_suggestions_validate_complete_inventory(self): + package = self.prepared().resolve() + nested = package / 'protocols' + nested.mkdir() + result = inspect_project_folder(nested) + self.assertEqual(result['candidates'][0]['path'], str(package)) + self.assertEqual(result['candidates'][0]['kind'], 'prepared-transfer') + (package / 'database.sql').write_text('corrupt') + with self.assertRaisesRegex(ValueError, 'project.json'): + inspect_project_folder(nested) + + def test_no_recursive_child_scan_or_automatic_choice(self): + selected = Path(self.temp.name).resolve() / 'Parent selected by user' + selected.mkdir() + deeper = selected / 'one folder down' + deeper.mkdir() + create_project_at(str(deeper / 'too deep'), 'Not an immediate child') + with self.assertRaisesRegex(ValueError, 'project.json'): + inspect_project_folder(selected) + create_project_at(str(selected / 'correct root'), 'One direct child') + result = inspect_project_folder(selected) + self.assertFalse(result['valid']) + self.assertEqual(len(result['candidates']), 1) + self.assertEqual(result['candidates'][0]['path'], str(selected / 'correct root')) + + def test_selected_project_can_live_far_outside_preferred_parent(self): + exact = Path(self.temp.name).resolve() / 'Research drives/2026/North lab/My chosen top folder' + exact.parent.mkdir(parents=True) + project = create_project_at(str(exact), 'Independent project') + with patch.dict('os.environ', {'RECORDING_WORKSPACE_ROOT': str(self.root.parent)}): + report = inspect_project_folder(exact) + nested = inspect_project_folder(exact / 'imports') + self.assertEqual(report['kind'], 'project') + self.assertEqual(report['project']['path'], str(exact)) + self.assertEqual(report['project']['uuid'], project['uuid']) + self.assertEqual(nested['candidates'][0]['path'], str(exact)) + + def test_selected_alias_and_alias_children_are_never_suggested(self): + selected = Path(self.temp.name).resolve() / 'only aliases' + selected.mkdir() + alias = selected / 'alias' + alias.symlink_to(self.root, target_is_directory=True) + with self.assertRaisesRegex(ValueError, 'symbolic link'): + inspect_project_folder(alias) + with self.assertRaisesRegex(ValueError, 'project.json'): + inspect_project_folder(selected) + with self.assertRaisesRegex(ValueError, 'project.json'): + inspect_project_folder(alias / 'imports') + + def test_ancestor_search_is_bounded(self): + selected = self.root / 'logs' + for index in range(9): + selected = selected / ('nested-' + str(index)) + selected.mkdir(parents=True) + with self.assertRaisesRegex(ValueError, 'project.json'): + inspect_project_folder(selected) + if __name__ == '__main__': unittest.main() diff --git a/python/tests/test_workspace_projects.py b/python/tests/test_workspace_projects.py index ff369c9..aac3430 100644 --- a/python/tests/test_workspace_projects.py +++ b/python/tests/test_workspace_projects.py @@ -1,8 +1,10 @@ import json +import os from pathlib import Path import tempfile import unittest import uuid +from unittest.mock import patch from workspace_projects import list_projects, MANIFEST_LIMIT @@ -12,6 +14,9 @@ def setUp(self): self.temp = tempfile.TemporaryDirectory() self.addCleanup(self.temp.cleanup) self.root = Path(self.temp.name) + isolated_index = patch.dict(os.environ, {'RIEKE_PROJECT_INDEX': str(self.root / '.user-state/project-index.json')}) + isolated_index.start() + self.addCleanup(isolated_index.stop) self.current = self.make_project('current', 'Current project') def make_project(self, folder, name, identity=None, display_name=None): @@ -90,10 +95,11 @@ def test_order_route_accepts_only_a_complete_validated_folder_list(self): result = client.post('/api/projects/order', json={'paths': paths}) self.assertEqual(result.status_code, 200, result.get_json()) self.assertEqual([row['path'] for row in result.get_json()['projects']], paths) - before = (self.root / '.rieke-os.json').read_text() + from workspace_startup_registry import project_index_path + before = project_index_path().read_text() for invalid in [paths[:1], [paths[0], paths[0]], paths + ['/outside'], 'bad', [1], None]: self.assertEqual(client.post('/api/projects/order', json={'paths': invalid}).status_code, 400) - self.assertEqual((self.root / '.rieke-os.json').read_text(), before) + self.assertEqual(project_index_path().read_text(), before) def test_only_valid_immediate_siblings_are_discovered(self): self.make_project('container/nested', 'Nested project') @@ -163,6 +169,93 @@ def test_boolean_versions_and_oversized_manifests_are_rejected(self): (oversized / 'catalog.json').write_text(' ' * (MANIFEST_LIMIT + 1)) self.assertEqual(len(list_projects(self.current)['projects']), 1) + def test_remembered_external_root_survives_preferred_root_changes_without_scanning_neighbors(self): + from workspace_projects import list_managed_projects + from workspace_startup_registry import remember_project_path + outside = self.make_project('outside/selected', 'External study') + self.make_project('outside/not-selected', 'Unremembered neighbor') + saved = remember_project_path(outside.resolve(), set_last=True) + self.assertEqual(saved['last_project_path'], str(outside.resolve())) + before = (outside / 'project.json').read_bytes() + for preferred in [self.root / 'empty-preferred', self.root / 'another-preferred']: + result = list_managed_projects(preferred) + self.assertFalse(preferred.exists()) + self.assertEqual([project['path'] for project in result['projects']], [str(outside.resolve())]) + self.assertEqual(result['last_project_path'], str(outside.resolve())) + self.assertEqual(result['last_project_uuid'], saved['projects'][0]['project_uuid']) + result = list_projects(self.current) + self.assertEqual({project['name'] for project in result['projects']}, {'Current project', 'External study'}) + self.assertEqual((outside / 'project.json').read_bytes(), before) + self.assertNotIn('password', json.dumps(saved)) + self.assertFalse((outside.parent / '.rieke-os.json').exists()) + + def test_missing_corrupt_or_repurposed_remembered_folder_remains_visible_unavailable(self): + from workspace_projects import list_managed_projects + from workspace_startup_registry import remember_project_path + outside = self.make_project('outside/selected', 'External study') + saved = remember_project_path(outside.resolve())['projects'][0] + manifest = (outside / 'project.json').read_text() + for content in ['not json', json.dumps({**json.loads(manifest), 'project_uuid': str(uuid.uuid4())})]: + (outside / 'project.json').write_text(content) + project = list_managed_projects(self.root / 'preferred')['projects'][0] + self.assertFalse(project['available']) + self.assertEqual(project['uuid'], saved['project_uuid']) + self.assertEqual(project['name'], 'External study') + (outside / 'project.json').unlink() + (outside / 'catalog.json').unlink() + outside.rmdir() + project = list_managed_projects(self.root / 'preferred')['projects'][0] + self.assertFalse(project['available']) + self.assertIn('reconnect', project['unavailable_reason']) + + def test_native_external_copies_keep_path_identity_recent_and_global_order(self): + from workspace_projects import create_project_at, list_managed_projects + from workspace_startup_registry import remember_project_path, remember_project_paths_order + first = create_project_at(str(self.root / 'elsewhere/first'), 'Same study') + second = self.root / 'other/copy' + import shutil + second.parent.mkdir() + shutil.copytree(first['path'], second) + remember_project_path(first['path'], set_last=True) + remember_project_path(second.resolve(), set_last=True) + paths = [str(second.resolve()), first['path']] + remember_project_paths_order(paths) + inventory = list_managed_projects(self.root / 'unrelated') + self.assertEqual([project['path'] for project in inventory['projects']], paths) + self.assertEqual({project['uuid'] for project in inventory['projects']}, {first['uuid']}) + self.assertEqual(inventory['last_project_path'], str(second.resolve())) + self.assertEqual(inventory['last_project_uuid'], first['uuid']) + self.assertEqual([project['path'] for project in list_projects(Path(first['path']))['projects']], paths) + self.assertFalse((self.root / 'elsewhere/.project-create.lock').exists()) + self.assertFalse((self.root / 'elsewhere/.rieke-os.json').exists()) + + def test_relocation_updates_only_local_reference_and_current_recent_path(self): + from workspace_projects import list_managed_projects + from workspace_startup_registry import remember_project_path, remember_project_paths_order, read_project_index + outside = self.make_project('outside/selected', 'External study') + remember_project_path(outside.resolve(), set_last=True) + remember_project_paths_order([str(outside.resolve())]) + moved = self.root / 'moved' + previous = outside.resolve() + outside.rename(moved) + remember_project_path(moved.resolve(), previous_directory=previous) + index = read_project_index() + self.assertEqual([project['path'] for project in index['projects']], [str(moved.resolve())]) + self.assertEqual(index['last_project_path'], str(moved.resolve())) + self.assertEqual(index['project_order'], [str(moved.resolve())]) + self.assertEqual(len(list_managed_projects(self.root)['projects']), 2) + + def test_prepared_packages_are_not_live_selectable_or_remembered_projects(self): + from workspace_projects import list_managed_projects + from workspace_startup_registry import remember_project_path, project_index_path + package = self.make_project('received', 'Prepared study') + (package / 'transfer.json').write_text('{}') + self.assertEqual(len(list_managed_projects(self.root)['projects']), 1) + self.assertEqual(len(list_projects(self.current)['projects']), 1) + with self.assertRaisesRegex(ValueError, 'restored'): + remember_project_path(package.resolve()) + self.assertFalse(project_index_path().exists()) + if __name__ == '__main__': unittest.main() diff --git a/python/tests/test_workspace_startup.py b/python/tests/test_workspace_startup.py index 2eb010e..0b092b1 100644 --- a/python/tests/test_workspace_startup.py +++ b/python/tests/test_workspace_startup.py @@ -1,4 +1,5 @@ import json +import os from pathlib import Path import tempfile import unittest @@ -16,6 +17,8 @@ def setUp(self): self.temp=tempfile.TemporaryDirectory() self.addCleanup(self.temp.cleanup) self.root=Path(self.temp.name)/'managed' + isolated_index=patch.dict(os.environ,{'RIEKE_PROJECT_INDEX':str(Path(self.temp.name)/'user-state/project-index.json')}) + isolated_index.start();self.addCleanup(isolated_index.stop) native_start=patch('workspace_native_mysql.ensure_native_database',side_effect=AssertionError('Unit startup tests must not start a native server')) native_start.start();self.addCleanup(native_start.stop) @@ -148,7 +151,8 @@ def test_open_route_passes_uuid_and_remains_separate_from_creation(self): self.assertEqual(response.status_code,200) self.assertEqual(response.get_json(),expected) self.assertEqual(opened.call_args.args[1],project['uuid']) - self.assertTrue(opened.call_args.kwargs['managed']) + self.assertEqual(opened.call_args.args[0], Path(project['path'])) + self.assertNotIn('managed', opened.call_args.kwargs) def _legacy_project(self,name): """Legacy tests explicitly retain Docker descriptors after the default changed.""" diff --git a/python/tests/test_workspace_startup_registry.py b/python/tests/test_workspace_startup_registry.py new file mode 100644 index 0000000..fc46169 --- /dev/null +++ b/python/tests/test_workspace_startup_registry.py @@ -0,0 +1,161 @@ +"""Local discovery index has no dependency on an application or project root.""" +import concurrent.futures +import json +import os +from pathlib import Path +import tempfile +import threading +import unittest +from unittest.mock import patch + +from workspace_projects import create_project, create_project_at, list_managed_projects +from workspace_startup_registry import project_index_path, read_project_index, remember_project_path, remember_project_paths_order, remember_project_result + + +class LocalProjectIndexTests(unittest.TestCase): + def setUp(self): + self.temp = tempfile.TemporaryDirectory() + self.addCleanup(self.temp.cleanup) + self.base = Path(self.temp.name).resolve() + self.index = self.base / 'profile/preferences/project-index.json' + environment = patch.dict(os.environ, {'RIEKE_PROJECT_INDEX': str(self.index)}) + environment.start() + self.addCleanup(environment.stop) + + def test_empty_inventory_does_not_create_user_or_preferred_folders(self): + preferred = self.base / 'preferred' + self.assertEqual(read_project_index()['projects'], []) + self.assertEqual(list_managed_projects(preferred)['projects'], []) + self.assertFalse(self.index.parent.exists()) + self.assertFalse(preferred.exists()) + + def test_created_registration_and_last_open_are_separate_without_parent_writes(self): + first = create_project_at(str(self.base / 'research/one'), 'Independent study') + second = create_project_at(str(self.base / 'research/two'), 'Independent study') + remember_project_path(first['path'], first['uuid'], set_last=True) + registered = remember_project_path(second['path'], second['uuid']) + self.assertEqual(registered['last_project_path'], first['path']) + self.assertEqual(len(registered['projects']), 2) + self.assertEqual(set(path.name for path in (self.base / 'research').iterdir()), {'one', 'two'}) + self.assertNotIn('credentials', self.index.read_text()) + + def test_existing_exact_folder_does_not_require_listing_or_writing_its_parent(self): + parent = self.base / 'external-parent' + selected = parent / 'selected-project' + selected.mkdir(parents=True) + original = Path.iterdir + def prohibit_parent_inventory(path): + if path == parent: + raise PermissionError('The project parent is not an application workspace') + return original(path) + with patch.object(Path, 'iterdir', prohibit_parent_inventory): + project = create_project_at(str(selected), 'Selected folder') + self.assertEqual(project['path'], str(selected)) + self.assertEqual(set(path.name for path in parent.iterdir()), {'selected-project'}) + self.assertTrue((selected / 'project.json').is_file()) + + def test_atomic_concurrent_registration_preserves_both_project_references(self): + projects = [create_project_at(str(self.base / f'research/{index}'), f'Study {index}') for index in range(2)] + with concurrent.futures.ThreadPoolExecutor(max_workers=2) as pool: + list(pool.map(lambda project: remember_project_path(project['path']), projects)) + self.assertEqual({project['path'] for project in read_project_index()['projects']}, {project['path'] for project in projects}) + self.assertFalse(list(self.index.parent.glob('.project-index-*'))) + + def test_managed_and_exact_creation_of_same_folder_share_one_lock(self): + from workspace_storage import initialize_layout + preferred = self.base / 'preferred' + selected = preferred / 'study' + first_entered, finish_first = threading.Event(), threading.Event() + second_started, second_finished = threading.Event(), threading.Event() + def paused_layout(*args): + if not first_entered.is_set(): + first_entered.set() + if not finish_first.wait(5): + raise RuntimeError('Test did not release project creation') + return initialize_layout(*args) + def exact_attempt(): + second_started.set() + try: + return create_project_at(str(selected), 'Exact study') + finally: + second_finished.set() + with patch('workspace_storage.initialize_layout', side_effect=paused_layout), concurrent.futures.ThreadPoolExecutor(max_workers=2) as pool: + first = pool.submit(create_project, preferred, 'Managed study', directory='study') + try: + self.assertTrue(first_entered.wait(5)) + second = pool.submit(exact_attempt) + self.assertTrue(second_started.wait(5)) + self.assertFalse(second_finished.wait(.15), 'Exact route bypassed the managed route target lock') + finally: + finish_first.set() + created = first.result(5) + with self.assertRaisesRegex(ValueError, 'already contains files'): + second.result(5) + self.assertEqual(json.loads((selected / 'project.json').read_text())['project_uuid'], created['uuid']) + + def test_invalid_index_or_duplicate_order_preserves_prior_file(self): + project = create_project_at(str(self.base / 'research/one'), 'Study') + remember_project_path(project['path']) + before = self.index.read_bytes() + with self.assertRaisesRegex(ValueError, 'duplicate'): + remember_project_paths_order([project['path'], project['path']]) + self.assertEqual(self.index.read_bytes(), before) + for changes in ({'version': 2}, {'version': True}, {'last_project_path': '/not-registered'}, + {'project_order': ['../relative']}, {'projects': [{'path': '/somewhere', 'password': 'no'}]}): + invalid = {**json.loads(before), **changes} + self.index.write_text(json.dumps(invalid)) + with self.assertRaises((ValueError, TypeError)): + remember_project_path(project['path']) + self.assertEqual(json.loads(self.index.read_text()), invalid) + + def test_completed_operation_survives_corrupt_profile_without_overwriting_evidence(self): + project = create_project_at(str(self.base / 'research/one'), 'Completed study') + self.index.write_text('corrupt profile evidence') + before_project = (Path(project['path']) / 'project.json').read_bytes() + completed = {'project_uuid': project['uuid'], 'directory': project['path'], 'verified': True, + 'url': 'http://127.0.0.1:8123/'} + preserved = remember_project_result(project['path'], completed, set_last=True) + self.assertEqual({key: preserved[key] for key in completed}, completed) + self.assertIn(project['path'], preserved['registry_warning']) + self.assertNotIn('registry_warning', completed) + self.assertEqual(self.index.read_text(), 'corrupt profile evidence') + self.assertEqual((Path(project['path']) / 'project.json').read_bytes(), before_project) + + def test_completed_operation_reports_profile_write_failure_and_success_stays_unchanged(self): + project = create_project_at(str(self.base / 'research/one'), 'Completed study') + completed = {'directory': project['path'], 'moved': True} + with patch('workspace_startup_registry.remember_project_path', side_effect=OSError('Disk full')): + preserved = remember_project_result(project['path'], completed, previous_directory=self.base / 'old') + self.assertTrue(preserved['moved']) + self.assertIn('Disk full', preserved['registry_warning']) + self.assertIs(remember_project_result(project['path'], completed), completed) + + def test_index_and_project_leaf_symlinks_are_rejected_without_following(self): + project = create_project_at(str(self.base / 'research/one'), 'Study') + alias = self.base / 'alias' + alias.symlink_to(project['path'], target_is_directory=True) + with self.assertRaisesRegex(ValueError, 'regular project'): + remember_project_path(alias) + outside = self.base / 'outside-index' + outside.write_text('keep this file') + self.index.symlink_to(outside) + with self.assertRaisesRegex(ValueError, 'symbolic'): + read_project_index() + self.assertEqual(outside.read_text(), 'keep this file') + + def test_desktop_profile_and_system_alias_parent_resolve_consistently(self): + desktop = self.base / 'desktop-user' + with patch.dict(os.environ, {'RIEKE_PROJECT_INDEX': '', 'RIEKE_DESKTOP_USER_STATE': str(desktop)}): + self.assertEqual(project_index_path(), desktop / 'preferences/project-index.json') + actual = self.base / 'actual-profile' + actual.mkdir() + alias = self.base / 'profile-alias' + alias.symlink_to(actual, target_is_directory=True) + with patch.dict(os.environ, {'RIEKE_PROJECT_INDEX': str(alias / 'project-index.json')}): + self.assertEqual(project_index_path(), actual / 'project-index.json') + remember_project_paths_order([]) + self.assertTrue((actual / 'project-index.json').is_file()) + + +if __name__ == '__main__': + unittest.main() diff --git a/python/workspace_api.py b/python/workspace_api.py index 9ea819e..139b822 100644 --- a/python/workspace_api.py +++ b/python/workspace_api.py @@ -127,6 +127,8 @@ def create_app(project_dir, retinanalysis_dir, *, service=None, store=None, expl frontend = Path(__file__).resolve().parents[1] / "workspace-app/dist" app.extensions["workspace_service"] = service app.extensions["curation_store"] = store + from workspace_project_preferences import register_project_preference_routes + register_project_preference_routes(app, project_dir, service.project['project_uuid'], db_lock) def filters(allowed=()): if any(len(request.args.getlist(key)) != 1 for key in ('tag', 'tagged', 'tag_predicate') if key in request.args): diff --git a/python/workspace_app_routes.py b/python/workspace_app_routes.py index 0338305..8338f83 100644 --- a/python/workspace_app_routes.py +++ b/python/workspace_app_routes.py @@ -95,6 +95,9 @@ def run(): from workspace_portability import prepare_project, restore_project function = prepare_project if operation == 'prepare' else restore_project result = function(body['directory'].strip(), body['destination'].strip()) + if operation == 'restore': + from workspace_startup_registry import remember_project_result + result = remember_project_result(result['directory'], result) with lock: jobs[identity] = {'job_id': identity, 'state': 'complete', 'result': result} except Exception as error: @@ -127,6 +130,8 @@ def relocate_project_folder(): try: from workspace_portability import relocate_project result = relocate_project(body['directory'].strip(), body['destination'].strip()) + from workspace_startup_registry import remember_project_result + result = remember_project_result(result['directory'], result, previous_directory=body['directory'].strip()) except (ValueError, OSError) as error: return jsonify(error=str(error)), 400 return jsonify(result) diff --git a/python/workspace_launcher.py b/python/workspace_launcher.py index ebc4bff..1ea0835 100644 --- a/python/workspace_launcher.py +++ b/python/workspace_launcher.py @@ -7,7 +7,7 @@ from werkzeug.exceptions import HTTPException from workspace_projects import create_project, create_project_at, list_managed_projects, list_projects, managed_root from workspace_project_servers import open_project -from workspace_startup_registry import remember_project +from workspace_startup_registry import remember_project_result def register_project_routes(app, *, retinanalysis_dir, project_dir=None, root=None): @@ -33,8 +33,8 @@ def project_order(): available = {project['path'] for project in inventory['projects']} if len(paths) != len(available) or len(set(paths)) != len(paths) or set(paths) != available: raise ValueError('Project list changed; refresh it before rearranging projects') - from workspace_startup_registry import remember_project_order - remember_project_order(current.parent if current else root_provider(), paths) + from workspace_startup_registry import remember_project_paths_order + remember_project_paths_order(paths) return project_inventory() @app.post('/api/projects') @@ -46,24 +46,24 @@ def project_create(): if set(body) - {'name', 'project_directory'}: raise ValueError('Choose one exact project folder; do not combine it with a parent root') project = create_project_at(body['project_directory'], body.get('name')) - return jsonify(project=project, database_status='not_started', - message='Project created in the selected folder. Opening it prepares its database.'), 201 + return jsonify(remember_project_result(project['path'], {'project': project, 'database_status': 'not_started', + 'message': 'Project created in the selected folder. Opening it prepares its database.'})), 201 selected_root = body.get('root_directory') if selected_root is not None: if not isinstance(selected_root, str) or not selected_root.strip() or not Path(selected_root.strip()).expanduser().is_absolute(): raise ValueError('Choose an absolute root folder for the new project') selected_root = managed_root(selected_root.strip()) project = create_project(selected_root or root_provider(), body.get('name'), directory=body.get('directory')) - return jsonify(project=project, database_status='not_started', - message='Empty project created. Opening it prepares its own database; no recording is required.'), 201 + return jsonify(remember_project_result(project['path'], {'project': project, 'database_status': 'not_started', + 'message': 'Empty project created. Opening it prepares its own database; no recording is required.'})), 201 @app.post('/api/projects/inspect-folder') def project_inspect_folder(): body = request.get_json(silent=True) if request.args or not isinstance(body, dict) or set(body) != {'directory'}: raise ValueError('Choose an existing project folder') - from workspace_project_validation import validate_project_folder - return jsonify(validate_project_folder(body['directory'])) + from workspace_project_validation import inspect_project_folder + return jsonify(inspect_project_folder(body['directory'])) @app.post('/api/projects/open-folder') def project_open_folder(): @@ -76,6 +76,9 @@ def project_open_folder(): if not directory.is_dir(): raise ValueError('Project folder does not exist; choose an existing project') directory = directory.resolve() + from workspace_portability import MANIFEST + if (directory / MANIFEST).exists() or (directory / MANIFEST).is_symlink(): + raise ValueError('This is a prepared project copy. Add it through project setup and choose a new project folder to restore it.') if not (directory / 'project.json').is_file() or not (directory / 'catalog.json').is_file(): raise ValueError('Choose the project folder containing project.json and catalog.json, not its parent workspace') from workspace_project_validation import validate_project_folder @@ -85,7 +88,7 @@ def project_open_folder(): if current: current_record = next(row for row in list_projects(current)['projects'] if row['current']) if directory == current: - return jsonify(url=request.host_url, project_uuid=project['uuid']) + return jsonify(remember_project_result(directory, {'url': request.host_url, 'project_uuid': project['uuid']}, set_last=True)) if project['uuid'] == current_record['uuid']: import uuid from workspace_projects import _read_manifest @@ -105,7 +108,8 @@ def restored_instance(path): other_instance = restored_instance(directory) if not other_instance or other_instance == restored_instance(current): raise ValueError('This folder duplicates the current project identity; use its original folder') - return jsonify(open_project(directory, project['uuid'], retinanalysis_dir)) + result = open_project(directory, project['uuid'], retinanalysis_dir) + return jsonify(remember_project_result(directory, result, set_last=True)) @app.post('/api/projects//open') def project_open(project_uuid): @@ -118,9 +122,13 @@ def project_open(project_uuid): if current: record = next((p for p in list_projects(current)['projects'] if p['current']), None) if record and record['uuid'] == project_uuid: - remember_project(root_provider(), project_uuid) - return jsonify(url=request.host_url, project_uuid=project_uuid) - return jsonify(open_project(root_provider(), project_uuid, retinanalysis_dir, managed=True)) + return jsonify(remember_project_result(current, {'url': request.host_url, 'project_uuid': project_uuid}, set_last=True)) + project = next((project for project in inventory['projects'] + if project['uuid'] == project_uuid and project['available']), None) + if project is None: + raise ValueError('Select an available registered project') + result = open_project(Path(project['path']), project_uuid, retinanalysis_dir) + return jsonify(remember_project_result(project['path'], result, set_last=True)) def create_launcher(root, retinanalysis_dir, *, application_dir=None): diff --git a/python/workspace_portability.py b/python/workspace_portability.py index 7294d01..a84c981 100644 --- a/python/workspace_portability.py +++ b/python/workspace_portability.py @@ -8,6 +8,8 @@ import argparse from contextlib import contextmanager +import datetime as dt +from decimal import Decimal import fcntl import hashlib import json @@ -23,10 +25,153 @@ FORMAT = 'rieke-project-transfer' MANIFEST = 'transfer.json' PENDING = '.portable-restore.pending' -DIRECTORIES = ('imports', 'protocols', 'query-snapshots', 'exports', 'raw-uploads') +DIRECTORIES = ('imports', 'protocols', 'query-snapshots', 'exports', 'raw-uploads', + 'logs/imports', 'logs/app-jobs', 'logs/errors', 'logs/storage') DATABASES = ('schema', 'recording_workspace') +def _database_inventory(connection): + """Fingerprint every logical table, including historical user-state versions. + + Inspect before rebasing current locators. JSON is canonicalized because MySQL + may normalize its whitespace. Hashes are sorted per table so row ordering and + tables without primary keys cannot change the result of a logical restore. + Only row digests are retained, never complete recording metadata in memory. + """ + from pymysql.cursors import SSCursor + + def encode(value): + if isinstance(value, (dt.datetime, dt.date, dt.time)): + return {'datetime': value.isoformat()} + if isinstance(value, dt.timedelta): + return {'timedelta': str(value)} + if isinstance(value, Decimal): + return {'decimal': str(value)} + if isinstance(value, bytes): + return {'bytes': value.hex()} + raise TypeError(type(value).__name__) + + inventory = {} + with connection.cursor() as cursor: + cursor.execute('SELECT table_schema, table_name FROM information_schema.tables ' + 'WHERE table_schema IN (%s,%s) AND table_type=%s ORDER BY table_schema, table_name', + (*DATABASES, 'BASE TABLE')) + tables = cursor.fetchall() + for database, table in tables: + # Names come from the actual server, but still quote identifiers. + reference = '.'.join('`' + name.replace('`', '``') + '`' for name in (database, table)) + cursor.execute('SHOW COLUMNS FROM ' + reference) + columns = cursor.fetchall() + json_columns = [index for index, column in enumerate(columns) if column[1] == 'json'] + digests = [] + with connection.cursor(SSCursor) as data_cursor: + data_cursor.execute('SELECT * FROM ' + reference) + while rows := data_cursor.fetchmany(1000): + for row in rows: + row = list(row) + for index in json_columns: + if isinstance(row[index], (str, bytes)): + row[index] = json.loads(row[index]) + data = json.dumps(row, default=encode, sort_keys=True, + separators=(',', ':'), allow_nan=False).encode() + digests.append(hashlib.sha256(data).digest()) + checksum = hashlib.sha256() + checksum.update(json.dumps([[column[0], column[1]] for column in columns], + separators=(',', ':')).encode()) + digests.sort() + for digest in digests: + checksum.update(digest) + inventory[database + '.' + table] = {'rows': len(digests), 'sha256': checksum.hexdigest()} + return inventory + + +def _validate_database_inventory(inventory): + if not isinstance(inventory, dict): + raise ValueError('Prepared project database inventory is invalid') + for table, expected in inventory.items(): + if (not isinstance(table, str) or not any(table.startswith(database + '.') and + len(table) > len(database) + 1 for database in DATABASES) + or not isinstance(expected, dict) or set(expected) != {'rows', 'sha256'} + or type(expected['rows']) is not int or expected['rows'] < 0 + or not isinstance(expected['sha256'], str) + or not re.fullmatch('[0-9a-f]{64}', expected['sha256'])): + raise ValueError('Prepared project database inventory is invalid') + + +def register_empty_project(project_dir, connection=None): + """Register a genuinely new native project's SQL identity before its first import. + + Missing identity in a populated project is corruption, never permission to + replace its database. Check scientific files and every existing logical table + before adding the four initial workspace tables to a still-empty database. + """ + root = Path(project_dir).resolve() + project = _json(root / 'project.json') + identity = project['project_uuid'] + provider = _json(root / 'catalog.json')['connection']['credential_provider'] + if provider.get('kind') != 'native-project': + return False + owned = connection is None + connection = connection or _connection(root) + try: + with connection.cursor() as cursor: + cursor.execute('SELECT table_schema, table_name FROM information_schema.tables ' + 'WHERE table_schema IN (%s,%s) AND table_type=%s', (*DATABASES, 'BASE TABLE')) + tables = cursor.fetchall() + if ('recording_workspace', 'project') in tables: + cursor.execute('SELECT project_uuid FROM recording_workspace.project') + identities = {row[0] for row in cursor.fetchall()} + if identities == {identity}: + return False + if identities: + raise ValueError('Database must contain exactly the declared project identity') + for directory in ('imports', 'protocols', 'query-snapshots', 'exports', 'raw-uploads'): + folder = _inside(root, directory) + files = _files(folder, skip_marker=False) if folder.exists() else {} + if directory == 'protocols': + from workspace_project_preferences import ProjectPreferences, REFERENCE + if REFERENCE.removeprefix('protocols/') in files: + ProjectPreferences(root, identity).read() + files.pop(REFERENCE.removeprefix('protocols/')) + if directory == 'exports' and 'README.md' in files: + from workspace_export_folder import GUIDE + if (folder / 'README.md').read_text() == GUIDE: + files.pop('README.md') # Created by API startup before the read model. + if files: + raise ValueError('Project database identity is missing from a populated project; restore its complete database before opening or sharing') + for database, table in tables: + if table == '~log': + continue # DataJoint infrastructure log records table declarations. + reference = '.'.join('`' + name.replace('`', '``') + '`' for name in (database, table)) + if database == 'recording_workspace' and table == 'annotation_profile': + # Older empty projects create a default author on first open, + # before the first import writes the Project row. + cursor.execute('SELECT 1 FROM ' + reference + ' WHERE project_uuid<>%s LIMIT 1', (identity,)) + else: + cursor.execute('SELECT 1 FROM ' + reference + ' LIMIT 1') + if cursor.fetchone() is not None: + raise ValueError('Project database identity is missing from a populated project; restore its complete database before opening or sharing') + # Same initial definitions as recording_workspace.workspace_tables. + cursor.execute('CREATE DATABASE IF NOT EXISTS `schema`') + cursor.execute('CREATE DATABASE IF NOT EXISTS recording_workspace') + cursor.execute('CREATE TABLE IF NOT EXISTS recording_workspace.project ' + '(project_uuid varchar(36) PRIMARY KEY, name varchar(255) NOT NULL, directory varchar(1024) NOT NULL)') + cursor.execute('CREATE TABLE IF NOT EXISTS recording_workspace.source ' + '(source_sha256 char(64) PRIMARY KEY, project_uuid varchar(36) NOT NULL, ' + 'experiment_uuid varchar(36) NOT NULL, experiment_id int NOT NULL, manifest json NOT NULL)') + cursor.execute('CREATE TABLE IF NOT EXISTS recording_workspace.event ' + '(event_uuid varchar(36) PRIMARY KEY, project_uuid varchar(36) NOT NULL, ' + 'occurred_at datetime NOT NULL, actor varchar(255) NOT NULL, action varchar(63) NOT NULL, payload json NOT NULL)') + cursor.execute('CREATE TABLE IF NOT EXISTS recording_workspace.protocol_workspace ' + '(protocol_uuid varchar(36) PRIMARY KEY, project_uuid varchar(36) NOT NULL, definition json NOT NULL)') + cursor.execute('INSERT INTO recording_workspace.project (project_uuid,name,directory) VALUES (%s,%s,%s)', + (identity, project['name'], str(root))) + return True + finally: + if owned: + connection.close() + + def _json(path): with Path(path).open(encoding='utf-8') as handle: return json.load(handle) @@ -48,6 +193,17 @@ def _hash(path): return result.hexdigest() +def _verify_recording_dependencies(path): + """A complete transfer must not depend on other H5 files or raw datasets.""" + import h5py + from recording_workspace import validate_self_contained_h5 + try: + with h5py.File(path, 'r') as handle: + validate_self_contained_h5(handle) + except OSError as error: + raise ValueError('Registered recording is not a readable self-contained H5 file: ' + str(path)) from error + + def _inside(root, relative): if not isinstance(relative, str) or not relative or '\\' in relative: raise ValueError('Transfer file reference is invalid') @@ -245,16 +401,21 @@ def inspect_package(package_dir): _inside(root, relative) if not isinstance(expected, dict) or set(expected) != {'size', 'sha256'} or type(expected['size']) is not int or expected['size'] < 0 or not isinstance(expected['sha256'], str) or not re.fullmatch('[0-9a-f]{64}', expected['sha256']): raise ValueError('Prepared project file checksum record is invalid') - if relative not in {'project.json', 'database.sql'} and relative.split('/')[0] not in DIRECTORIES: + if relative not in {'project.json', 'database.sql'} and not any( + relative.startswith(directory + '/') for directory in DIRECTORIES): raise ValueError('Prepared project contains unsupported runtime files') if _files(root) != files: raise ValueError('Prepared project checksum or file inventory mismatch') from workspace_projects import _identity project = _json(root / 'project.json') - if project.get('format') != 'recording-project' or type(project.get('version')) is not int or project['version'] != 1 or _identity(project.get('project_uuid')) != _identity(value.get('project_uuid')): + if not isinstance(project, dict) or project.get('format') != 'recording-project' or type(project.get('version')) is not int or project['version'] != 1 or _identity(project.get('project_uuid')) != _identity(value.get('project_uuid')): raise ValueError('Prepared project identity or format is invalid') if not isinstance(project.get('name'), str) or not project['name'].strip() or project.get('catalog_ref', 'catalog.json') != 'catalog.json': raise ValueError('Prepared project manifest is invalid') + from workspace_project_preferences import ProjectPreferences + ProjectPreferences(root, project['project_uuid']).read() + if 'database_inventory' in value: + _validate_database_inventory(value['database_inventory']) sources = value.get('sources') if not isinstance(sources, list): raise ValueError('Prepared project source inventory is invalid') @@ -265,13 +426,19 @@ def inspect_package(package_dir): sha = source['source_sha256'] if not isinstance(sha, str) or not re.fullmatch('[0-9a-f]{64}', sha) or sha in seen: raise ValueError('Prepared project source identities are invalid or duplicated') + metadata_sha = source['metadata_sha256'] + if not isinstance(metadata_sha, str) or not re.fullmatch('[0-9a-f]{64}', metadata_sha): + raise ValueError('Prepared project metadata checksum is invalid') seen.add(sha) for key in ('recording_ref', 'metadata_ref'): _inside(root, source[key]) if not source['recording_ref'].startswith('raw-uploads/') or not source['metadata_ref'].startswith('imports/'): raise ValueError('Prepared source references use unsupported directories') - if files.get(source['recording_ref'], {}).get('sha256') != sha or files.get(source['metadata_ref'], {}).get('sha256') != source['metadata_sha256']: + if source['recording_ref'] not in files or source['metadata_ref'] not in files: + raise ValueError('Prepared project is missing a registered source dependency') + if files[source['recording_ref']]['sha256'] != sha or files[source['metadata_ref']]['sha256'] != metadata_sha: raise ValueError('Prepared project source checksums disagree') + _verify_recording_dependencies(_inside(root, source['recording_ref'])) return value @@ -372,6 +539,9 @@ def restore_project(package_dir, destination): _import(target, dump) connection = _connection(target) try: + if ('database_inventory' in manifest + and _database_inventory(connection) != manifest['database_inventory']): + raise ValueError('Restored database content disagrees with the prepared project inventory') sources = _sources(connection, identity) artifacts = _artifact_relocations(connection, identity, target) mappings = {source['source_sha256']: source for source in manifest['sources']} @@ -428,14 +598,18 @@ def prepare_project(project_dir, destination): target = _destination(destination, root) identity = record['uuid'] with _offline(root): + from workspace_project_preferences import ProjectPreferences + ProjectPreferences(root, identity).read() ensure_project_database(root) connection = _connection(root) staging = Path(tempfile.mkdtemp(prefix='.rieke-transfer-', dir=target.parent)) try: + register_empty_project(root, connection) with connection.cursor() as cursor: cursor.execute('SET SESSION lock_wait_timeout=15') cursor.execute('FLUSH TABLES WITH READ LOCK') sources = _sources(connection, identity) + database_inventory = _database_inventory(connection) source_project = _json(root / 'project.json') # Only portable identity/display fields enter the transfer manifest. project = {key: source_project[key] for key in ('format', 'version', 'project_uuid', 'name', 'display_name', 'created_at') if key in source_project} @@ -448,8 +622,12 @@ def prepare_project(project_dir, destination): if source_dir.exists(): if source_dir.is_symlink(): raise ValueError('Managed transfer directories cannot be symbolic links') + # Reject symlinked parents too, including the logs root. + _inside(root, directory) before[directory] = _files(source_dir, skip_marker=False) - shutil.copytree(source_dir, staging / directory) + output_dir = staging / directory + output_dir.parent.mkdir(parents=True, exist_ok=True) + shutil.copytree(source_dir, output_dir) inventory = [] for source in sources: manifest = source['manifest'] @@ -471,6 +649,7 @@ def prepare_project(project_dir, destination): raise ValueError('A registered recording is missing; locate it before preparing a complete transfer') from None if _hash(output) != source['source_sha256']: raise ValueError('Recording checksum changed or a recording is missing') + _verify_recording_dependencies(output) inventory.append({'source_sha256': source['source_sha256'], 'recording_ref': recording_ref, 'metadata_ref': reference, 'metadata_sha256': manifest['metadata_sha256']}) _dump(root, staging / 'database.sql') @@ -484,12 +663,20 @@ def prepare_project(project_dir, destination): connection = None _write(staging / MANIFEST, {'format': FORMAT, 'version': 1, 'mode': 'complete', 'database_format': 'mysql8-logical-v1', 'project_uuid': identity, - 'sources': inventory, 'files': _files(staging)}) + 'sources': inventory, 'database_inventory': database_inventory, 'files': _files(staging)}) # Real restore verification, including identities and current source locators. verify_parent = Path(tempfile.mkdtemp(prefix='.rieke-verify-', dir=target.parent)) - verified = restore_project(staging, str(verify_parent / 'project')) - _remove_runtime(Path(verified['directory'])) - shutil.rmtree(verify_parent) + try: + verified = restore_project(staging, str(verify_parent / 'project')) + _remove_runtime(Path(verified['directory'])) + except BaseException: + # A failed runtime shutdown leaves evidence for manual recovery. + # Failed restores remove their own partial project already. + if not (verify_parent / 'project').exists(): + shutil.rmtree(verify_parent) + raise + else: + shutil.rmtree(verify_parent) # Claim the final path exclusively before replacing our own empty # reservation with the fully verified package. try: diff --git a/python/workspace_project_preferences.py b/python/workspace_project_preferences.py new file mode 100644 index 0000000..db779ef --- /dev/null +++ b/python/workspace_project_preferences.py @@ -0,0 +1,185 @@ +"""Portable search shortcuts and protocol organization; device geometry stays local.""" +from __future__ import annotations + +import copy +import fcntl +import json +import os +from pathlib import Path +import tempfile +import uuid + +FORMAT = 'rieke-project-preferences' +REFERENCE = 'protocols/ui-state/project-preferences.json' +FIELDS = {'recent_searches', 'protocol_shortcuts'} +MAX_BYTES = 1024 * 1024 + + +def _uuid(value): + if not isinstance(value, str) or str(uuid.UUID(value)) != value: + raise ValueError('Preference identities must be normalized UUID strings') + return value + + +def _predicate(value): + from workspace_predicates import MAX_DEPTH, MAX_NODES, validate + fields, count = set(), 0 + def collect(node, depth=0): + nonlocal count + count += 1 + if count > MAX_NODES or depth > MAX_DEPTH or not isinstance(node, dict): + raise ValueError('Saved search predicate exceeds its shape or size limits') + if set(node) == {'not'}: + collect(node['not'], depth + 1) + elif set(node) in ({'all'}, {'any'}): + children = node[next(iter(node))] + if not isinstance(children, list): + raise ValueError('Predicate groups require arrays') + for child in children: + collect(child, depth + 1) + else: + field = node.get('field') + if not isinstance(field, str) or not field or len(field) > 2048: + raise ValueError('Saved search field is invalid') + fields.add(field) + collect(value) + # A previously valid field can disappear after archiving a source. Preserve + # the recipe's structural validity here; running it still checks the catalog. + return validate(value, {'fields': [{'id': field} for field in fields]}, {}) + + +def validate_field(field, value): + if field == 'protocol_shortcuts': + if not isinstance(value, dict) or len(value) > 2000: + raise ValueError('Use at most 2000 protocol shortcuts') + for identity, preference in value.items(): + _uuid(identity) + if (not isinstance(preference, dict) or set(preference) != {'section', 'rank'} + or not isinstance(preference['section'], str) or preference['section'] not in {'pinned', 'main', 'support'} + or type(preference['rank']) is not int or not 0 <= preference['rank'] <= 2000): + raise ValueError('Protocol shortcuts require a known section and integer rank') + elif field == 'recent_searches': + if not isinstance(value, list) or len(value) > 100: + raise ValueError('Use at most 100 recent search shortcuts') + seen = set() + for entry in value: + if (not isinstance(entry, dict) + or set(entry) - {'id', 'name', 'predicate', 'splits', 'matched_count', 'cell_count', 'pinned', 'lastRunAt'} + or not {'id', 'predicate', 'splits', 'pinned'} <= set(entry) + or not isinstance(entry['id'], str) or not entry['id'] or len(entry['id']) > 65536 + or entry['id'] in seen or type(entry['pinned']) is not bool + or not isinstance(entry['splits'], str) or len(entry['splits']) > 4096): + raise ValueError('Saved search shortcut shape or identity is invalid') + seen.add(entry['id']) + _predicate(entry['predicate']) + for key, maximum in (('name', 255), ('lastRunAt', 64)): + if key in entry and entry[key] is not None and (not isinstance(entry[key], str) or len(entry[key]) > maximum): + raise ValueError('Saved search label or timestamp is invalid') + for key in ('matched_count', 'cell_count'): + if key in entry and entry[key] is not None and (type(entry[key]) is not int or entry[key] < 0): + raise ValueError('Saved search counts must be nonnegative integers') + else: + raise ValueError('Unknown project preference field') + if len(json.dumps(value, allow_nan=False).encode()) > MAX_BYTES: + raise ValueError('Project preference field exceeds 1 MiB') + return copy.deepcopy(value) + + +class PreferenceConflict(ValueError): + pass + + +class ProjectPreferences: + def __init__(self, directory, project_uuid): + self.root = Path(directory).resolve() + self.identity = _uuid(project_uuid) + + def _path(self): + current = self.root + for part in Path(REFERENCE).parts: + current = current / part + if current.is_symlink(): + raise ValueError('Project preference files cannot be symbolic links') + return current + + def read(self): + path = self._path() + if not path.exists(): + return {'format': FORMAT, 'version': 1, 'project_uuid': self.identity, + 'revisions': {field: 0 for field in FIELDS}, 'state': {}} + if not path.is_file() or path.stat().st_size > MAX_BYTES: + raise ValueError('Project preference file is invalid or exceeds 1 MiB') + value = json.loads(path.read_text()) + if (not isinstance(value, dict) or set(value) != {'format', 'version', 'project_uuid', 'revisions', 'state'} + or value['format'] != FORMAT or type(value['version']) is not int or value['version'] != 1 + or value['project_uuid'] != self.identity or not isinstance(value['state'], dict) + or set(value['state']) - FIELDS or not isinstance(value['revisions'], dict) + or set(value['revisions']) != FIELDS + or any(type(revision) is not int or revision < 0 for revision in value['revisions'].values())): + raise ValueError('Unsupported project preference file or identity') + for field, state in value['state'].items(): + validate_field(field, state) + return value + + def save(self, field, value, expected_revision): + value = validate_field(field, value) + if type(expected_revision) is not int or expected_revision < 0: + raise ValueError('Preference expected_revision must be a nonnegative integer') + lock_path = self.root / '.project-preferences.lock' + if lock_path.is_symlink(): + raise ValueError('Project preference lock cannot be a symbolic link') + with lock_path.open('a') as lock: + fcntl.flock(lock, fcntl.LOCK_EX) + current = self.read() + if current['revisions'][field] != expected_revision: + raise PreferenceConflict('Project preferences changed; reload before saving.') + if current['state'].get(field) == value: + return current + current['state'][field] = value + current['revisions'][field] += 1 + content = json.dumps(current, allow_nan=False, indent=2, sort_keys=True).encode() + b'\n' + if len(content) > MAX_BYTES: + raise ValueError('Project preference file exceeds 1 MiB') + path = self._path() + path.parent.mkdir(parents=True, exist_ok=True) + fd, temporary = tempfile.mkstemp(prefix='.preferences-', dir=path.parent) + try: + with os.fdopen(fd, 'wb') as handle: + handle.write(content) + handle.flush() + os.fsync(handle.fileno()) + os.replace(temporary, path) + finally: + Path(temporary).unlink(missing_ok=True) + return current + + +def register_project_preference_routes(app, directory, project_uuid, db_lock): + from flask import jsonify, request + preferences = ProjectPreferences(directory, project_uuid) + app.extensions['project_preferences'] = preferences + + @app.get('/api/project-preferences') + def read_preferences(): + if request.args: + return jsonify(error='Project preferences do not accept query parameters.'), 400 + try: + with db_lock: + return jsonify(preferences.read()) + except (ValueError, OSError) as error: + return jsonify(error=str(error)), 400 + + @app.put('/api/project-preferences') + def save_preferences(): + if request.content_length is not None and request.content_length > MAX_BYTES: + return jsonify(error='Project preference request exceeds 1 MiB.'), 400 + body = request.get_json(silent=True) + if request.args or not isinstance(body, dict) or set(body) != {'field', 'value', 'expected_revision'}: + return jsonify(error='Preference saves require field, value and expected_revision.'), 400 + try: + with db_lock: + return jsonify(preferences.save(body['field'], body['value'], body['expected_revision'])) + except PreferenceConflict as error: + return jsonify(error=str(error)), 409 + except (ValueError, OSError, TypeError) as error: + return jsonify(error=str(error)), 400 diff --git a/python/workspace_project_servers.py b/python/workspace_project_servers.py index bad10f8..06338be 100644 --- a/python/workspace_project_servers.py +++ b/python/workspace_project_servers.py @@ -12,7 +12,7 @@ from recording_workspace import write_json from workspace_projects import list_projects, list_managed_projects -from workspace_startup_registry import remember_project +from workspace_startup_registry import remember_project_result def server_record(project_dir): @@ -99,7 +99,9 @@ def project_server_port(project_dir, identity): def open_project(project_dir, identity, retinanalysis_dir, *, timeout=300, managed=False): registry = list_managed_projects(project_dir) if managed else list_projects(project_dir) - project = next((row for row in registry['projects'] if row['uuid'] == identity and row['available']), None) + selected_path = str(Path(project_dir).expanduser().resolve()) + project = next((row for row in registry['projects'] if row['uuid'] == identity and row['available'] + and (managed or row['path'] == selected_path)), None) if project is None: raise ValueError('Select an available registered project') directory = Path(project['path']) @@ -109,8 +111,7 @@ def open_project(project_dir, identity, retinanalysis_dir, *, timeout=300, manag fcntl.flock(lock.fileno(), fcntl.LOCK_EX) existing = ready_url(directory, identity) if existing: - remember_project(directory.parent, identity) - return {'url': existing, 'project_uuid': identity} + return remember_project_result(directory, {'url': existing, 'project_uuid': identity}, set_last=True) from workspace_project_database import ensure_project_database ensure_project_database(directory) config = json.loads((directory / 'catalog.json').read_text()) @@ -140,8 +141,7 @@ def open_project(project_dir, identity, retinanalysis_dir, *, timeout=300, manag raise ValueError('Project could not start. See logs/workspace-launch.log in that project.') url = ready_url(directory, identity) if url: - remember_project(directory.parent, identity) - return {'url': url, 'project_uuid': identity} + return remember_project_result(directory, {'url': url, 'project_uuid': identity}, set_last=True) time.sleep(0.2) process.terminate() try: diff --git a/python/workspace_project_validation.py b/python/workspace_project_validation.py index 5fbe31d..35a7050 100644 --- a/python/workspace_project_validation.py +++ b/python/workspace_project_validation.py @@ -1,5 +1,6 @@ """Read-only folder preflight. Database availability and H5 checks happen on open.""" from pathlib import Path +from itertools import islice from workspace_projects import _project_record, _read_manifest from workspace_storage import DIRECTORIES, LOG_FOLDERS @@ -30,7 +31,7 @@ def validate_project_folder(path): except (OSError, ValueError, UnicodeError, TypeError) as error: raise ValueError(f'Cannot open project: {error}') from error catalog = _manifest(root, 'catalog.json') - result = {'valid': True, 'project': record, 'checks': ['Project and catalog identities match'], + result = {'valid': True, 'kind': 'project', 'project': record, 'checks': ['Project and catalog identities match'], 'warnings': [], 'database_status': 'legacy_external'} provider = catalog.get('connection', {}).get('credential_provider', {}) if record['database_kind'] != 'native-mysql' and provider.get('kind') != 'native-project': @@ -93,3 +94,85 @@ def validate_project_folder(path): result['warnings'].append('Database is open or was not closed cleanly; opening will check whether local recovery is safe. A moved unclean database cannot be opened.') result['warnings'].append('Recording availability and checksums are verified when opening.') return result + + +def _inspect_exact(candidate): + from workspace_portability import MANIFEST, inspect_package + if (candidate / MANIFEST).exists() or (candidate / MANIFEST).is_symlink(): + transfer = inspect_package(candidate) + root = candidate.resolve() + project = _manifest(root, 'project.json') + return {'valid': True, 'kind': 'prepared-transfer', + 'project': {'uuid': transfer['project_uuid'], + 'name': project.get('display_name') or project['name'], + 'path': str(root), 'available': True, 'current': False}, + 'database_status': 'restore_required', + 'checks': ['Prepared project identity and complete file inventory verified', + 'Recording and parsed metadata checksums verified'], + 'warnings': [], 'source_count': len(transfer['sources'])} + return validate_project_folder(candidate) + + +def inspect_project_folder(path): + """Inspect an exact root, or propose nearby fully validated roots read-only. + + Search at most eight ancestors and 128 immediate children. Never descend + into unrelated directory trees, follow directory aliases, open a server, + select a candidate automatically, or change the user's selected folder. + """ + if not isinstance(path, (str, Path)) or not str(path).strip(): + raise ValueError('Choose an absolute project folder path') + candidate = Path(str(path).strip()).expanduser() + if not candidate.is_absolute() or candidate.is_symlink(): + raise ValueError('Choose an absolute project folder path, not a symbolic link') + if not candidate.is_dir(): + raise ValueError('Choose an existing project folder') + try: + return _inspect_exact(candidate) + except (ValueError, OSError, UnicodeError, TypeError, KeyError) as error: + original_error = error + + def suggestion(folder, reason): + if folder.is_symlink() or not folder.is_dir(): + return None + if not any((folder / marker).exists() or (folder / marker).is_symlink() + for marker in ('project.json', 'transfer.json')): + return None + try: + report = _inspect_exact(folder) + except (ValueError, OSError, UnicodeError, TypeError, KeyError): + return None + project = report['project'] + return {'path': project['path'], 'name': project['name'], 'kind': report['kind'], + 'reason': reason} + + candidates = [] + for parent in islice(candidate.parents, 8): + if parent.is_symlink(): + # A nested selection beneath an alias cannot identify its actual root. + break + found = suggestion(parent, 'containing-project') + if found: + candidates.append(found) + break # The closest enclosing valid root owns this selection. + if not candidates: + try: + children = list(islice(candidate.iterdir(), 128)) + except OSError: + children = [] + for child in sorted(children, key=lambda entry: entry.name.casefold()): + found = suggestion(child, 'child-project') + if found: + candidates.append(found) + if not candidates: + if isinstance(original_error, ValueError): + raise original_error + raise ValueError(f'Cannot open project: {original_error}') from original_error + if candidates[0]['reason'] == 'containing-project': + message = 'This folder is inside a project. Choose its top folder below.' + elif len(candidates) == 1: + message = 'A project was found one folder below. Choose its top folder below.' + else: + message = 'Several projects were found one folder below. Choose the project you want.' + return {'valid': False, 'kind': 'project-root-suggestions', 'restore_required': False, + 'message': message, 'candidates': candidates} diff --git a/python/workspace_projects.py b/python/workspace_projects.py index 1f07329..b1afce9 100644 --- a/python/workspace_projects.py +++ b/python/workspace_projects.py @@ -1,4 +1,4 @@ -"""Read-only discovery of sibling recording projects; never scan arbitrary roots. +"""Read-only discovery of immediate siblings and explicitly remembered projects. Availability means the local identity manifests are valid and readable. It does not claim that the project's SQL server is reachable or that source H5 files exist. @@ -31,6 +31,8 @@ def _identity(value): def _project_record(directory, *, current=False): + if (directory / 'transfer.json').exists() or (directory / 'transfer.json').is_symlink(): + raise ValueError('Prepared project copies must be restored into a working project folder') if (directory / '.portable-restore.pending').exists(): raise ValueError('Project transfer restore is incomplete; finish recovery before opening it') project = _read_manifest(directory / 'project.json') @@ -62,7 +64,7 @@ def _project_record(directory, *, current=False): def list_projects(project_dir): - """Return the current project plus valid immediate siblings, deterministically. + """Return current, immediate siblings and remembered external projects. Sibling directory and manifest symlinks are excluded. Duplicate UUIDs cannot establish a second selectable project: current wins; ambiguous non-current @@ -86,15 +88,54 @@ def list_projects(project_dir): candidates.append(candidate) except (OSError, ValueError, UnicodeError): continue - occurrences = {} - for candidate in candidates: - occurrences[candidate['uuid']] = occurrences.get(candidate['uuid'], 0) + 1 - projects = [candidate for candidate in candidates if candidate.get('database_kind') == 'native-mysql' or occurrences[candidate['uuid']] == 1] - projects.sort(key=lambda item: (item['name'].casefold(), item['name'], item['path'])) - from workspace_startup_registry import read_registry, ordered_projects - saved = read_registry(current_dir.parent) - return {'current_project_uuid': current['uuid'], 'projects': ordered_projects([current, *projects], saved), - 'managed_root': str(current_dir.parent), 'last_project_uuid': saved.get('last_project_uuid'), 'launcher': False} + projects, last = _combined_projects([current, *candidates], current_dir.parent, current_dir) + return {'current_project_uuid': current['uuid'], 'projects': projects, + 'managed_root': str(current_dir.parent), **last, 'launcher': False} + + +def _combined_projects(discovered, root, current=None): + """Read only saved exact folders; their parents are never searched.""" + from workspace_startup_registry import read_registry, read_project_index, ordered_projects + local = read_registry(root) + index = read_project_index() + by_path = {project['path']: project for project in discovered} + for saved in index['projects']: + path = saved['path'] + if path in by_path: + continue + directory = Path(path) + try: + if directory.is_symlink() or not directory.is_dir(): + raise ValueError('Project folder is unavailable; reconnect its drive or add its new location') + project = _project_record(directory, current=directory == current) + if project['uuid'] != saved['project_uuid']: + raise ValueError('This folder now contains a different project; add its new location') + except (OSError, ValueError, UnicodeError) as error: + # Keep removable-drive and moved-project references visible without + # trusting stale manifests, following links, or exposing credentials. + project = {'uuid': saved['project_uuid'], 'name': saved['name'], 'path': path, + 'database_kind': saved['database_kind'], 'current': False, + 'available': False, 'unavailable_reason': str(error)} + by_path[path] = project + projects = list(by_path.values()) + current_record = next((project for project in projects if project['current']), None) + if current_record: + projects = [project for project in projects if project['current'] + or project['uuid'] != current_record['uuid'] or project.get('database_kind') == 'native-mysql'] + counts = {} + for project in projects: + counts[project['uuid']] = counts.get(project['uuid'], 0) + 1 + projects = [project for project in projects if project['current'] + or project.get('database_kind') == 'native-mysql' or counts[project['uuid']] == 1] + saved_order = {**local, 'project_order': index['project_order'] or local.get('project_order', [])} + projects = ordered_projects(projects, saved_order) + last_path = index['last_project_path'] + last = next((project for project in projects if project['path'] == last_path), None) + if last is None: + matches = [project for project in projects if project['uuid'] == local.get('last_project_uuid')] + last = matches[0] if len(matches) == 1 else None + return projects, {'last_project_path': last['path'] if last else None, + 'last_project_uuid': last['uuid'] if last else None} def managed_root(path): @@ -118,25 +159,19 @@ def list_managed_projects(root, current_project=None): projects.append(_project_record(directory, current=directory == current_project)) except (OSError, ValueError, UnicodeError): continue - counts = {} - for project in projects: - counts[project['uuid']] = counts.get(project['uuid'], 0) + 1 - projects = [p for p in projects if p.get('database_kind') == 'native-mysql' or counts[p['uuid']] == 1] - projects.sort(key=lambda p: (p['name'].casefold(), p['name'], p['path'])) - from workspace_startup_registry import read_registry, ordered_projects - saved = read_registry(root) - identities = {p['uuid'] for p in projects} + projects, last = _combined_projects(projects, root, current_project) return {'current_project_uuid': next((p['uuid'] for p in projects if p['current']), None), - 'projects': ordered_projects(projects, saved), 'managed_root': str(root), + 'projects': projects, 'managed_root': str(root), 'workspace_initialized': (root / '.rieke-workspace.json').is_file(), - 'last_project_uuid': saved.get('last_project_uuid') if saved.get('last_project_uuid') in identities and counts.get(saved.get('last_project_uuid')) == 1 else None} + **last} -def create_project(root, name, *, directory=None, code_root=None): +def create_project(root, name, *, directory=None, code_root=None, _lock_path=None): """Create only empty manifests/directories. Database provisioning is deferred.""" import fcntl import re import datetime as dt + from contextlib import ExitStack from recording_workspace import write_json from workspace_storage import initialize_layout root = managed_root(root) @@ -145,12 +180,13 @@ def create_project(root, name, *, directory=None, code_root=None): raise ValueError('Project name must contain 1–120 printable characters') name = name.strip() root.mkdir(parents=True, exist_ok=True) - lock_file = root / '.project-create.lock' + lock_file = Path(_lock_path) if _lock_path is not None else root / '.project-create.lock' if lock_file.is_symlink(): raise ValueError('Project registry lock cannot be a symbolic link') - with lock_file.open('a') as lock: + with lock_file.open('a') as lock, ExitStack() as target_locks: fcntl.flock(lock.fileno(), fcntl.LOCK_EX) - if any(p['name'].casefold() == name.casefold() for p in list_managed_projects(root)['projects']): + if _lock_path is None and any(p['available'] and Path(p['path']).parent == root and p['name'].casefold() == name.casefold() + for p in list_managed_projects(root)['projects']): raise ValueError('A project with this name already exists; open it or choose another name') identity = str(uuid.uuid4()) slug = re.sub(r'[^a-z0-9]+', '-', name.casefold()).strip('-')[:60] or 'project' @@ -164,6 +200,11 @@ def create_project(root, name, *, directory=None, code_root=None): target = target.resolve() if target.is_relative_to(code_root) or code_root.is_relative_to(target): raise ValueError('Project storage must be separate from application code') + if _lock_path is None: + # Managed-root and exact-folder routes must share a target lock. + # The root lock still serializes automatic names across siblings. + target_lock = target_locks.enter_context(_creation_lock_path(target).open('a')) + fcntl.flock(target_lock.fileno(), fcntl.LOCK_EX) if target.exists() and (not target.is_dir() or any(target.iterdir())): raise ValueError('Project folder already contains files; nothing was overwritten') target.mkdir(exist_ok=True) @@ -191,6 +232,19 @@ def create_project(root, name, *, directory=None, code_root=None): return _project_record(target) +def _creation_lock_path(directory): + from workspace_startup_registry import project_index_path + import hashlib + preference_root = project_index_path().parent + if preference_root.is_symlink(): + raise ValueError('Local project preferences cannot be a symbolic link') + preference_root.mkdir(parents=True, exist_ok=True) + lock = preference_root / ('project-create-' + hashlib.sha256(str(directory).encode()).hexdigest()[:32] + '.lock') + if lock.is_symlink(): + raise ValueError('Project creation lock cannot be a symbolic link') + return lock + + def create_project_at(directory, name, *, code_root=None): """Use the user's exact project folder, independently of preferred storage.""" if not isinstance(directory, str) or not directory.strip(): @@ -204,4 +258,4 @@ def create_project_at(directory, name, *, code_root=None): # System paths such as macOS /tmp may have a symlinked parent. Resolve # the selected location after rejecting a symlink at the project itself. path = path.resolve() - return create_project(path.parent, name, directory=str(path), code_root=code) + return create_project(path.parent, name, directory=str(path), code_root=code, _lock_path=_creation_lock_path(path)) diff --git a/python/workspace_service.py b/python/workspace_service.py index ba4b8ac..4e86cdb 100644 --- a/python/workspace_service.py +++ b/python/workspace_service.py @@ -158,7 +158,8 @@ def __init__(self, project_dir, curation_provider=None): raise ValueError('Project transfer restore is incomplete; finish recovery before opening it') config = json.loads((self.project_dir / 'catalog.json').read_text()) if config.get('connection', {}).get('credential_provider', {}).get('kind') == 'native-project': - from workspace_portability import rebase_project_paths + from workspace_portability import rebase_project_paths, register_empty_project + register_empty_project(self.project_dir) rebase_project_paths(self.project_dir) self.curation_provider = curation_provider self._loaded = False diff --git a/python/workspace_startup_registry.py b/python/workspace_startup_registry.py index 70f15a2..914be9e 100644 --- a/python/workspace_startup_registry.py +++ b/python/workspace_startup_registry.py @@ -3,6 +3,8 @@ import json import uuid import fcntl +import os +import tempfile from recording_workspace import write_json @@ -49,3 +51,153 @@ def ordered_projects(projects, saved): ranks = {path: index for index, path in enumerate(paths)} if isinstance(paths, list) and all(isinstance(path, str) for path in paths) else {} return sorted(projects, key=lambda item: (ranks.get(item['path'], len(ranks)), item['name'].casefold(), item['name'], item['path'])) + + +PROJECT_INDEX_FORMAT = 'rieke-local-projects' +PROJECT_INDEX_LIMIT = 1024 * 1024 + + +def project_index_path(): + """Local OS-user discovery state, independent of project and application roots.""" + override = os.environ.get('RIEKE_PROJECT_INDEX') + if override: + path = Path(override).expanduser() + elif os.environ.get('RIEKE_DESKTOP_USER_STATE'): + path = Path(os.environ['RIEKE_DESKTOP_USER_STATE']).expanduser() / 'preferences/project-index.json' + else: + path = Path(os.environ.get('RIEKE_PREFERENCES_DIR', Path.home() / '.rieke-os')).expanduser() / 'project-index.json' + if not path.is_absolute(): + raise ValueError('Local project index must use an absolute path') + if path.is_symlink(): + raise ValueError('Local project index cannot be a symbolic link') + # macOS /tmp and /var are system aliases. Preserve the selected filename + # while canonicalizing its parent, rather than rejecting normal OS paths. + return path.parent.resolve() / path.name + + +def _path_string(value): + if (not isinstance(value, str) or not value or len(value) > 4096 or '\0' in value + or not Path(value).is_absolute() or '..' in Path(value).parts + or str(Path(value)) != value): + raise ValueError('Local project references must be normalized absolute folders') + return value + + +def _validate_project_index(value): + if (not isinstance(value, dict) or set(value) != {'format', 'version', 'projects', 'last_project_path', 'project_order'} + or value['format'] != PROJECT_INDEX_FORMAT or type(value['version']) is not int or value['version'] != 1 + or not isinstance(value['projects'], list) or len(value['projects']) > 1000 + or not isinstance(value['project_order'], list) or len(value['project_order']) > 1000): + raise ValueError('Local project index is invalid; preserve it and repair its configuration') + seen = set() + for project in value['projects']: + if not isinstance(project, dict) or set(project) != {'path', 'project_uuid', 'name', 'database_kind'}: + raise ValueError('Local project index contains an invalid project record') + path = _path_string(project['path']) + if path in seen: + raise ValueError('Local project index contains duplicate folder references') + seen.add(path) + if (not isinstance(project['project_uuid'], str) or str(uuid.UUID(project['project_uuid'])) != project['project_uuid'] + or not isinstance(project['name'], str) or not 1 <= len(project['name'].strip()) <= 200 + or not isinstance(project['database_kind'], str) or project['database_kind'] not in {'native-mysql', 'legacy-mysql'}): + raise ValueError('Local project index identity or display fields are invalid') + order = [_path_string(path) for path in value['project_order']] + if len(set(order)) != len(order): + raise ValueError('Local project order contains duplicate folders') + if value['last_project_path'] is not None: + _path_string(value['last_project_path']) + if value['last_project_path'] not in seen: + raise ValueError('Last-open project is missing from the local project index') + return value + + +def read_project_index(): + path = project_index_path() + if path.is_symlink(): + raise ValueError('Local project index cannot be a symbolic link') + if not path.exists(): + return {'format': PROJECT_INDEX_FORMAT, 'version': 1, 'projects': [], + 'last_project_path': None, 'project_order': []} + if not path.is_file() or path.stat().st_size > PROJECT_INDEX_LIMIT: + raise ValueError('Local project index is invalid or unexpectedly large') + return _validate_project_index(json.loads(path.read_text())) + + +def _update_project_index(change): + path = project_index_path() + if path.is_symlink() or path.parent.is_symlink(): + raise ValueError('Local project index cannot be a symbolic link') + path.parent.mkdir(parents=True, exist_ok=True) + lock_path = path.with_suffix('.lock') + if lock_path.is_symlink(): + raise ValueError('Local project index lock cannot be a symbolic link') + with lock_path.open('a') as lock: + fcntl.flock(lock.fileno(), fcntl.LOCK_EX) + value = _validate_project_index(change(read_project_index())) + content = json.dumps(value, sort_keys=True, indent=2, allow_nan=False).encode() + b'\n' + if len(content) > PROJECT_INDEX_LIMIT: + raise ValueError('Local project index is unexpectedly large') + fd, temporary = tempfile.mkstemp(prefix='.project-index-', dir=path.parent) + try: + with os.fdopen(fd, 'wb') as handle: + handle.write(content) + handle.flush() + os.fsync(handle.fileno()) + os.replace(temporary, path) + finally: + Path(temporary).unlink(missing_ok=True) + return value + + +def remember_project_path(directory, identity=None, *, set_last=False, previous_directory=None): + """Remember one explicitly created/opened folder; never inspect its neighbors.""" + from workspace_projects import _project_record + directory = Path(directory).expanduser() + if not directory.is_absolute() or directory.is_symlink() or not directory.is_dir(): + raise ValueError('Remember an existing regular project folder by its absolute path') + record = _project_record(directory.resolve()) + if identity is not None and record['uuid'] != str(uuid.UUID(identity)): + raise ValueError('Remembered project identity disagrees with its folder') + entry = {'path': record['path'], 'project_uuid': record['uuid'], 'name': record['name'], + 'database_kind': 'native-mysql' if record.get('database_kind') == 'native-mysql' else 'legacy-mysql'} + previous = None + if previous_directory is not None: + previous = Path(previous_directory).expanduser() + if not previous.is_absolute(): + raise ValueError('Previous project folder must be absolute') + previous = str(previous.resolve()) + + def update(value): + value['projects'] = [project for project in value['projects'] if project['path'] not in {entry['path'], previous}] + value['projects'].append(entry) + if previous and previous != entry['path']: + value['project_order'] = [entry['path'] if path == previous else path for path in value['project_order'] if path != entry['path']] + if set_last or (previous is not None and value['last_project_path'] == previous): + value['last_project_path'] = entry['path'] + return value + return _update_project_index(update) + + +def remember_project_paths_order(paths): + """Preserve global path order across preferred locations and copied UUIDs.""" + if not isinstance(paths, list) or len(paths) > 1000: + raise ValueError('Project order must be a bounded folder list') + paths = [_path_string(path) for path in paths] + if len(set(paths)) != len(paths): + raise ValueError('Project order cannot contain duplicate folders') + return _update_project_index(lambda value: {**value, 'project_order': paths}) + + +def remember_project_result(directory, result, *, set_last=False, previous_directory=None): + """A failed discovery preference must not undo a completed project operation.""" + options = {} + if set_last: + options['set_last'] = True + if previous_directory is not None: + options['previous_directory'] = previous_directory + try: + remember_project_path(directory, **options) + except (OSError, ValueError) as error: + return {**result, 'registry_warning': + f'Project is ready at {directory}, but its project-list entry could not be saved: {error}'} + return result diff --git a/workspace-app/src/App.jsx b/workspace-app/src/App.jsx index 567cf20..69e2146 100644 --- a/workspace-app/src/App.jsx +++ b/workspace-app/src/App.jsx @@ -1,3 +1,4 @@ +import {localProjectUrl} from './projectTransfer.js'; import {tagFilterLabel} from './protocolViewFilter.js'; import H5Inbox from './components/H5Inbox.jsx'; import ProjectClosedNotice from './components/ProjectClosedNotice.jsx'; @@ -139,4 +140,4 @@ export default function App(){ function searchEpoch(result){if(result.protocol_uuid)openInspection(result.protocol_uuid,result);else openQC(result.cell_uuid,result.epoch_uuid);} function searchPredicate(predicate){navigation.go('explore',{explorePredicate:predicate});} function changed(){setRevision(x=>x+1);} - const data=overview.data;const projectId=registry.data?.current_project_uuid || data?.project?.project_uuid;const registeredProjects=registry.data?.projects || [];const currentProject=registeredProjects.find(project=>project.current)||registeredProjects.find(project=>project.uuid===projectId);const projectName=data?.project?.display_name || currentProject?.name || data?.project?.name || 'Project';useEffect(()=>{document.title=isLauncher?'Rieke OS · Projects':`${projectName} · Rieke OS`;},[projectName,isLauncher]);async function selectProject(project){if(openingProject||!project.available)return;if(project.current){setPage('overview');return;}setOpeningProject(project.name);setProjectError('');try{const result=await api(project.path?'/projects/open-folder':`/projects/${project.uuid}/open`,{method:'POST',body:project.path?{directory:project.path}:{}});if(typeof result.url!=='string')throw new Error('The project service did not return an app URL.');const destination=new URL(result.url,window.location.href);if(!['http:','https:'].includes(destination.protocol)||!['127.0.0.1','localhost','[::1]'].includes(destination.hostname))throw new Error('The project service returned an invalid local URL.');window.location.assign(destination.href);}catch(error){setProjectError(error.message);setOpeningProject(null);}}const setup={setProjectSetup(false);setFolderOpen(true);}} onWorkspaceChanged={registry.reload} registry={registry.data} onSelect={selectProject} onCreated={async project=>{registry.reload();await selectProject(project);}} onCancel={isLauncher?undefined:()=>setProjectSetup(false)} createOnly={false} loading={!!openingProject} error={projectError||registry.error}/>;if(isLauncher)return
{setup}
{folderOpen&&setFolderOpen(false)} onTransferComplete={()=>registry.reload()}/>}
;return
/ {page==='protocol'?humanize(data?.protocols?.find(p=>p.protocol_uuid===protocol)?.name):page==='explore'?'Search predicate':page==='import'?'Add data store':page==='stores'?'Data stores':page==='cell-qc'?'Cell QC':humanize(page)}openQC(result.cell_uuid,result.epoch_uuid)} onPredicate={searchPredicate}/> Local workspace
{reviewImportJob&&}setPage('import')}/>
{folderOpen&&setFolderOpen(false)} onFiles={()=>setPage('files')}/>}{projectSetup&&
{setup}
}{openingProject&&
Opening {openingProject}…
}{projectError&&
{projectError}
}{page==='cell-qc'?navigation.canBack?navigation.back():setPage('overview')}/>:page==='stores'?setPage('import')} onProtocol={navigate} onFiles={()=>setPage('files')} onLogs={()=>setPage('activity')}/>:!data?:page==='overview'?setPage('import')} onExplore={()=>explore()}/>:page==='explore'?explore(null,{},true)} onExit={()=>explore()} key={route.key} session={sessions.current.get(route.key) || (route.resumeExplorer?lastExplorerSession.current:null)} onSession={rememberExplorer} initialPredicate={explorePredicate} initialRevisionId={exploreRevisionId} initialExportIntent={exploreExportIntent} initialProtocolId={exploreTargetId} onProtocolApplied={protocolApplied} onChange={changed} revision={revision} protocols={data.protocols || []} onInspect={openInspection}/>:page==='protocol'?item.protocol_uuid===protocol)} suggestionsError={suggestionsResource.error} onRetrySuggestions={suggestionsResource.reload} initialRecipe={initialRecipe} initialInspection={initialInspection} onRefine={explore} onReviewCandidate={reviewCandidate} onStores={()=>setPage('stores')} id={protocol} revision={revision} onChange={changed} onImport={()=>setPage('import')}/>:page==='activity'?:page==='files'?setPage('stores')}/>:page==='import'?setPage('stores')} jobs={importJobs} suggestions={suggestionsResource.data?.suggestions||[]} approvedHistory={suggestionsResource.data?.approved_history||[]} suggestionsError={suggestionsResource.error} onRetrySuggestions={suggestionsResource.reload} onReviewCandidate={reviewCandidate} onProtocol={navigate}/>:}
;} + const data=overview.data;const projectId=registry.data?.current_project_uuid || data?.project?.project_uuid;const registeredProjects=registry.data?.projects || [];const currentProject=registeredProjects.find(project=>project.current)||registeredProjects.find(project=>project.uuid===projectId);const projectName=data?.project?.display_name || currentProject?.name || data?.project?.name || 'Project';useEffect(()=>{document.title=isLauncher?'Rieke OS · Projects':`${projectName} · Rieke OS`;},[projectName,isLauncher]);async function selectProject(project){if(openingProject||!project.available)return;if(project.current){setPage('overview');return;}setOpeningProject(project.name);setProjectError('');try{const result=await api(project.path?'/projects/open-folder':`/projects/${project.uuid}/open`,{method:'POST',body:project.path?{directory:project.path}:{}});window.location.assign(localProjectUrl(result.url,window.location.href));}catch(error){setProjectError(error.message);setOpeningProject(null);}}const setup={setProjectSetup(false);setFolderOpen(true);}} onWorkspaceChanged={registry.reload} registry={registry.data} onSelect={selectProject} onCreated={async project=>{registry.reload();await selectProject(project);}} onCancel={isLauncher&&projectSetup!=='create'?undefined:()=>setProjectSetup(false)} createOnly={projectSetup==='create'} loading={!!openingProject} error={projectError||registry.error}/>;if(isLauncher)return
setFolderOpen({mode:'prepare',directory})}/>{setup}
{folderOpen&&setFolderOpen(false)} onTransferComplete={()=>registry.reload()}/>}
;return
/ {page==='protocol'?humanize(data?.protocols?.find(p=>p.protocol_uuid===protocol)?.name):page==='explore'?'Search predicate':page==='import'?'Add data store':page==='stores'?'Data stores':page==='cell-qc'?'Cell QC':humanize(page)}openQC(result.cell_uuid,result.epoch_uuid)} onPredicate={searchPredicate}/> Local workspace
{reviewImportJob&&}setPage('import')}/>
{folderOpen&&setFolderOpen(false)} onFiles={()=>setPage('files')} onTransferComplete={()=>registry.reload()}/>}{projectSetup&&
{setup}
}{openingProject&&
Opening {openingProject}…
}{projectError&&
{projectError}
}{page==='cell-qc'?navigation.canBack?navigation.back():setPage('overview')}/>:page==='stores'?setPage('import')} onProtocol={navigate} onFiles={()=>setPage('files')} onLogs={()=>setPage('activity')}/>:!data?:page==='overview'?setPage('import')} onExplore={()=>explore()}/>:page==='explore'?explore(null,{},true)} onExit={()=>explore()} key={route.key} session={sessions.current.get(route.key) || (route.resumeExplorer?lastExplorerSession.current:null)} onSession={rememberExplorer} initialPredicate={explorePredicate} initialRevisionId={exploreRevisionId} initialExportIntent={exploreExportIntent} initialProtocolId={exploreTargetId} onProtocolApplied={protocolApplied} onChange={changed} revision={revision} protocols={data.protocols || []} onInspect={openInspection}/>:page==='protocol'?item.protocol_uuid===protocol)} suggestionsError={suggestionsResource.error} onRetrySuggestions={suggestionsResource.reload} initialRecipe={initialRecipe} initialInspection={initialInspection} onRefine={explore} onReviewCandidate={reviewCandidate} onStores={()=>setPage('stores')} id={protocol} revision={revision} onChange={changed} onImport={()=>setPage('import')}/>:page==='activity'?:page==='files'?setPage('stores')}/>:page==='import'?setPage('stores')} jobs={importJobs} suggestions={suggestionsResource.data?.suggestions||[]} approvedHistory={suggestionsResource.data?.approved_history||[]} suggestionsError={suggestionsResource.error} onRetrySuggestions={suggestionsResource.reload} onReviewCandidate={reviewCandidate} onProtocol={navigate}/>:}
;} diff --git a/workspace-app/src/components/ExportSelectionDialog.jsx b/workspace-app/src/components/ExportSelectionDialog.jsx index c38ca62..dfb24a9 100644 --- a/workspace-app/src/components/ExportSelectionDialog.jsx +++ b/workspace-app/src/components/ExportSelectionDialog.jsx @@ -4,21 +4,23 @@ import CandidateExportPanel from './CandidateExportPanel.jsx'; import ProtocolApplyPanel from './ProtocolApplyPanel.jsx'; import NewPinnedProtocol from './NewPinnedProtocol.jsx'; import {exportProtocolGroups,pinProtocolPreference} from '../exportProtocolTargets.js'; +import {useProjectPreference} from '../useProjectPreference.js'; import './ExportSelectionDialog.css'; export default function ExportSelectionDialog({candidate,protocols,projectId,initialProtocolId,defaultName,defaultFormat,disabled,onClose,onApplied,onChanged}){ const dialog=useRef(null),[mode,setMode]=useState(null),[busy,setBusy]=useState(false),[pinError,setPinError]=useState(''),[appliedId,setAppliedId]=useState(null); - const key=`rieke-os.sidebar.protocols.v1.${projectId}`; - function preferences(){try{const value=JSON.parse(localStorage.getItem(key)||'{}');return value&&typeof value==='object'&&!Array.isArray(value)?value:{};}catch{return {};}} - const groups=exportProtocolGroups(protocols,preferences(),initialProtocolId); + const shortcuts=useProjectPreference(projectId,'protocol_shortcuts'); + const groups=exportProtocolGroups(protocols,shortcuts.value,initialProtocolId); useEffect(()=>{const el=dialog.current;el.showModal();return()=>el.close();},[]); - function finishPin(id){ + async function finishPin(id){ + setAppliedId(id);setBusy(true); try{ if(!projectId)throw new Error('Project identity unavailable'); - localStorage.setItem(key,JSON.stringify(pinProtocolPreference(preferences(),id))); - window.dispatchEvent(new Event('rieke-protocol-shortcuts-changed')); + await shortcuts.update(previous=>pinProtocolPreference(previous,id)); + setPinError(''); onApplied?.(id); - }catch(error){setAppliedId(id);setPinError('Dataset updated, but the sidebar shortcut could not be saved. Retry pinning without applying the dataset again.');onChanged?.();} + }catch(error){setPinError('Dataset updated, but the sidebar shortcut could not be saved. Retry pinning without applying the dataset again.');onChanged?.();} + finally{setBusy(false);} } return {event.preventDefault();if(!busy)onClose();}}>

Export selection

diff --git a/workspace-app/src/components/MetadataExplorer.jsx b/workspace-app/src/components/MetadataExplorer.jsx index e62a8ff..c20623f 100644 --- a/workspace-app/src/components/MetadataExplorer.jsx +++ b/workspace-app/src/components/MetadataExplorer.jsx @@ -6,6 +6,7 @@ import SearchPresets from './SearchPresets.jsx'; import QueryPresetDialog from './QueryPresetDialog.jsx'; import {searchPresetPayload,validatePresetReceipt} from '../projectSearchPresets.js'; import {rememberSearch,predicateSummary} from '../searchPresets.js'; +import {useProjectPreference} from '../useProjectPreference.js'; import ExportSelectionDialog from './ExportSelectionDialog.jsx'; import PredicateDialog from './PredicateDialog.jsx'; import {predicateIdentity} from '../predicateIdentity.js'; @@ -35,12 +36,12 @@ export default function MetadataExplorer({initialEditorOpen=false,openRequest=0, const [step,setStep]=useState(saved?.step || 'filter'); const [epochToolbarTarget,setEpochToolbarTarget]=useState(null); const [editorOpen,setEditorOpen]=useState(()=>!initialRevisionId&&(!!initialPredicate||initialEditorOpen)); - const presetsKey=`rieke-os.search-presets.v1.${projectId}`; - const [presets,setPresets]=useState(()=>{try{const value=JSON.parse(localStorage.getItem(presetsKey)||'[]');return Array.isArray(value)?value.filter(item=>item?.predicate&&typeof item.id==='string').slice(0,100):[];}catch{return [];}}); + const shortcutPreferences=useProjectPreference(projectId,'recent_searches'); + const presets=shortcutPreferences.value; const [presetError,setPresetError]=useState(''); const [presetOffset,setPresetOffset]=useState(0),[activePreset,setActivePreset]=useState(saved?.activePreset||null),[presetDialog,setPresetDialog]=useState(null),[importedPreset,setImportedPreset]=useState(null); const projectPresets=useResource(`/search-presets?limit=50&offset=${presetOffset}`,revision); - function storePreset(entry){try{const next=rememberSearch(presets,entry);localStorage.setItem(presetsKey,JSON.stringify(next));setPresets(next);setPresetError('');}catch{setPresetError('The search ran, but its shortcut could not be saved on this device. Use Save query preset to record a named query in the project database.');}} + async function storePreset(entry){setPresetError('');await shortcutPreferences.update(previous=>rememberSearch(previous,entry)).catch(error=>setPresetError(`The search ran, but its shortcut could not be saved to the project: ${error.message}`));} const [resultsFromDraft,setResultsFromDraft]=useState(saved?.resultsFromDraft??true),[matchingNavigation,setMatchingNavigation]=useState(saved?.matchingNavigation||null),[destination,setDestination]=useState(initialExportIntent?'export':null); const [departedInitial,setDepartedInitial]=useState(false); const [initialCandidateLoading,setInitialCandidateLoading]=useState(!!initialRevisionId&&!saved?.applied); @@ -131,7 +132,7 @@ export default function MetadataExplorer({initialEditorOpen=false,openRequest=0, if(!result.recipe||!result.revision_uuid)throw new Error('The server did not return a recorded revision. Reload history before retrying.'); setApplied({...result,previewGeneration:generation,previewRevision:viewRevision});if(result.preview)setTree({data:result.preview,loading:false,error:null});if(notifyParent)onChange?.();setSplits(result.recipe.splits);setFilterSplits(result.recipe.splits);setPath([]);setTreeNavigation(null);setFocused(null);setStep(nextStep);setResultsFromDraft(false); if(kind==='filter'){setDraft(draftOf(result.recipe.predicate));setRestored(null);} - storePreset({name:body.name,predicate,splits:result.recipe.splits,matched_count:result.summary?.matched_count??result.preview?.matched_count}); + await storePreset({name:body.name,predicate,splits:result.recipe.splits,matched_count:result.summary?.matched_count??result.preview?.matched_count}); setHistoryVersion(value=>value+1);setHistoryOffset(0);setNotice(nextStep==='tree'?'':`Recorded revision ${result.revision_uuid.slice(0,8)}. Its query and exact epoch membership are preserved.`);return result; }catch(error){setError(error.message);}finally{setBusy(false);setBusyAction(null);} } @@ -149,13 +150,13 @@ export default function MetadataExplorer({initialEditorOpen=false,openRequest=0, const preset=await presetRecipe(item);if(controller.signal.aborted)return; const nextDraft=draftOf(preset.predicate),predicate=compilePredicate(nextDraft,catalog.data?.fields||null),grouping=preset.splits??'date,cell'; const nextName=preset.name&&preset.name!=='Metadata selection'?preset.name:predicateSummary(predicate); - if(action==='pin'){storePreset({...preset,name:nextName,pinned:!item.pinned});return;} + if(action==='pin'){await storePreset({...preset,name:nextName,pinned:!item.pinned});return;} if(action==='edit'){setActivePreset(item.preset_uuid?item:null);setImportedPreset(null);setDraft(nextDraft);setName(nextName);setFilterSplits(grouping);setRestored(null);setEditorOpen(true);return;} const result=await api('/explore/run',{method:'POST',body:{predicate,splits:grouping},signal:controller.signal}); if(controller.signal.aborted)return; setViewFilters({});setExcludedEpochs([]);setExportCandidate(null);setAnnotationHold(null);setActivePreset(item.preset_uuid?item:null);setImportedPreset(null);setDepartedInitial(true);setDraft(nextDraft);setName(nextName);setFilterSplits(grouping);setSplits(grouping);setRestored(null);setApplied(null);setTreeNavigation(null);setMatchingNavigation(null);setFocused(null);setDestination(null); setDraftPreview({data:result,loading:false,error:null,key:predicateIdentity({predicate,splits:grouping})});setResultsFromDraft(true);setStep('results');setEditorOpen(false); - storePreset({name:nextName,predicate,splits:grouping,matched_count:result.matched_count,cell_count:result.last_run.cell_count,lastRunAt:result.last_run.ran_at});projectPresets.reload(); + await storePreset({name:nextName,predicate,splits:grouping,matched_count:result.matched_count,cell_count:result.last_run.cell_count,lastRunAt:result.last_run.ran_at});projectPresets.reload(); }catch(error){if(!controller.signal.aborted)setError(error.message);}finally{if(!controller.signal.aborted)setBusy(false);} } async function pinProjectPreset(item){ @@ -231,7 +232,7 @@ export default function MetadataExplorer({initialEditorOpen=false,openRequest=0, if(signal.aborted)return; setViewFilters({});setExcludedEpochs([]);setExportCandidate(null);setAnnotationHold(null);setNotice('');setDraft(nextDraft);setDraftPreview({data:result,loading:false,error:null,key:predicateIdentity({predicate,splits:filterSplits})}); setMatchingNavigation(null);setResultsFromDraft(true);setFocused(null);setDestination(null);setStep('results');setEditorOpen(false); - storePreset({name:name==='Metadata selection'?predicateSummary(predicate):name,predicate,splits:filterSplits,matched_count:result.matched_count,cell_count:result.last_run.cell_count,lastRunAt:result.last_run.ran_at});projectPresets.reload(); + await storePreset({name:name==='Metadata selection'?predicateSummary(predicate):name,predicate,splits:filterSplits,matched_count:result.matched_count,cell_count:result.last_run.cell_count,lastRunAt:result.last_run.ran_at});projectPresets.reload(); } function showEpochResults(){ setFocused(null);setDestination(null); @@ -269,9 +270,10 @@ export default function MetadataExplorer({initialEditorOpen=false,openRequest=0,
} {hasViewFilter&&resultError&&
{resultError}
} {error&&
{error}
} + {step!=='filter'&&shortcutPreferences.error&&
{shortcutPreferences.error}
} {annotationHold&&
Annotations changed. The current epoch page and selection are retained; refresh results before exporting or applying this query.
} {notice&&
{notice}
} - {initialCandidateLoading?
Loading saved candidate…
:initialRevisionId&&!applied&&!departedInitial?
The saved candidate could not be loaded.
:step==='filter'&&!focused?usePreset(item,'edit')} onPin={item=>usePreset(item,'pin')}/>:step==='results'?
+ {initialCandidateLoading?
Loading saved candidate…
:initialRevisionId&&!applied&&!departedInitial?
The saved candidate could not be loaded.
:step==='filter'&&!focused?usePreset(item,'edit')} onPin={item=>usePreset(item,'pin')}/>:step==='results'?
{destination&&exportCandidate&&{setDestination(null);onChange?.();}} onApplied={onProtocolApplied} onChanged={()=>onChange?.()}/>} {!hasViewFilter&&resultError&&
{resultError}
} {!resultLoading&&!resultError&&resultPreview&&resultPredicate?searchEpochInclusion(epoch,excludedEpochs)} onToggleInclusion={toggleInclusion} toolbarTarget={epochToolbarTarget} viewFilters={viewFilters} onViewFilters={changeViewFilters} filterRevision={revision} filterDisabled={busy||!!annotationHold} onExport={openResultsExport} exportDisabled={exportDisabled} designDisabled={!!annotationHold||busy||resultLoading||!!resultError} actions={resultActions} onDesign={()=>{if(!annotationHold&&!busy&&!resultLoading&&!resultError)prepareDestination('tree');}} key={resultPreview.tree_revision} predicate={resultPredicate} splits={resultSplits} preview={resultPreview} session={matchingNavigation} onSession={setMatchingNavigation} onAnnotationsChanged={annotationsChanged} onTagFilter={predicate=>{setDraft(draftOf(predicate));setActivePreset(null);setEditorOpen(true);}} onRefresh={refreshResults}/>:} diff --git a/workspace-app/src/components/PredicateDialog.jsx b/workspace-app/src/components/PredicateDialog.jsx index 18cfec0..f43d4ba 100644 --- a/workspace-app/src/components/PredicateDialog.jsx +++ b/workspace-app/src/components/PredicateDialog.jsx @@ -2,6 +2,7 @@ import {useEffect,useMemo,useRef,useState} from 'react'; import {Search,Users,Activity,Clock3,X} from 'lucide-react'; import PredicateBuilder from './PredicateBuilder.jsx'; import {compilePredicate} from './predicateState.js'; +import {useProjectPreference} from '../useProjectPreference.js'; import {api,number,time} from '../api.js'; import {presetKey} from '../searchPresets.js'; import {Status} from './Common.jsx'; @@ -12,7 +13,8 @@ export default function PredicateDialog({draft:initialDraft,catalog,onSearch,onC const [preview,setPreview]=useState(previousRun?{run:previousRun,predicate:previousPredicate}:null); const [previewBusy,setPreviewBusy]=useState(false); const [draft,setDraft]=useState(initialDraft),[busy,setBusy]=useState(false),[error,setError]=useState(''); - const pinnedProtocols=useMemo(()=>{let preferences={};try{preferences=JSON.parse(localStorage.getItem(`rieke-os.sidebar.protocols.v1.${projectId}`)||'{}')||{};}catch{}return protocols.filter(protocol=>preferences[protocol.protocol_uuid]?.section==='pinned').sort((a,b)=>(preferences[a.protocol_uuid].rank||0)-(preferences[b.protocol_uuid].rank||0));},[protocols,projectId]); + const shortcuts=useProjectPreference(projectId,'protocol_shortcuts'); + const pinnedProtocols=useMemo(()=>protocols.filter(protocol=>shortcuts.value[protocol.protocol_uuid]?.section==='pinned').sort((a,b)=>(shortcuts.value[a.protocol_uuid].rank||0)-(shortcuts.value[b.protocol_uuid].rank||0)),[protocols,shortcuts.value]); const compiled=useMemo(()=>{try{return {predicate:compilePredicate(draft,catalog.data?.fields||null)};}catch(error){return {error:error.message};}},[draft,catalog.data]); useEffect(()=>{const el=dialog.current;el.showModal();return()=>{request.current?.abort();el.close();};},[]); async function previewMatches(){ diff --git a/workspace-app/src/components/ProjectClosedNotice.css b/workspace-app/src/components/ProjectClosedNotice.css new file mode 100644 index 0000000..9df5544 --- /dev/null +++ b/workspace-app/src/components/ProjectClosedNotice.css @@ -0,0 +1,3 @@ +.project-closed-notice.compact{display:flex;align-items:center;gap:12px;width:min(800px,calc(100% - 32px));max-width:800px;margin:0 auto 16px;padding:13px 15px;border:1px solid var(--border,#ded7e4);border-radius:11px;background:var(--surface,#fff);color:var(--ink,#302b36)} +.project-closed-icon{display:grid;place-items:center;width:38px;height:40px;flex-shrink:0;background:var(--accent-soft,#eee5f4);color:var(--accent,#67447d);border-radius:9px}.project-closed-identity{flex:1;min-width:0}.project-closed-identity>small{display:flex;align-items:center;gap:4px;font-size:10px;color:var(--ink-muted,#706478)}.project-closed-identity>strong{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:600;margin-top:2px;color:var(--ink-secondary,#62566d)}.project-closed-notice.compact>button.primary{padding:8px 11px;font-size:11px}.project-closed-notice.compact>button.icon-button{padding:6px;border:0;background:transparent;flex-shrink:0;color:var(--ink-muted)}.project-closed-notice.compact>button.icon-button:hover{background:var(--surface-subtle,#f7f4f9);color:var(--accent)}.project-closed-copy-error{display:flex;align-items:center;gap:8px;flex-basis:100%;font-size:11px;color:var(--error-ink,#963f3f)}.project-closed-copy-error>input{min-width:0;flex:1;padding:6px;font-size:11px}.project-closed-notice.compact:has(.project-closed-copy-error){flex-wrap:wrap} +@media(max-width:600px){.project-closed-notice.compact{width:100%;flex-wrap:wrap;padding:12px;gap:9px}.project-closed-identity{flex:1;min-width:0}.project-closed-notice.compact>button.primary{order:5;width:100%}.project-closed-copy-error{order:6}} diff --git a/workspace-app/src/components/ProjectClosedNotice.jsx b/workspace-app/src/components/ProjectClosedNotice.jsx index 1a10e8a..d7c218c 100644 --- a/workspace-app/src/components/ProjectClosedNotice.jsx +++ b/workspace-app/src/components/ProjectClosedNotice.jsx @@ -1,10 +1,13 @@ import {useState} from 'react'; +import {Check,Copy,FolderCheck,Package,X} from 'lucide-react'; +import './ProjectClosedNotice.css'; -export default function ProjectClosedNotice(){ +export default function ProjectClosedNotice({onPrepare}){ const [path,setPath]=useState(()=>new URLSearchParams(window.location.search).get('closed_project')); const [copied,setCopied]=useState(false),[error,setError]=useState(''); if(!path)return null; - async function copy(){try{await navigator.clipboard.writeText(path);setCopied(true);}catch{setError('Select the folder path below and copy it.');}} + const name=path.replace(/\/+$/,'').split('/').pop()||path; + async function copy(){try{await navigator.clipboard.writeText(path);setCopied(true);setError('');}catch{setError('Copy the path here:');}} function dismiss(){setPath(null);const url=new URL(window.location.href);url.searchParams.delete('closed_project');window.history.replaceState(window.history.state,'',url);} - return
Project closed

You can now copy the entire folder. On the other computer, choose Open project and select that folder.

{path}

Include all project files. Older linked recordings must also be available.

{error&&

{error}

}
; + return
{name}
{onPrepare&&}{error&&
{error}event.target.select()}/>
}
; } diff --git a/workspace-app/src/components/ProjectFolder.css b/workspace-app/src/components/ProjectFolder.css index 18a3c77..bb264e8 100644 --- a/workspace-app/src/components/ProjectFolder.css +++ b/workspace-app/src/components/ProjectFolder.css @@ -1,3 +1,47 @@ -.project-folder-dialog{width:min(650px,calc(100vw - 32px));max-height:calc(100dvh - 40px);overflow:auto;padding:28px;border:1px solid #ded7e4;border-radius:16px;color:#392f41;background:#fff;box-shadow:0 20px 80px #30253633}.project-folder-dialog::backdrop{background:#30253666}.project-folder-dialog>header,.project-folder-heading,.project-folder-name,.project-folder-actions,.project-folder-path,.project-folder-input-row,.project-folder-bottom{display:flex;align-items:center;gap:12px}.project-folder-dialog>header{justify-content:space-between;margin-bottom:24px}.project-folder-symbol{display:grid;place-items:center;width:44px;height:44px;border-radius:12px;background:#eee6f4;color:#77538b}.project-folder-heading small{font-size:10px;font-weight:600;letter-spacing:1.3px;color:#8c789a}.project-folder-heading h2{font-size:20px;margin:4px 0 0}.project-folder-dialog h3{font-size:15px;margin:0}.project-folder-dialog p{font-size:12px;line-height:1.65;color:#786b81;margin:0}.project-folder-current{padding:20px;background:#f8f5fa;border:1px solid #e8dfee;border-radius:12px;margin-bottom:26px}.project-folder-name{justify-content:space-between;flex-wrap:wrap}.project-folder-state{display:flex;align-items:center;gap:6px;font-size:11px;color:#587462}.project-folder-state>span{width:6px;height:6px;background:#6c937a;border-radius:50%}.project-folder-path{margin:14px 0 16px;background:#fff;border:1px solid #e8e0ed;border-radius:7px;padding:8px 10px;justify-content:space-between;min-width:0}.project-folder-path code,.project-folder-success code{font:12px/1.6 ui-monospace,SFMono-Regular,monospace;overflow-wrap:anywhere;user-select:all;min-width:0}.project-folder-path>.icon-button{flex-shrink:0}.project-folder-actions{flex-wrap:wrap;margin-bottom:14px}.project-folder-actions button{font-size:12px}.project-folder-actions .project-folder-close{margin-left:auto;border-color:#c9b8d4;color:#624777;background:#fff}.project-folder-close:hover{background:#eee6f4}.project-folder-dialog form{display:flex;flex-direction:column;gap:10px}.project-folder-open>div:first-child{margin-bottom:6px}.project-folder-open p{margin-top:6px}.project-folder-dialog label{font-size:12px;font-weight:550}.project-folder-dialog input{width:100%;min-width:0;font-size:12px;padding:11px 12px}.project-folder-input-row{gap:8px;align-items:stretch}.project-folder-input-row button{white-space:nowrap;flex-shrink:0}.project-folder-advanced{border-top:1px solid #ece5f0;margin-top:26px;padding-top:18px}.project-folder-advanced>summary{display:flex;align-items:center;gap:10px;cursor:pointer;font-size:12px;font-weight:550;color:#70567f;list-style:none}.project-folder-advanced>summary:after{content:'+';margin-left:auto;font-size:20px;font-weight:400}.project-folder-advanced[open]>summary:after{content:'−'}.project-folder-advanced summary small{display:block;font-size:11px;font-weight:400;margin-top:4px;color:#92839c}.project-folder-modes{display:flex;gap:6px;margin:20px 0 16px}.project-folder-modes button{font-size:12px}.project-folder-modes button[aria-pressed=true]{color:#64447b;border-color:#bda7cd;background:#f1eaf7}.project-folder-dialog footer{display:flex;justify-content:flex-end;margin-top:4px}.project-folder-progress{display:flex;align-items:flex-start;gap:8px;padding:12px!important;background:#f4eef8;border-radius:8px;margin-top:18px!important}.project-folder-progress svg{flex-shrink:0;margin-top:2px}.project-folder-dialog .project-folder-error{color:#963f3f;background:#fff1eb;padding:12px;border-radius:8px;margin-top:16px}.project-folder-success{display:flex;flex-direction:column;align-items:flex-start;gap:10px;padding:14px;border:1px solid #bfd7c8;background:#f2f8f4;border-radius:9px;min-width:0}.project-folder-success strong{display:flex;align-items:center;gap:7px;font-size:13px;color:#38634a}.project-folder-bottom{justify-content:space-between;margin-top:24px;padding-top:16px;border-top:1px solid #eee7f2}.project-folder-bottom>span{font-size:11px;color:#95869e}.project-folder-bottom button{font-size:12px}@media(max-width:560px){.project-folder-dialog{padding:20px}.project-folder-input-row{flex-direction:column}.project-folder-bottom>span{max-width:65%}.project-folder-current{padding:16px}} +.project-folder-dialog{width:min(600px,calc(100vw - 32px));max-height:calc(100dvh - 32px);overflow:auto;padding:24px;border:1px solid var(--border,#ded7e4);border-radius:15px;color:var(--ink,#392f41);background:var(--surface,#fff);box-shadow:0 20px 80px #30253633} +.project-folder-dialog::backdrop{background:#30253666} +.project-folder-dialog>header,.project-folder-heading,.project-folder-current,.project-folder-current-actions,.project-folder-input-row,.project-folder-dialog footer,.project-folder-bottom{display:flex;align-items:center;gap:10px} +.project-folder-dialog>header{justify-content:space-between;margin-bottom:18px} +.project-folder-symbol{display:grid;place-items:center;width:43px;height:43px;border-radius:11px;background:#eee6f4;color:#77538b} +.project-folder-heading small{font-size:9px;font-weight:600;letter-spacing:1.3px;color:#947fa3} +.project-folder-heading h2{font-size:19px;margin:4px 0 0;color:#634a72} +.project-folder-dialog h3{font-size:15px;margin:0;color:#695075} +.project-folder-dialog p{font-size:12px;line-height:1.5;color:#87738f;margin:0} +.project-folder-current{padding:12px;background:#f9f6fb;border:1px solid #e8dfee;border-radius:10px;margin-bottom:18px;gap:10px} +.project-folder-current-icon{display:grid;place-items:center;width:34px;height:34px;flex-shrink:0;border-radius:9px;background:#eee5f4;color:#9276a3} +.project-folder-current-info{min-width:0;flex:1}.project-folder-current-info>strong{font-size:12px;color:#715581;margin-right:8px;overflow-wrap:anywhere} +.project-folder-state{display:inline-flex;align-items:center;gap:5px;font-size:10px;color:#648170;white-space:nowrap}.project-folder-state>i{width:5px;height:5px;background:#7ba58c;border-radius:50%} +.project-folder-current-info>code{display:block;margin-top:5px;max-height:48px;overflow:auto;font:10px/1.5 ui-monospace,SFMono-Regular,monospace;overflow-wrap:anywhere;user-select:all;color:#947da3} +.project-folder-current-actions{gap:5px;flex-shrink:0}.project-folder-current-actions>button{font-size:10px;padding:6px 8px}.project-folder-current-actions>.icon-button{padding:5px} +.project-folder-tabs{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:5px;padding:5px;background:#f5f0f8;border:1px solid #e8deee;border-radius:11px} +.project-folder-tabs>button{justify-content:center;gap:9px;padding:11px 8px;border:1px solid transparent;color:#a08aad;background:transparent;font-size:12px;border-radius:7px} +.project-folder-tabs>button:hover:not(:disabled){color:#725285;background:#ede4f3} +.project-folder-tabs>button[aria-selected=true]{color:#705081;background:#fff;border-color:#d4c3e0;box-shadow:0 2px 5px #48315406} +.project-folder-task{padding:21px 0 0}.project-folder-task-title{margin-bottom:18px}.project-folder-task-title p{margin-top:5px;font-size:11px} +.project-folder-contents{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));padding:13px 2px;background:#fcfafd;border:1px solid #ede5f3;border-radius:10px;margin-bottom:20px} +.project-folder-contents>span{display:flex;flex-direction:column;align-items:center;gap:7px;color:#a087b1;border-right:1px solid #ede5f3}.project-folder-contents>span:last-child{border-right:0} +.project-folder-contents small{font-size:10px;color:#887096;text-align:center;line-height:1.3} +.project-folder-dialog form{display:flex;flex-direction:column;gap:9px}.project-folder-dialog label{font-size:11px;font-weight:550;color:#796187} +.project-folder-dialog input{width:100%;min-width:0;font-size:12px;padding:11px 12px;border-color:#e0d6e8;background:#fff} +.project-folder-input-row{align-items:stretch;gap:7px}.project-folder-input-row button{font-size:11px;white-space:nowrap;padding:8px 11px;flex-shrink:0} +.project-folder-input-hint{font-size:10px;line-height:1.4;color:#a08aaa} +.project-folder-dialog footer{justify-content:space-between;gap:10px;margin-top:10px;padding-top:14px;border-top:1px solid #ede5f3} +.project-folder-dialog footer>span{display:flex;align-items:center;gap:6px;font-size:10px;color:#9e87aa}.project-folder-dialog footer>button{font-size:12px} +.project-folder-organize{font-size:11px;margin-top:2px;color:#947a9f}.project-folder-organize>summary{display:flex;align-items:center;gap:5px;width:fit-content;cursor:pointer;list-style:none;padding:6px 0}.project-folder-organize[open]>summary svg{transform:rotate(90deg)} +.project-folder-organize .project-folder-checkbox{display:flex;align-items:center;gap:7px;font-weight:400;margin:8px 0 12px}.project-folder-organize input[type=checkbox]{width:auto;margin:0} +.project-folder-organize>input{margin-top:7px}.project-folder-organize>small{display:block;margin-top:7px;font-size:10px;line-height:1.5} +.project-folder-close-note{display:flex;align-items:center;gap:8px;border:1px solid #e1d6e9;background:#f9f5fc;border-radius:8px;padding:10px;color:#816391;font-size:11px;margin:2px 0 6px} +.project-folder-close-note>svg{flex-shrink:0}.project-folder-close-note>span{flex:1}.project-folder-close-note>button{font-size:10px;padding:6px 8px;flex-shrink:0} +.project-folder-inspection{display:flex;align-items:center;gap:10px;border:1px solid #d6e1d8;background:#f6faf7;border-radius:9px;padding:12px;margin:3px 0 6px} +.project-folder-inspection-icon{display:grid;place-items:center;width:34px;height:34px;background:#e8f1eb;color:#6b937c;border-radius:9px;flex-shrink:0}.project-folder-inspection>div{min-width:0}.project-folder-inspection strong{font-size:12px;color:#5f7a69;overflow-wrap:anywhere}.project-folder-inspection>div>span{display:flex;align-items:center;gap:5px;margin-top:5px;color:#8aa193;font-size:10px} +.project-folder-dialog .project-folder-warning{padding:9px 11px;background:#fbf5eb;border-radius:6px;color:#94794d;font-size:11px} +.project-folder-success{display:flex;flex-direction:column;align-items:center;text-align:center;gap:12px;padding:20px 16px;background:#f6faf7;border:1px solid #d3e1d7;border-radius:11px;min-width:0} +.project-folder-result-icon{display:grid;place-items:center;width:50px;height:50px;background:#e8f1eb;color:#6c957b;border-radius:14px}.project-folder-success>strong{font-size:15px;color:#577962} +.project-folder-success code{font:11px/1.6 ui-monospace,SFMono-Regular,monospace;overflow-wrap:anywhere;user-select:all;color:#7b9685}.project-folder-success>p{font-size:11px;color:#8aa192}.project-folder-success>button{font-size:12px} +.project-folder-progress{display:flex;align-items:flex-start;gap:8px;padding:11px;background:#f5eef9;border-radius:8px;margin-top:15px;color:#876895;font-size:11px}.project-folder-progress svg{flex-shrink:0;margin-top:2px}.project-folder-progress small{display:block;font-size:10px;margin-top:4px;color:#a18aad} +.project-folder-dialog .project-folder-error{color:#963f3f;background:#fff1eb;padding:11px;border-radius:8px;margin-top:15px;font-size:11px;overflow-wrap:anywhere} +.project-folder-bottom{justify-content:space-between;margin-top:18px;padding-top:13px;border-top:1px solid #eee7f2}.project-folder-bottom>span{font-size:10px;color:#a28cac}.project-folder-bottom button{font-size:11px;padding:7px 12px} +@media(max-width:560px){.project-folder-dialog{padding:19px;width:calc(100vw - 20px);max-height:calc(100dvh - 20px)}.project-folder-current{flex-wrap:wrap}.project-folder-current-info{min-width:70%}.project-folder-current-actions{margin-left:auto}.project-folder-current-actions>button{font-size:11px}.project-folder-tabs>button{padding:10px 5px;gap:7px}.project-folder-contents small{font-size:9px}.project-folder-dialog footer>span{max-width:42%;line-height:1.5}.project-folder-close-note{flex-wrap:wrap}.project-folder-close-note>button{margin-left:auto}} +@media(prefers-reduced-motion:reduce){.project-folder-dialog .spin{animation:none}} -.project-folder-organize{margin-top:16px;font-size:12px}.project-folder-organize summary{cursor:pointer;color:#786087}.project-folder-organize label{margin-top:12px}.project-folder-organize input[type=checkbox]{width:auto;margin-right:8px}.project-folder-organize small{display:block;line-height:1.5;color:#897994} +.project-folder-root-suggestions{display:grid;gap:8px;margin-top:17px;padding-top:14px;border-top:1px solid #ede5f3}.project-folder-root-suggestions>p{font-size:11px;margin-bottom:3px;color:#8a7198}.project-folder-root-suggestions>button{display:flex;align-items:center;gap:10px;padding:12px;text-align:left;white-space:normal;border:1px solid #dfd2e8;background:#fcfafd;border-radius:9px}.project-folder-root-suggestions>button>svg{color:#9779a7;flex-shrink:0}.project-folder-root-suggestions>button>span:nth-child(2){flex:1;min-width:0}.project-folder-root-suggestions strong{display:flex;align-items:center;gap:7px;flex-wrap:wrap;font-size:12px;color:#735582}.project-folder-root-suggestions strong>small{font-size:9px;font-weight:400;padding:2px 5px;border-radius:4px;background:#eee5f5;color:#997caf}.project-folder-root-suggestions code{display:block;overflow-wrap:anywhere;font:10px/1.5 ui-monospace,SFMono-Regular,monospace;color:#9983a5;margin-top:4px}.project-folder-root-suggestions .project-folder-use-root{display:flex;align-items:center;gap:5px;flex-shrink:0;font-size:10px;color:#8b6c9f}.project-folder-root-suggestions>button:hover:not(:disabled){background:#f5eef9;border-color:#c4acd4}@media(max-width:400px){.project-folder-root-suggestions>button{flex-wrap:wrap}.project-folder-root-suggestions .project-folder-use-root{margin-left:auto}} diff --git a/workspace-app/src/components/ProjectFolder.jsx b/workspace-app/src/components/ProjectFolder.jsx index 7608482..6b68e62 100644 --- a/workspace-app/src/components/ProjectFolder.jsx +++ b/workspace-app/src/components/ProjectFolder.jsx @@ -1,33 +1,55 @@ import {useEffect,useRef,useState} from 'react'; import {createPortal} from 'react-dom'; -import {Check,CheckCircle2,Copy,Files,FolderOpen,LoaderCircle,LogOut,Package,ArrowRight,X} from 'lucide-react'; +import {Activity,ArrowRight,Check,CheckCircle2,ChevronRight,Clock3,Copy,Database,Download,Files,FolderOpen,LoaderCircle,LogOut,Package,PackageOpen,Search,ShieldCheck,Tags,X} from 'lucide-react'; import {api} from '../api.js'; -import {localProjectUrl,runProjectTransfer} from '../projectTransfer.js'; +import {inspectAndOpenProject,localProjectUrl,runProjectTransfer} from '../projectTransfer.js'; import './ProjectFolder.css'; -export default function ProjectFolder({project,onClose,onFiles,initialMode='open',onTransferComplete,preferredRoot}){ +const tasks=[{mode:'open',label:'Open',icon:FolderOpen},{mode:'prepare',label:'Share',icon:Package},{mode:'restore',label:'Receive',icon:PackageOpen}]; +const contents=[{label:'Recordings',icon:Activity},{label:'Database',icon:Database},{label:'Saved queries',icon:Search},{label:'Tags',icon:Tags},{label:'History',icon:Clock3},{label:'Exports',icon:Download}]; + +export default function ProjectFolder({project,onClose,onFiles,initialMode='open',initialDirectory,onTransferComplete,preferredRoot}){ const dialog=useRef(null),requestController=useRef(null); - const [mode,setMode]=useState(initialMode==='restore'?'restore':'prepare'); - const [openPath,setOpenPath]=useState(''),[copied,setCopied]=useState(false),[relocate,setRelocate]=useState(false),[movePath,setMovePath]=useState(''); - const [directory,setDirectory]=useState(initialMode==='restore'?'':project?.path||''); - const [destination,setDestination]=useState(''); - const [busy,setBusy]=useState(false),[opening,setOpening]=useState(false),[closing,setClosing]=useState(false),[error,setError]=useState(''),[result,setResult]=useState(null); + const [mode,setMode]=useState(initialMode); + const [openPath,setOpenPath]=useState(initialMode==='open'?initialDirectory||'':''),[copied,setCopied]=useState(false),[relocate,setRelocate]=useState(false),[movePath,setMovePath]=useState(''); + const [directory,setDirectory]=useState(initialDirectory||(initialMode==='restore'?'':project?.path||'')); + const [destination,setDestination]=useState(''),[inspection,setInspection]=useState(null); + const [rootSuggestions,setRootSuggestions]=useState(null); + const [busy,setBusy]=useState(false),[opening,setOpening]=useState(false),[closing,setClosing]=useState(false),[checking,setChecking]=useState(false),[error,setError]=useState(''),[result,setResult]=useState(null); useEffect(()=>{const element=dialog.current;element.showModal();return()=>{requestController.current?.abort();element.close();};},[]); function chooseMode(next){ - setMode(next);setDirectory(next==='prepare'?project?.path||'':'');setDestination('');setError('');setResult(null); + setMode(next);setDirectory(next==='prepare'?project?.path||initialDirectory||'':'');setDestination('');setError('');setResult(null);setInspection(null);setRootSuggestions(null); + } + function chooseRoot(path){ + if(mode==='open')setOpenPath(path);else setDirectory(path); + setRootSuggestions(null);setInspection(null);setResult(null);setDestination('');setError(''); } - async function openDirectory(path){ - setBusy(true);setOpening(true);setError(''); + async function openDirectory(path,{allowRelocate=true}={}){ + setBusy(true);setOpening(true);setError('');setRootSuggestions(null); try{ - await api('/projects/inspect-folder',{method:'POST',body:{directory:path}}); - if(relocate){ - const moved=await api('/projects/relocate',{method:'POST',body:{directory:path,destination:movePath.trim()}}); - path=moved.directory;setOpenPath(path);setRelocate(false); + const response=await inspectAndOpenProject({directory:path,request:api,relocateDestination:allowRelocate&&relocate?movePath.trim():undefined}); + if(response.action==='choose-root'){ + setRootSuggestions(response.inspection);setBusy(false);setOpening(false);return; + } + if(response.action==='restore'){ + setMode('restore');setDirectory(path);setDestination('');setResult(null);setInspection(response.inspection);setBusy(false);setOpening(false); + return; } - const response=await api('/projects/open-folder',{method:'POST',body:{directory:path}}); + setOpenPath(response.directory);setRelocate(false); window.location.assign(localProjectUrl(response.url,window.location.href)); }catch(error){setError(error.message);setBusy(false);setOpening(false);} } + async function checkReceived(){ + if(busy||!directory.trim())return; + setBusy(true);setChecking(true);setError('');setInspection(null);setRootSuggestions(null); + try{ + const response=await api('/projects/inspect-folder',{method:'POST',body:{directory:directory.trim()}}); + if(response.kind==='project-root-suggestions'){setRootSuggestions(response);return;} + if(response.valid!==true)throw new Error('The folder did not pass inspection.'); + if(response.kind!=='prepared-transfer')throw new Error('This is a working project folder. Use the Open tab.'); + setInspection(response); + }catch(error){setError(error.message);}finally{setBusy(false);setChecking(false);} + } async function closeProject(){ if(busy)return; setBusy(true);setClosing(true);setError(''); @@ -38,52 +60,47 @@ export default function ProjectFolder({project,onClose,onFiles,initialMode='open }catch(error){setError(error.message);setBusy(false);setClosing(false);} } async function submit(event){ - event.preventDefault();if(busy||!directory.trim())return; - if(!destination.trim())return; + event.preventDefault();if(busy||!directory.trim()||!destination.trim()||(mode==='restore'&&!inspection))return; setBusy(true);setError('');setResult(null); try{ requestController.current=new AbortController(); const response=await runProjectTransfer({mode,directory:directory.trim(),destination:destination.trim(),request:api,signal:requestController.current.signal}); - setResult(response); - onTransferComplete?.({mode,...response}); - }catch(error){setError(`${error.message} If the connection was interrupted, inspect the destination before retrying.`);} + setResult(response);onTransferComplete?.({mode,...response}); + }catch(error){setError(`${error.message} Check the destination before retrying an interrupted transfer.`);} finally{setBusy(false);} } async function copyPath(){ - try{await navigator.clipboard.writeText(project.path);setCopied(true);}catch{setError('Could not copy the path. Select the folder path below and copy it.');} + try{await navigator.clipboard.writeText(project.path);setCopied(true);}catch{setError('Could not copy the path. Select the folder path and copy it.');} + } + function tabKeys(event,index){ + if(!['ArrowLeft','ArrowRight','Home','End'].includes(event.key)||busy)return; + event.preventDefault();const next=event.key==='Home'?0:event.key==='End'?tasks.length-1:(index+(event.key==='ArrowRight'?1:-1)+tasks.length)%tasks.length; + chooseMode(tasks[next].mode);dialog.current?.querySelector(`#project-task-${tasks[next].mode}`)?.focus(); } - const preparing=mode==='prepare'; + const preparing=mode==='prepare',needsClose=preparing&&project?.database_kind==='native-mysql'&&directory.trim()===project.path; + const progress=closing?'Closing project…':checking?'Checking portable copy…':opening?'Opening project…':preparing?'Preparing and verifying copy…':'Restoring and verifying project…'; return createPortal({event.preventDefault();if(!busy)onClose();}}> -
YOUR WORKSPACE

Project folder

- {project&&
-

{project.name||'Current project'}

Open here
-
{project.path||'Project folder unavailable'}{project.path&&}
-
{onFiles&&}{project.database_kind==='native-mysql'&&}
-

{project.database_kind==='native-mysql'?'To move or share this folder, close the project first, copy the folder, then open it in the receiving app. Linked recordings need to remain accessible.':'Your imports, saved work and exports live here. Recordings linked from another location stay in that location.'}

-
} -
{event.preventDefault();if(!busy&&openPath.trim()&&(!relocate||movePath.trim()))openDirectory(openPath.trim());}}> -

{project?'Open another project':'Open a project'}

Choose a project folder anywhere on this computer. Its required files are checked before opening. Opening in place is the default.

- -
{setOpenPath(event.target.value);setError('');}} placeholder="/Users/you/Research/my-project"/>
-
Optional: move to a preferred location -

Only closed projects can move. Keep the folder intact; moving across disks requires closing and copying it with your file manager.

- - {relocate&&} -
-
-
- {if(busy)event.preventDefault();}}>Advanced sharingInclude linked recordings or restore a prepared copy - -
- {setDirectory(event.target.value);setResult(null);}} placeholder="/absolute/path/to/project"/> -

{preparing?'Close the project before preparing it from the project chooser. This optional copy includes one project’s database and recordings. Closing a browser tab does not close the project.':'Select the prepared folder you received. Its files and database are verified before the new local project becomes available.'}

- {setDestination(event.target.value);setResult(null);}} placeholder="/absolute/path/to/new-folder"/> -

Choose a folder that does not yet exist. Large projects can take several minutes.

- {result?
{preparing?'Verified copy is ready':'Project restored and verified'}{result.directory}

{preparing?'Give the entire folder to the recipient. They can choose Advanced sharing → Open prepared copy.':'Your local project is ready to open.'}

{!preparing&&}
:
} -
-
- {busy&&

{closing?'Closing the project and stopping its database…':opening?'Opening project…':preparing?'Copying files and verifying the database backup…':'Verifying files and restoring the project…'} Keep this window open.

} +
PROJECTS

Project folder

+ {project&&
{project.name||'Current project'}Open here{project.path||'Folder unavailable'}
{project.path&&}{onFiles&&}{project.database_kind==='native-mysql'&&!needsClose&&}
} + +
+

{mode==='open'?'Add a project':preparing?'Make a portable copy':'Receive a portable copy'}

{mode==='open'?'Paste its top folder path, wherever it lives.':preparing?'Everything your colleague needs, in one folder.':'Check the received top folder, then restore locally.'}

+ {mode!=='open'&&
{contents.map(({label,icon:Icon})=>{label})}
} + {mode==='open'?
{event.preventDefault();if(!busy&&openPath.trim()&&(!relocate||movePath.trim()))openDirectory(openPath.trim());}}> + {setOpenPath(event.target.value);setError('');setRootSuggestions(null);}} placeholder="/Users/you/Research/Spike response study"/>Usually named for your project, with the project files directly inside. Choose this folder, not its parent or an inner folder. +
Optional: move before opening {relocate&&<>setMovePath(event.target.value)} placeholder={preferredRoot?`${preferredRoot}/my-project`:'/absolute/path/to/new-folder'}/>Closed projects only · destination must be new · same disk}
+
Checked before opening
+
:result?
{preparing?'Portable copy ready':'Project restored'}{result.directory}

{preparing?'Send this entire folder → recipient chooses Add new project.':'Recordings, saved work and history are ready.'}

{result.registry_warning&&

{result.registry_warning}

}{!preparing&&}
:
+
{setDirectory(event.target.value);setResult(null);setInspection(null);setError('');setRootSuggestions(null);}} placeholder="/absolute/path/to/project"/>{!preparing&&}
+ {needsClose&&
Close this project before sharing.
} + {inspection&&
{inspection.project?.name||'Project'} Files verified{Number.isFinite(inspection.source_count)?` · ${inspection.source_count} recording${inspection.source_count===1?'':'s'}`:''}
} + {inspection?.warnings?.map((warning,index)=>

{warning}

)} + {((preparing&&!needsClose)||inspection)&&<>{setDestination(event.target.value);setResult(null);}} placeholder="/absolute/path/to/new-folder"/>Choose a folder that does not exist yet.
{preparing?'Verification included':'Verified on restore'}
} +
} + {rootSuggestions&&

{rootSuggestions.message||'Choose the folder containing the project files.'}

{rootSuggestions.candidates?.filter(candidate=>typeof candidate.path==='string').map(candidate=>)}
} +
+ {busy&&
{progress}Keep this window open.
} {error&&

{error}

} -
{copied?'Project path copied':project?'Your project files stay on this computer.':'The app and your project files stay separate.'}
+
{copied?'Project path copied':'Your project · your files'}
,document.body); } diff --git a/workspace-app/src/components/ProjectNavigator.jsx b/workspace-app/src/components/ProjectNavigator.jsx index c9db3b3..ed28579 100644 --- a/workspace-app/src/components/ProjectNavigator.jsx +++ b/workspace-app/src/components/ProjectNavigator.jsx @@ -37,7 +37,7 @@ export function ProjectRail({projects=[],currentProjectUuid,onSelect,onAddProjec } return <>{error&&
Project order could not be saved: {error}
}; } export default function ProjectNavigator({projects=[],currentProjectUuid,loading=false,disabled=false,error=null,onRetry,onAddProject,onNewProject}){ diff --git a/workspace-app/src/components/ProjectOnboarding.css b/workspace-app/src/components/ProjectOnboarding.css index e45e627..65f8989 100644 --- a/workspace-app/src/components/ProjectOnboarding.css +++ b/workspace-app/src/components/ProjectOnboarding.css @@ -1,3 +1,16 @@ -.project-onboarding{width:min(720px,calc(100% - 48px));margin:48px auto;padding:32px;background:var(--surface,#fff);border:1px solid var(--border,#ded7e4);border-radius:12px;color:var(--ink,#302b36)}.project-onboarding>header{display:flex;align-items:center;gap:14px;margin-bottom:20px}.project-onboarding>header>button{margin-left:auto}.onboarding-mark{display:grid;place-items:center;background:#705780;color:#fff;width:46px;height:46px;border-radius:12px}.project-onboarding header small{font-size:11px;letter-spacing:1.4px;color:var(--ink-secondary,#62566d)}.project-onboarding h1{font-size:24px;margin-top:4px}.project-onboarding>p{font-size:14px;line-height:1.65;color:var(--ink-secondary,#62566d)}.project-onboarding form>label{display:flex;flex-direction:column;gap:8px;margin-top:23px;font-size:13px;font-weight:550}.project-onboarding form label small{font-size:12px;font-weight:400;color:var(--ink-secondary)}.project-onboarding input{padding:11px;font-size:14px}.onboarding-location{display:flex;align-items:flex-start;gap:10px;margin-top:20px;background:var(--surface-subtle,#f7f4f9);border-radius:6px;padding:13px;font-size:12px}.onboarding-location svg{flex-shrink:0}.onboarding-location strong,.onboarding-location small{display:block;overflow-wrap:anywhere;line-height:1.6}.onboarding-location small{margin-top:5px;color:var(--ink-secondary)}.project-onboarding footer,.onboarding-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:24px;flex-wrap:wrap}.onboarding-actions{justify-content:flex-start}.onboarding-error{background:#fff0ef;color:var(--error-ink,#963f3f);padding:13px;margin-top:20px;border-radius:6px;font-size:13px;line-height:1.6}.onboarding-project-list{margin-top:25px}.onboarding-project-list>button{width:100%;border:0;border-bottom:1px solid var(--border);border-radius:0;justify-content:flex-start;gap:12px;padding:15px 0;white-space:normal;text-align:left}.onboarding-project-list>button>span:nth-child(2){flex:1;min-width:0}.onboarding-project-list strong,.onboarding-project-list small{display:block}.onboarding-project-list small{font-size:12px;font-weight:400;color:var(--ink-secondary);overflow-wrap:anywhere;margin-top:5px}.onboarding-project-icon{display:grid;place-items:center;width:38px;height:38px;border-radius:9px;font-size:12px;flex-shrink:0}.onboarding-empty{display:flex;align-items:center;flex-direction:column;gap:12px;padding:38px 12px;color:var(--ink-secondary);font-size:13px;text-align:center}.onboarding-created{display:flex;flex-direction:column;gap:12px;margin-top:22px}.onboarding-created>span{overflow-wrap:anywhere;font-size:13px;color:var(--ink-secondary)}.onboarding-created button{align-self:flex-start}.creation-only{margin:24px auto} -.onboarding-root{display:flex;align-items:flex-start;gap:10px;padding:14px;margin:20px 0;border:1px solid var(--border);border-radius:8px;background:var(--surface-subtle,#f7f4f9)}.onboarding-root>svg{flex-shrink:0;margin-top:4px}.onboarding-root>div{min-width:0;flex:1}.onboarding-root small{display:block;letter-spacing:.8px;font-size:10px;color:var(--ink-secondary)}.onboarding-root strong{display:block;font-size:13px;overflow-wrap:anywhere;margin:5px 0}.onboarding-root span{font-size:12px;color:var(--ink-secondary)}.onboarding-root button{flex-shrink:0;padding:7px 9px;font-size:12px}.onboarding-root-form{padding:0 14px 16px;border-bottom:1px solid var(--border)}.onboarding-root-form p,.onboarding-profile-note{font-size:12px;line-height:1.6;color:var(--ink-secondary)} -.project-onboarding{width:min(800px,calc(100% - 32px));padding:34px;border-radius:16px;box-shadow:0 10px 36px #48315406}.project-onboarding>header{margin-bottom:14px}.project-onboarding h1{font-size:27px;letter-spacing:-.5px}.project-onboarding>p{max-width:620px;color:#83738e;font-size:13px}.onboarding-mark{width:48px;height:48px;border-radius:13px;background:#eee5f5;color:#78558c}.onboarding-main-actions{display:flex;gap:10px;margin:25px 0}.onboarding-main-actions button{padding:11px 16px;font-size:13px}.onboarding-root{background:#faf8fc;border-color:#e9e1ef;padding:15px;margin:0 0 26px}.onboarding-root strong{font:12px/1.6 ui-monospace,SFMono-Regular,monospace;color:#715c80}.onboarding-root span{font-size:11px;color:#92829d;line-height:1.6}.onboarding-root small{color:#9a85a8;font-size:9px;letter-spacing:1px}.onboarding-root>svg{color:#9b80ac}.onboarding-root button{background:#fff}.onboarding-list-heading{display:flex;justify-content:space-between;align-items:center;margin-top:28px}.onboarding-list-heading h2{font-size:13px;font-weight:600;color:#685175}.onboarding-list-heading>span{font-size:11px;color:#9a86a7}.onboarding-project-list{display:grid;gap:10px;margin-top:14px}.onboarding-project-list>button{padding:17px;border:1px solid #e9e1ef;border-radius:10px;background:#fff;transition:background .15s,border-color .15s}.onboarding-project-list>button:hover:not(:disabled){background:#fbf8fd;border-color:#cdb9da}.onboarding-project-list>button:disabled{opacity:.7}.onboarding-project-icon{width:43px;height:43px;border-radius:11px}.onboarding-project-info strong{display:flex;align-items:center;gap:9px;font-size:13px;color:#634970}.onboarding-project-info strong em{font-size:9px;font-style:normal;font-weight:500;background:#f1e9f7;color:#9673ac;padding:3px 6px;border-radius:4px}.onboarding-project-info small{font:11px/1.6 ui-monospace,SFMono-Regular,monospace;color:#9a83a8;word-break:break-word}.onboarding-project-info .onboarding-unavailable{font-family:inherit;color:#a26e62}.onboarding-project-open{display:flex;align-items:center;gap:6px;font-size:11px;color:#9c7cae;margin-left:auto;flex-shrink:0}.onboarding-profile-note{display:flex;gap:7px;align-items:flex-start;margin-top:25px;padding-top:20px;border-top:1px solid #eee7f3;font-size:11px;color:#9986a4}.onboarding-profile-note svg{flex-shrink:0;margin-top:2px}.onboarding-empty{margin-top:15px;border:1px dashed #ddcfe7;border-radius:10px;background:#fcfafd;padding:35px 20px;line-height:1.7}.onboarding-empty svg{color:#b499c4}.onboarding-empty span{max-width:410px;font-size:12px}.onboarding-root-form{margin-bottom:24px}.project-onboarding.creation-only{box-shadow:none}.onboarding-created{padding:20px;background:#f7f3fa;border-radius:10px}.onboarding-created>strong{font-size:16px}@media(max-width:600px){.project-onboarding{padding:24px 20px;width:100%;margin:35px auto}.project-onboarding h1{font-size:23px}.onboarding-project-list>button{padding:13px;gap:10px}.onboarding-project-open{font-size:0}.onboarding-project-info strong{flex-wrap:wrap}.onboarding-root{flex-wrap:wrap}.onboarding-root>div{min-width:70%}.onboarding-main-actions{flex-wrap:wrap}} +.project-onboarding{width:min(800px,calc(100% - 32px));margin:24px auto;padding:30px;background:var(--surface,#fff);border:1px solid var(--border,#ded7e4);border-radius:16px;box-shadow:0 10px 36px #48315406;color:var(--ink,#302b36)} +.project-onboarding>header{display:flex;align-items:center;gap:13px;margin-bottom:25px}.project-onboarding>header>button{margin-left:auto}.onboarding-mark{display:grid;place-items:center;width:48px;height:48px;border-radius:13px;background:var(--accent-soft,#eee5f4);color:var(--accent,#67447d)}.project-onboarding header small{font-size:10px;letter-spacing:1.5px;color:var(--ink-muted,#706478)}.project-onboarding h1{font-size:25px;letter-spacing:-.5px;margin:3px 0 0;font-weight:650} +.onboarding-main-actions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin:0 0 21px}.onboarding-main-actions>.onboarding-action-card{display:flex;align-items:center;justify-content:flex-start;gap:12px;padding:19px 15px;min-height:107px;text-align:left;white-space:normal;border:1px solid var(--border);border-radius:11px;background:var(--surface)}.onboarding-main-actions>.onboarding-action-card:hover:not(:disabled){background:var(--surface-subtle);border-color:#b7a2c4}.onboarding-action-card>span:nth-child(2){flex:1;min-width:0}.onboarding-action-card>svg{flex-shrink:0;color:var(--accent)}.onboarding-action-icon{display:grid;place-items:center;flex-shrink:0;width:43px;height:46px;background:var(--accent-soft);color:var(--accent);border-radius:11px}.onboarding-action-card strong{display:block;font-size:14px;line-height:1.45;font-weight:650;color:var(--ink)}.onboarding-action-card small{display:block;margin-top:5px;font-size:11px;line-height:1.4;color:var(--ink-muted)} +.onboarding-contents{padding:15px 17px;border:1px solid #eee7f3;border-radius:10px;background:var(--surface-subtle)}.onboarding-contents-caption{display:flex;align-items:center;gap:6px;font-size:10px;color:var(--ink-muted);margin-bottom:12px}.onboarding-contents>div{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}.onboarding-contents>div>span{display:flex;align-items:center;gap:8px;font-size:11px;color:var(--ink-secondary);white-space:nowrap}.onboarding-contents>div>span>svg{color:#8e70a0;flex-shrink:0} +.onboarding-list-heading{display:flex;justify-content:space-between;align-items:center;margin-top:25px;padding-bottom:9px}.onboarding-list-heading h2{font-size:13px;font-weight:650;color:var(--ink-secondary);margin:0}.onboarding-list-heading>span{display:grid;place-items:center;min-width:22px;height:21px;border-radius:5px;background:var(--surface-subtle);font-size:11px;color:var(--ink-muted)}.onboarding-project-list{display:grid;gap:7px}.onboarding-project-list>button{width:100%;display:flex;justify-content:flex-start;gap:12px;padding:12px 13px;text-align:left;white-space:normal;border:1px solid #e9e1ef;border-radius:9px;background:#fff}.onboarding-project-list>button:hover:not(:disabled){background:#fbf8fd;border-color:#cdb9da}.onboarding-project-icon{display:grid;place-items:center;width:39px;height:40px;border-radius:10px;flex-shrink:0}.onboarding-project-info{flex:1;min-width:0}.onboarding-project-info strong{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:600;color:var(--ink-secondary)}.onboarding-project-info strong em{font-size:9px;font-style:normal;font-weight:500;background:var(--accent-soft);color:var(--accent);padding:2px 6px;border-radius:4px}.onboarding-project-info small{display:block;margin-top:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px;line-height:1.5;color:var(--ink-muted)}.onboarding-project-info .onboarding-unavailable{white-space:normal;color:var(--error-ink);font-size:11px}.onboarding-project-open{color:#9271a6;flex-shrink:0}.onboarding-loading{display:flex;align-items:center;gap:7px;color:var(--ink-secondary);font-size:12px;margin:10px 0} +.onboarding-empty{display:flex;justify-content:center;align-items:center;gap:13px;padding:25px 16px;border:1px dashed var(--border);border-radius:9px;color:var(--ink-secondary);background:#fcfafd}.onboarding-empty>span{position:relative;display:grid;place-items:center;width:39px;height:40px;background:var(--accent-soft);color:#9272a4;border-radius:10px}.onboarding-empty>span>svg:last-child{position:absolute;right:3px;bottom:3px;background:var(--accent-soft);border-radius:3px}.onboarding-empty strong{display:block;font-size:12px;font-weight:600}.onboarding-empty small{display:block;font-size:11px;color:var(--ink-muted);margin-top:3px} +.onboarding-root{display:flex;align-items:center;gap:8px;border-top:1px solid #eee7f3;margin-top:22px;padding-top:15px;color:var(--ink-muted);font-size:11px}.onboarding-root>svg{flex-shrink:0}.onboarding-root-toggle{display:flex;align-items:center;justify-content:flex-start;flex:1;min-width:0;gap:10px;padding:0;border:0;background:transparent;text-align:left;font-size:11px;font-weight:400}.onboarding-root-toggle:hover:not(:disabled){background:transparent;border:0;color:var(--accent)}.onboarding-root-toggle>span{white-space:nowrap}.onboarding-root-toggle>span>small{margin-left:6px;font-size:9px;color:var(--ink-muted)}.onboarding-root-toggle>strong{margin-left:auto;min-width:0;overflow:hidden;text-overflow:ellipsis;font-size:11px;font-weight:500;color:var(--ink-secondary)}.onboarding-root-toggle>svg{flex-shrink:0}.onboarding-root-toggle>svg.expanded{transform:rotate(180deg)} +.project-onboarding form>label{display:flex;flex-direction:column;gap:7px;margin-top:18px;font-size:12px;font-weight:600;color:var(--ink-secondary)}.project-onboarding form label small{font-size:11px;font-weight:400;color:var(--ink-muted)}.project-onboarding input{padding:10px 11px;font-size:13px;min-width:0;width:100%}.project-onboarding footer,.onboarding-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:23px;flex-wrap:wrap}.project-onboarding footer>button,.onboarding-actions>button{font-size:12px;padding:9px 12px}.onboarding-root-form{display:flex;gap:10px;align-items:flex-end;margin-top:4px}.onboarding-root-form>label{flex:1}.onboarding-root-form>button{font-size:12px;padding:10px 12px}.onboarding-root-message{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--success-ink);margin:10px 0 0} +.onboarding-folder-preview{margin-top:22px;border:1px solid var(--border);border-radius:10px;overflow:hidden}.onboarding-location{display:flex;align-items:center;gap:10px;padding:14px 17px;background:#fcfafd}.onboarding-location>svg{flex-shrink:0;color:var(--accent)}.onboarding-location>span{min-width:0}.onboarding-location strong,.onboarding-location small{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.onboarding-location strong{font-size:12px;font-weight:600;color:var(--ink-secondary)}.onboarding-location small{margin-top:3px;font-size:11px;color:var(--ink-muted)}.onboarding-contents.is-preview{border:0;border-top:1px solid #eee7f3;border-radius:0}.onboarding-contents.is-preview>div{grid-template-columns:repeat(6,minmax(0,1fr));gap:10px}.onboarding-contents.is-preview>div>span{flex-direction:column;gap:7px;font-size:10px;white-space:normal;text-align:center} +.onboarding-error{background:#fff0ef;color:var(--error-ink);padding:12px;margin:14px 0;border-radius:7px;font-size:12px;line-height:1.5;overflow-wrap:anywhere}.onboarding-created{display:grid;grid-template-columns:auto minmax(0,1fr);gap:13px;align-items:center;padding:19px;background:var(--surface-subtle);border:1px solid var(--border);border-radius:10px}.onboarding-ready-icon{display:grid;place-items:center;width:43px;height:43px;border-radius:11px;background:var(--accent-soft);color:var(--accent)}.onboarding-created>div>strong{display:block;font-size:15px}.onboarding-created>div>span{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px;color:var(--ink-muted);margin-top:4px}.onboarding-created>p{grid-column:1/-1;display:flex;align-items:center;gap:7px;font-size:12px;color:var(--ink-secondary);margin:2px 0 0}.onboarding-created>.onboarding-actions{grid-column:1/-1;display:flex;margin-top:5px}.project-onboarding.creation-only{margin:24px auto;box-shadow:none} +@media(max-width:650px){.project-onboarding{padding:23px 20px;width:100%;margin:20px auto}.project-onboarding h1{font-size:23px}.onboarding-main-actions{grid-template-columns:1fr;gap:9px}.onboarding-main-actions>.onboarding-action-card{min-height:88px;padding:14px}.onboarding-contents>div{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 20px}.onboarding-contents.is-preview>div{grid-template-columns:repeat(3,minmax(0,1fr))}.onboarding-root-toggle{flex-wrap:wrap}.onboarding-root-toggle>span{flex:1}.onboarding-root-toggle>strong{max-width:35%}.onboarding-root-form{flex-wrap:wrap}.onboarding-root-form>label{flex-basis:100%}.onboarding-project-info strong{flex-wrap:wrap}.project-onboarding footer>button{flex:1}.onboarding-project-list>button{padding:11px}.onboarding-project-open{width:15px}} + +.project-launcher:has(.project-onboarding){padding-top:28px;padding-bottom:28px} +.onboarding-step-label{display:flex;align-items:center;gap:8px}.onboarding-step-label>b{display:grid;place-items:center;width:21px;height:21px;border-radius:6px;background:var(--accent-soft,#eee5f4);color:var(--accent,#67447d);font-size:10px;font-weight:600;flex-shrink:0}.onboarding-create-form label>small{line-height:1.45} + +.onboarding-created>.onboarding-registry-warning{grid-column:1/-1;padding:9px 11px;background:#fbf5eb;border-radius:6px;color:#94794d;font-size:11px;line-height:1.5;overflow-wrap:anywhere} diff --git a/workspace-app/src/components/ProjectOnboarding.jsx b/workspace-app/src/components/ProjectOnboarding.jsx index d4df41d..431b735 100644 --- a/workspace-app/src/components/ProjectOnboarding.jsx +++ b/workspace-app/src/components/ProjectOnboarding.jsx @@ -1,47 +1,61 @@ import {useEffect,useState} from 'react'; -import {Activity,ArrowRight,FolderOpen,LoaderCircle,Plus,Folder,MapPin,ShieldCheck,X} from 'lucide-react'; +import {Activity,ArrowRight,Check,ChevronDown,Database,Download,FolderOpen,GitBranch,History,LoaderCircle,Plus,Folder,MapPin,Tags,X} from 'lucide-react'; import {api} from '../api.js'; import {projectColor} from './ProjectNavigator.jsx'; import './ProjectOnboarding.css'; +const folderName=path=>String(path||'').replace(/\/+$/,'').split('/').pop()||path; +const shortPath=path=>{const parts=String(path||'').split('/').filter(Boolean);return parts.length>2?`…/${parts.slice(-2).join('/')}`:path;}; +const contents=[{Icon:Activity,label:'Recordings'},{Icon:Database,label:'Database'},{Icon:GitBranch,label:'Saved queries'},{Icon:Tags,label:'Tags'},{Icon:History,label:'History'},{Icon:Download,label:'Exports'}]; +function ProjectContents({creating=false}){ + return
+ {creating?<> +
{contents.map(({Icon,label})=>)}
+
; +} + export default function ProjectOnboarding({registry,onSelect,onCreated,onCancel,onWorkspaceChanged,onOpenProject,createOnly=false,loading=false,error=null}){ const [creating,setCreating]=useState(createOnly),[name,setName]=useState(''),[directory,setDirectory]=useState(''),[busy,setBusy]=useState(false),[failure,setFailure]=useState(''),[created,setCreated]=useState(null); const [selectedRegistry,setSelectedRegistry]=useState(null),[rootEditing,setRootEditing]=useState(false),[rootPath,setRootPath]=useState(registry?.managed_root||''),[rootMessage,setRootMessage]=useState(''); const currentRegistry=selectedRegistry||registry; const projects=currentRegistry?.projects||[]; - const recent=projects.filter(item=>item.uuid===currentRegistry?.last_project_uuid),last=recent.length===1?recent[0]:null; - const needsRoot=registry?.launcher&&!currentRegistry?.workspace_initialized&&!projects.length; - useEffect(()=>{if(needsRoot)setRootEditing(true);},[needsRoot]); + const recent=projects.filter(item=>item.uuid===currentRegistry?.last_project_uuid),last=projects.find(item=>item.path===currentRegistry?.last_project_path)||(recent.length===1?recent[0]:null); + useEffect(()=>{ + if(!onCancel)return; + function cancel(event){if(event.key==='Escape'&&!busy&&!loading){event.preventDefault();onCancel();}} + document.addEventListener('keydown',cancel); + return()=>document.removeEventListener('keydown',cancel); + },[onCancel,busy,loading]); useEffect(()=>{if(selectedRegistry&®istry?.managed_root===selectedRegistry.managed_root&®istry?.workspace_initialized===selectedRegistry.workspace_initialized)setSelectedRegistry(null);},[registry,selectedRegistry]); async function chooseRoot(event){ event.preventDefault();if(busy||!rootPath.trim())return;setBusy(true);setFailure('');setRootMessage(''); - try{const result=await api('/workspace',{method:'POST',body:{directory:rootPath.trim()}});setSelectedRegistry(result);setRootPath(result.managed_root);setRootEditing(false);setCreating(false);setCreated(null);setRootMessage(`${result.projects.length} existing project${result.projects.length===1?'':'s'} found. This workspace is ready.`);onWorkspaceChanged?.();} + try{const result=await api('/workspace',{method:'POST',body:{directory:rootPath.trim()}});setSelectedRegistry(result);setRootPath(result.managed_root);setRootEditing(false);setCreating(false);setCreated(null);setRootMessage(`${result.projects.length} project${result.projects.length===1?'':'s'} available.`);onWorkspaceChanged?.();} catch(error){setFailure(error.message);}finally{setBusy(false);} } async function create(event){ event.preventDefault();if(busy||!name.trim()||!directory.trim())return; setBusy(true);setFailure(''); - try{const result=await api('/projects',{method:'POST',body:{name:name.trim(),...(directory.trim()?{project_directory:directory.trim()}:{})}});if(!result.project?.uuid)throw new Error('The server did not return a project identity. Refresh the project list before retrying.');setCreated(result.project);await onCreated?.(result.project);} + try{const result=await api('/projects',{method:'POST',body:{name:name.trim(),...(directory.trim()?{project_directory:directory.trim()}:{})}});if(!result.project?.uuid)throw new Error('The server did not return a project identity. Refresh the project list before retrying.');setCreated({...result.project,registry_warning:result.registry_warning});await onCreated?.(result.project);} catch(error){setFailure(error.message);}finally{setBusy(false);} } return
-
RIEKE OS

{creating?'Create a project':'Your projects'}

{onCancel&&}
-

{creating?'Start with an empty project. Add recordings whenever you are ready.':'Open a project folder to pick up where you left off. Your recordings, saved work and exports stay with your project.'}

+
RIEKE OS

{created?'Project ready':creating?'New project':'Your projects'}

{onCancel&&}
{(error||failure)&&
{failure||error}
} - {!creating&&!created&&
{onOpenProject&&}
} - {!creating&&
PREFERRED PROJECTS LOCATION{currentRegistry?.managed_root||'Loading workspace location…'}An optional place to organize projects. You can create or open a project anywhere.
{registry?.launcher&&}
} - {!creating&&rootEditing&&

Use an existing workspace or a new folder. Existing project files are preserved; new projects get their own subfolders.

} - {rootMessage&&

{rootMessage}

} - {created?
{created.name} was created.{created.path}

{loading?<> Preparing the project database and opening the workspace…:'No H5 file is required. Open the project to add recordings when ready.'}

{!createOnly&&}
:creating?
- - -
{directory.trim()||'Choose a new or empty folder anywhere on this computer.'}Project files are stored directly here. To use an existing project, choose Open project instead.
-
{!createOnly&&}
+ {created?
{created.name}{shortPath(created.path)}

{loading?<> Opening project…:'Ready to add recordings.'}

{created.registry_warning&&

{created.registry_warning}

}
{!createOnly&&}
:creating? + + +
+
{!createOnly&&}
:<> -

Projects in this location

{projects.length} project{projects.length===1?'':'s'}
- {loading&&

Opening project and preparing its database…

} -
{projects.map(project=>)}
-

Moving a project? Close it first, copy its folder, then open the copy here.

{!projects.length&&
No projects yetCreate a new project or open an existing folder. Add recordings whenever you are ready.
} +
{onOpenProject&&}
+ +

Your project roots

{projects.length}
+ {loading&&

Opening project…

} +
{projects.map(project=>)}
+ {!projects.length&&!loading&&
No projects yetChoose a project root or start fresh above.
} +
+ {rootEditing&&
} + {rootMessage&&

} }
; } diff --git a/workspace-app/src/components/ProtocolSidebar.jsx b/workspace-app/src/components/ProtocolSidebar.jsx index f41b207..1c584c4 100644 --- a/workspace-app/src/components/ProtocolSidebar.jsx +++ b/workspace-app/src/components/ProtocolSidebar.jsx @@ -1,26 +1,18 @@ import { useEffect, useId, useMemo, useRef, useState } from 'react'; import { ArrowUp, ArrowDown, ChevronRight, GripVertical, Pin, PinOff, Settings2, Archive, Undo2 } from 'lucide-react'; import { humanize } from '../api.js'; -import { moveShortcut } from '../ordering.js'; +import { moveShortcut,moveProtocolPreference,protocolShortcutGroups,protocolShortcutSection } from '../ordering.js'; import { startPointerDrag } from '../pointerDrag.js'; import './ProtocolSidebar.css'; import {suggestionBadge} from '../protocolSuggestions.js'; +import {useProjectPreference} from '../useProjectPreference.js'; -const supportProtocol = name => /^(SingleSpot|ExpandingSpots|SplitFieldCentering)$/i.test((name || '').split('.').pop().replace(/\s+/g, '')); const sectionNames = { pinned: 'Pinned', main: 'Protocols', support: 'Typing & backtracking' }; -function loadPreferences(key) { - try { - const value = JSON.parse(localStorage.getItem(key)); - return value && typeof value === 'object' && !Array.isArray(value) ? value : {}; - } catch { return {}; } -} - export default function ProtocolSidebar({ projectId, protocols, activeId, onNavigate, suggestions=[],suggestionsError,onRetrySuggestions }) { - const storageKey = `rieke-os.sidebar.protocols.v1.${projectId}`; - const [preferences, setPreferences] = useState(() => loadPreferences(storageKey)); + const projectPreferences=useProjectPreference(projectId,'protocol_shortcuts'); + const preferences=projectPreferences.value; const [organizing, setOrganizing] = useState(false); const [supportOpen, setSupportOpen] = useState(false); - const [storageError, setStorageError] = useState(false); const [dragging, setDragging] = useState(null); const [dropSpot, setDropSpot] = useState(null); const [announcement, setAnnouncement] = useState(''); @@ -31,36 +23,20 @@ export default function ProtocolSidebar({ projectId, protocols, activeId, onNavi if(focusAfterMove.current){handles.current.get(focusAfterMove.current)?.focus();focusAfterMove.current=null;} },[preferences]); useEffect(() => { - setPreferences(loadPreferences(storageKey));setStorageError(false);setDragging(null);setDropSpot(null);cancelDrag.current?.();cancelDrag.current=null;focusAfterMove.current=null; - }, [storageKey]); - useEffect(()=>{ - const reload=()=>setPreferences(loadPreferences(storageKey)); - window.addEventListener('rieke-protocol-shortcuts-changed',reload); - window.addEventListener('storage',reload); - return()=>{window.removeEventListener('rieke-protocol-shortcuts-changed',reload);window.removeEventListener('storage',reload);}; - },[storageKey]); - const section = p => ['pinned', 'main', 'support'].includes(preferences[p.protocol_uuid]?.section) - ? preferences[p.protocol_uuid].section : supportProtocol(p.name) ? 'support' : 'main'; - const ordered = useMemo(() => { - const ranks = new Map(protocols.map((p,index)=>[p.protocol_uuid,index])); - return [...protocols].sort((a,b)=>(Number.isFinite(preferences[a.protocol_uuid]?.rank)?preferences[a.protocol_uuid].rank:ranks.get(a.protocol_uuid))- - (Number.isFinite(preferences[b.protocol_uuid]?.rank)?preferences[b.protocol_uuid].rank:ranks.get(b.protocol_uuid))); - }, [protocols, preferences]); - const grouped = { pinned: ordered.filter(p=>section(p)==='pinned'), main: ordered.filter(p=>section(p)==='main'), support: ordered.filter(p=>section(p)==='support') }; - const groups = Object.fromEntries(Object.entries(grouped).map(([key,items])=>[key,items.map(p=>p.protocol_uuid)])); + setDragging(null);setDropSpot(null);cancelDrag.current?.();cancelDrag.current=null;focusAfterMove.current=null; + }, [projectId]); + const section = p => protocolShortcutSection(p,preferences); + const groups=useMemo(()=>protocolShortcutGroups(protocols,preferences),[protocols,preferences]); + const byId=new Map(protocols.map(protocol=>[protocol.protocol_uuid,protocol])); + const grouped=Object.fromEntries(Object.entries(groups).map(([section,ids])=>[section,ids.map(id=>byId.get(id))])); currentGroups.current=groups; - function save(next) { - setPreferences(next); - try { localStorage.setItem(storageKey, JSON.stringify(next)); setStorageError(false); window.dispatchEvent(new Event('rieke-protocol-shortcuts-changed')); } - catch { setStorageError(true); } - } function commitMove(sourceId, target, targetId=null, placement='before') { + if(projectPreferences.loading)return; const before=currentGroups.current; const nextGroups=moveShortcut(before,sourceId,target,targetId,placement); if(nextGroups===before)return; - const next={...preferences}; - Object.entries(nextGroups).forEach(([group,ids])=>ids.forEach((id,rank)=>{next[id]={section:group,rank};})); - focusAfterMove.current=sourceId;save(next); + focusAfterMove.current=sourceId; + projectPreferences.update(previous=>moveProtocolPreference(previous,protocols,sourceId,target,targetId,placement)).catch(()=>{}); const name=humanize(protocols.find(p=>p.protocol_uuid===sourceId)?.name || 'Protocol'); setAnnouncement(`${name} moved to ${sectionNames[target]}, position ${nextGroups[target].indexOf(sourceId)+1}.`); } @@ -131,11 +107,12 @@ export default function ProtocolSidebar({ projectId, protocols, activeId, onNavi return
{if(event.key==='Escape'&&dragging){event.preventDefault();clearDrag();setAnnouncement('Reordering cancelled.');}}}>
PROTOCOLS
- {organizing&&

Drag handles to reorder or move between sections. Saved on this device.

} + {organizing&&

Drag handles to reorder or move between sections. Saved with this project.

}

Drag a handle to move a protocol. Use Alt and up or down arrow to reorder, or use the pin, section, and move buttons.

{announcement}
{['pinned','main','support'].map(sectionRows)} {suggestionsError&&

Update suggestions unavailable.

} - {storageError&&

Changes work for this session. Browser storage is unavailable.

} + {projectPreferences.loading&&!projectPreferences.error&&

Loading project shortcuts…

} + {projectPreferences.error&&

{projectPreferences.error}

}
; } diff --git a/workspace-app/src/components/ProtocolSuggestion.jsx b/workspace-app/src/components/ProtocolSuggestion.jsx index 32f7fa0..96d5a92 100644 --- a/workspace-app/src/components/ProtocolSuggestion.jsx +++ b/workspace-app/src/components/ProtocolSuggestion.jsx @@ -7,6 +7,7 @@ import {approveProtocolSuggestion} from '../protocolSuggestions.js'; import './ProtocolSuggestion.css'; import {datedCellLabel} from '../recordingIdentity.js'; import {importReadiness,suggestionDates} from '../importReadiness.js'; +import {useProjectPreference} from '../useProjectPreference.js'; export default function ProtocolSuggestion({suggestion,onChange,onReview,onProtocol,importView=false,disabled=false,approvalSignal=0,onBusyChange,onApproved}){ const [comparison,setComparison]=useState(null),[busy,setBusy]=useState(false),[error,setError]=useState(''),[message,setMessage]=useState(''),[applied,setApplied]=useState(false); @@ -47,15 +48,13 @@ function ReadinessVisual({suggestion,applied=false}){
; } -function readPins(projectId){try{return JSON.parse(localStorage.getItem(`rieke-os.sidebar.protocols.v1.${projectId}`))||{};}catch{return {};}} export function ImportSuggestions({suggestions=[],approvedHistory=[],protocols=[],projectId,sources=[],jobs=[],onReview,onProtocol,onChange,autoOpenJobUuid=null,dialogOnly=false,reviewLoading=false}){ - const [preferences,setPreferences]=useState(()=>readPins(projectId)); + const preferences=useProjectPreference(projectId,'protocol_shortcuts').value; const [approvalBatch,setApprovalBatch]=useState({sequence:0,revisions:[]}),[busyCount,setBusyCount]=useState(0),[open,setOpen]=useState(false); const dialogRef=useRef(null),reviewHadPending=useRef(false); const [approvedHere,setApprovedHere]=useState([]); const busy=busyCount>0; function busyChanged(value){setBusyCount(count=>Math.max(0,count+(value?1:-1)));} - useEffect(()=>{const update=()=>setPreferences(readPins(projectId));update();window.addEventListener('storage',update);window.addEventListener('rieke-protocol-shortcuts-changed',update);return()=>{window.removeEventListener('storage',update);window.removeEventListener('rieke-protocol-shortcuts-changed',update);};},[projectId]); const current=suggestions.map(item=>approvedHere.includes(item.candidate_revision_uuid)?{...item,status:'applied'}:item); const model=importReadiness({suggestions:current.filter(item=>item.status!=='applied'),protocols,preferences}); const past=[...new Map([...current.filter(item=>item.status==='applied'),...approvedHistory].map(item=>[item.candidate_revision_uuid,item])).values()]; diff --git a/workspace-app/src/components/SearchPresets.jsx b/workspace-app/src/components/SearchPresets.jsx index 27be874..0abcc87 100644 --- a/workspace-app/src/components/SearchPresets.jsx +++ b/workspace-app/src/components/SearchPresets.jsx @@ -28,12 +28,12 @@ export default function SearchPresets({entries,fields,history,onRun,onEdit,onPin

Project saved searches {saved.length}

{projectPresets?.error?

Project searches could not load: {projectPresets.error}

:projectPresets?.loading&&!projectPresets.data?

Loading project searches…

:saved.length?saved.map(row):

{search?'No project searches match this text.':'Run a search, then choose Save query preset to name it and share it with this project.'}

} {projectPresets?.data?.total>50&&
{projectPresets.data.offset+1}–{projectPresets.data.offset+projectPresets.data.presets.length} of {number(projectPresets.data.total)}
} - {search&&projectPresets?.data?.total>50&&

Text filters the currently loaded project page and device shortcuts.

} + {search&&projectPresets?.data?.total>50&&

Text filters the currently loaded project page and recent shortcuts.

}
- {pinned.length>0&&

Device pinned shortcuts {pinned.length}

{pinned.length?pinned.map(item=>row(item)):

Pin a search below to keep it here.

}
} + {pinned.length>0&&

Pinned search shortcuts {pinned.length}

{pinned.length?pinned.map(item=>row(item)):

Pin a search below to keep it here.

}
} {suggestions.length>0&&

Suggested predicates

{suggestions.map(item=>row(item))}
} -

Recent on this device

{recent.length?recent.map(item=>row(item)):

Your recent searches will appear here.

}
+

Recent project searches

{recent.length?recent.map(item=>row(item)):

Your recent searches will appear here.

}
Saved query revisions {history.data?.total??history.data?.revisions?.length??0}{history.loading?

Loading saved queries…

:history.error?

{history.error}

:(history.data?.revisions||[]).map(item=>row(item))}
-

Project saved searches and their pins live in the project database; rerunning uses current data. Device shortcuts and recent searches stay in this browser. Counts marked “last run” are historical. Saved selection revisions preserve exact past membership. Imported query JSON is opened for review before saving.

+

Saved searches, pinned shortcuts and recent searches travel with this project. Rerunning uses current data. Counts marked “last run” are historical. Saved selection revisions preserve exact past membership. Imported query JSON is opened for review before saving.

; } diff --git a/workspace-app/src/ordering.js b/workspace-app/src/ordering.js index 3a61a07..126bcb3 100644 --- a/workspace-app/src/ordering.js +++ b/workspace-app/src/ordering.js @@ -19,3 +19,26 @@ export function moveShortcut(groups, sourceId, section, targetId = null, placeme next[section].splice(at, 0, sourceId); return sections.every(key => next[key].length === groups[key].length && next[key].every((id, i) => id === groups[key][i])) ? groups : next; } + +export function protocolShortcutSection(protocol, preferences={}) { + const section=preferences[protocol.protocol_uuid]?.section; + if(['pinned','main','support'].includes(section))return section; + return /^(SingleSpot|ExpandingSpots|SplitFieldCentering)$/i.test((protocol.name||'').split('.').pop().replace(/\s+/g,''))?'support':'main'; +} + +export function protocolShortcutGroups(protocols, preferences={}) { + const defaults=new Map(protocols.map((protocol,index)=>[protocol.protocol_uuid,index])); + const rank=protocol=>Number.isFinite(preferences[protocol.protocol_uuid]?.rank)?preferences[protocol.protocol_uuid].rank:defaults.get(protocol.protocol_uuid); + const ordered=[...protocols].sort((first,second)=>rank(first)-rank(second)); + return Object.fromEntries(['pinned','main','support'].map(section=>[section, + ordered.filter(protocol=>protocolShortcutSection(protocol,preferences)===section).map(protocol=>protocol.protocol_uuid)])); +} + +export function moveProtocolPreference(preferences, protocols, sourceId, section, targetId=null, placement='before') { + const groups=protocolShortcutGroups(protocols,preferences); + const moved=moveShortcut(groups,sourceId,section,targetId,placement); + if(moved===groups)return preferences; + const next={...preferences}; + for(const [group,ids] of Object.entries(moved))ids.forEach((id,rank)=>{next[id]={section:group,rank};}); + return next; +} diff --git a/workspace-app/src/projectPreferences.js b/workspace-app/src/projectPreferences.js new file mode 100644 index 0000000..16f795c --- /dev/null +++ b/workspace-app/src/projectPreferences.js @@ -0,0 +1,115 @@ +// Project-owned shortcuts hydrate before writes; localStorage is only a cache +// and a one-time source for migrating preferences saved by earlier app versions. +const fields=['recent_searches','protocol_shortcuts']; +export function preferenceStorageKey(projectId,field){ + return field==='recent_searches'?`rieke-os.search-presets.v1.${projectId}`:`rieke-os.sidebar.protocols.v1.${projectId}`; +} +const empty=field=>field==='recent_searches'?[]:{}; +function renderableLegacySearch(entry){ + if(!entry||typeof entry!=='object'||Array.isArray(entry)||typeof entry.id!=='string'||!entry.id||entry.id.length>65536)return false; + if(entry.name!=null&&(typeof entry.name!=='string'||entry.name.length>255))return false; + if(entry.splits!=null&&(typeof entry.splits!=='string'||entry.splits.length>4096))return false; + if(entry.pinned!=null&&typeof entry.pinned!=='boolean')return false; + if(entry.lastRunAt!=null&&(typeof entry.lastRunAt!=='string'||entry.lastRunAt.length>64))return false; + if(['matched_count','cell_count'].some(key=>entry[key]!=null&&(!Number.isSafeInteger(entry[key])||entry[key]<0)))return false; + let nodes=0,literals=0; + const literal=(value,depth=0)=>{ + if(++literals>4096||depth>6)return false; + if(value===null||typeof value==='string'||typeof value==='boolean')return true; + if(typeof value==='number')return Number.isFinite(value)&&(!Number.isInteger(value)||Number.isSafeInteger(value)); + if(Array.isArray(value))return value.length<=100&&value.every(child=>literal(child,depth+1)); + return value&&typeof value==='object'&&Object.values(value).every(child=>literal(child,depth+1)); + }; + const walk=(node,depth=0)=>{ + if(++nodes>128||depth>8||!node||typeof node!=='object'||Array.isArray(node))return false; + const keys=Object.keys(node); + if(keys.length===1&&keys[0]==='not')return walk(node.not,depth+1); + if(keys.length===1&&['all','any'].includes(keys[0]))return Array.isArray(node[keys[0]])&&node[keys[0]].every(child=>walk(child,depth+1)); + if(keys.some(key=>!['field','operator','value'].includes(key))||typeof node.field!=='string'||!node.field||node.field.length>2048)return false; + if(['exists','missing','is_null'].includes(node.operator))return keys.length===2&&!Object.hasOwn(node,'value'); + if(!['eq','ne','in','not_in','contains','gt','gte','lt','lte'].includes(node.operator)||!Object.hasOwn(node,'value')||!literal(node.value))return false; + if(['in','not_in'].includes(node.operator)&&!Array.isArray(node.value))return false; + return !['gt','gte','lt','lte'].includes(node.operator)||typeof node.value==='number'; + }; + return walk(entry.predicate); +} +function legacySearches(value){ + const seen=new Set(); + return value.filter(entry=>renderableLegacySearch(entry)&&!seen.has(entry.id)&&seen.add(entry.id)).slice(0,100).map(entry=>({ + id:entry.id,predicate:entry.predicate,splits:entry.splits??'date,cell',pinned:entry.pinned??false, + ...Object.fromEntries(['name','matched_count','cell_count','lastRunAt'].filter(key=>Object.hasOwn(entry,key)).map(key=>[key,entry[key]])), + })); +} +export function createProjectPreferenceClient({projectId,request,storage}){ + let loaded=false,loading=null,queue=Promise.resolve(),revisions={},values={},errors={}; + const listeners=new Set(); + const legacy={}; + for(const field of fields){ + try{const value=JSON.parse(storage?.getItem(preferenceStorageKey(projectId,field))||'null');legacy[field]=field==='recent_searches'?(Array.isArray(value)?legacySearches(value):undefined):(value&&typeof value==='object'&&!Array.isArray(value)?value:undefined);}catch{} + values[field]=empty(field); + } + const publish=()=>listeners.forEach(listener=>listener()); + function accept(receipt,savedField=null){ + if(receipt?.format!=='rieke-project-preferences'||receipt.version!==1||receipt.project_uuid!==projectId||!receipt.state||!receipt.revisions)throw new Error('Project preference response has the wrong identity or format.'); + revisions={...receipt.revisions}; + for(const field of fields){ + if(loaded&&errors[field]&&field!==savedField)continue; + const saved=Object.hasOwn(receipt.state,field); + values[field]=saved?receipt.state[field]:legacy[field]??empty(field); + // A missing field has not acknowledged migration. Retain the earlier + // browser copy until PUT succeeds, including across a page refresh. + if(saved)try{storage?.setItem(preferenceStorageKey(projectId,field),JSON.stringify(values[field]));}catch{} + } + } + async function load(){ + if(loaded)return; + if(loading)return loading; + loading=(async()=>{ + let receipt=await request('/project-preferences'); + accept(receipt); + errors={}; + // Never seed a recipient's portable preferences from that browser's cache. + for(const field of fields){ + if(Object.hasOwn(receipt.state,field)||legacy[field]===undefined)continue; + try{ + receipt=await request('/project-preferences',{method:'PUT',body:{field,value:legacy[field],expected_revision:revisions[field]}}); + accept(receipt); + }catch(error){ + if(error.message==='Project preferences changed; reload before saving.'){ + receipt=await request('/project-preferences');accept(receipt); + }else{errors[field]=`Earlier device shortcuts could not be saved to this project: ${error.message}`;} + } + } + loaded=true;publish(); + })().catch(error=>{for(const field of fields)errors[field]=error.message;publish();throw error;}).finally(()=>{loading=null;}); + return loading; + } + function update(field,change){ + const operation=queue.catch(()=>{}).then(async()=>{ + await load(); + const revise=typeof change==='function'?change:()=>change; + let next=revise(values[field]); + values[field]=next;errors[field]=null;publish(); + try{ + let receipt; + try{receipt=await request('/project-preferences',{method:'PUT',body:{field,value:next,expected_revision:revisions[field]}});} + catch(error){ + if(error.message!=='Project preferences changed; reload before saving.')throw error; + accept(await request('/project-preferences'),field); + next=revise(values[field]); + receipt=await request('/project-preferences',{method:'PUT',body:{field,value:next,expected_revision:revisions[field]}}); + } + accept(receipt,field);errors[field]=null;publish();return values[field]; + }catch(error){values[field]=next;errors[field]=`Changes are visible in this session, but could not be saved to the project: ${error.message}`;publish();throw error;} + }); + queue=operation;return operation; + } + return { + get:field=>({value:values[field],loading:!loaded&&!errors[field],error:errors[field]||null}), + subscribe(listener){listeners.add(listener);return()=>listeners.delete(listener);}, + load,update, + async flush(){await queue;if(Object.values(errors).some(Boolean))throw new Error('Project preferences have unsaved changes.');}, + async reload(){await queue.catch(()=>{});loaded=false;errors={};return load();}, + async refresh(){await queue.catch(()=>{});if(loaded&&Object.values(errors).some(Boolean))return;loaded=false;return load();}, + }; +} diff --git a/workspace-app/src/projectPreferences.test.js b/workspace-app/src/projectPreferences.test.js new file mode 100644 index 0000000..ea10f35 --- /dev/null +++ b/workspace-app/src/projectPreferences.test.js @@ -0,0 +1,178 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import {createProjectPreferenceClient,preferenceStorageKey} from './projectPreferences.js'; +import {moveProtocolPreference} from './ordering.js'; + +const projectId='a5790c6c-ddc0-40c0-8a98-66f7a613e82b'; +function backend(state={}){ + let receipt={format:'rieke-project-preferences',version:1,project_uuid:projectId,revisions:{recent_searches:0,protocol_shortcuts:0},state:structuredClone(state)}; + const calls=[]; + return {calls,read:()=>structuredClone(receipt),async request(path,options){ + calls.push({path,options}); + if(!options)return structuredClone(receipt); + const {field,value,expected_revision}=options.body; + if(expected_revision!==receipt.revisions[field])throw new Error('Project preferences changed; reload before saving.'); + receipt={...receipt,revisions:{...receipt.revisions,[field]:expected_revision+1},state:{...receipt.state,[field]:structuredClone(value)}}; + return structuredClone(receipt); + }}; +} +function storage(initial={}){const values=new Map(Object.entries(initial));return {getItem:key=>values.get(key),setItem:(key,value)=>values.set(key,value)};} +const search={id:'history',predicate:{field:'protocol',operator:'contains',value:'History'},splits:'date,cell',pinned:true}; + +test('received project wins over stale browser pins and recent searches',async()=>{ + const server=backend({recent_searches:[search],protocol_shortcuts:{received:{section:'pinned',rank:1}}}); + const local=storage({[preferenceStorageKey(projectId,'recent_searches')]:'[]',[preferenceStorageKey(projectId,'protocol_shortcuts')]:JSON.stringify({old:{section:'main',rank:0}})}); + const client=createProjectPreferenceClient({projectId,request:server.request,storage:local}); + await client.load(); + assert.deepEqual(client.get('recent_searches').value,[search]); + assert.deepEqual(client.get('protocol_shortcuts').value,{received:{section:'pinned',rank:1}}); + assert.equal(server.calls.length,1); +}); + +test('earlier browser shortcuts migrate once and disjoint field writes survive',async()=>{ + const server=backend(); + const local=storage({[preferenceStorageKey(projectId,'recent_searches')]:JSON.stringify([search]),[preferenceStorageKey(projectId,'protocol_shortcuts')]:JSON.stringify({saved:{section:'pinned',rank:0}})}); + const client=createProjectPreferenceClient({projectId,request:server.request,storage:local}); + await Promise.all([client.load(),client.load()]); + assert.deepEqual(server.read().state.recent_searches,[search]); + assert.deepEqual(server.read().state.protocol_shortcuts,{saved:{section:'pinned',rank:0}}); + await client.reload(); + assert.equal(server.calls.filter(call=>call.options).length,2); +}); + +test('writes queued during hydration apply to received state in sequence',async()=>{ + const server=backend({recent_searches:[search]}); + let release; + const gate=new Promise(resolve=>{release=resolve;}); + const client=createProjectPreferenceClient({projectId,request:async(...args)=>{if(!args[1])await gate;return server.request(...args);},storage:storage()}); + const first=client.update('recent_searches',previous=>[...previous,{...search,id:'second'}]); + const second=client.update('recent_searches',previous=>[...previous,{...search,id:'third'}]); + release();await Promise.all([first,second]); + assert.deepEqual(server.read().state.recent_searches.map(item=>item.id),['history','second','third']); +}); + +test('concurrent browser conflict reloads then reapplies intent to fresh pins',async()=>{ + const server=backend({protocol_shortcuts:{existing:{section:'main',rank:0}}}); + const client=createProjectPreferenceClient({projectId,request:server.request,storage:storage()}); + await client.load(); + await server.request('/project-preferences',{method:'PUT',body:{field:'protocol_shortcuts',value:{existing:{section:'main',rank:0},other:{section:'pinned',rank:0}},expected_revision:0}}); + await client.update('protocol_shortcuts',previous=>({...previous,new:{section:'pinned',rank:1}})); + assert.deepEqual(Object.keys(server.read().state.protocol_shortcuts),['existing','other','new']); +}); + +test('save failures remain visible and never claim portable persistence',async()=>{ + const server=backend({recent_searches:[]}); + let fail=true; + const client=createProjectPreferenceClient({projectId,request:(path,options)=>options&&fail?Promise.reject(new Error('disk full')):server.request(path,options),storage:storage()}); + await assert.rejects(client.update('recent_searches',[search]),/disk full/); + assert.match(client.get('recent_searches').error,/could not be saved to the project/); + assert.deepEqual(client.get('recent_searches').value,[search]); + assert.deepEqual(server.read().state.recent_searches,[]); + fail=false; + await client.update('recent_searches',previous=>previous); + assert.equal(client.get('recent_searches').error,null); + assert.deepEqual(server.read().state.recent_searches,[search]); +}); + +test('unavailable browser storage still saves project state and wrong identity is refused',async()=>{ + const server=backend(); + const client=createProjectPreferenceClient({projectId,request:server.request,storage:{getItem(){throw Error('no storage');},setItem(){throw Error('no storage');}}}); + await client.update('recent_searches',[search]); + assert.deepEqual(server.read().state.recent_searches,[search]); + const foreign=createProjectPreferenceClient({projectId,request:async()=>({...server.read(),project_uuid:'foreign'})}); + await assert.rejects(foreign.load(),/identity/); + assert.equal(foreign.get('recent_searches').loading,false); +}); + +test('focus refresh and unrelated successful saves preserve an unsaved failed change',async()=>{ + const server=backend({recent_searches:[],protocol_shortcuts:{}}); + const client=createProjectPreferenceClient({projectId,request:(path,options)=>options?.body.field==='recent_searches'?Promise.reject(new Error('disk unavailable')):server.request(path,options),storage:storage()}); + await assert.rejects(client.update('recent_searches',[search])); + await client.refresh(); + await client.update('protocol_shortcuts',{pinned:{section:'pinned',rank:0}}); + assert.deepEqual(client.get('recent_searches').value,[search]); + assert.match(client.get('recent_searches').error,/could not be saved/); + assert.deepEqual(server.read().state.recent_searches,[]); +}); + +test('failed legacy migration survives page refresh and unrelated writes until explicit save retry',async()=>{ + const server=backend(); + const searchKey=preferenceStorageKey(projectId,'recent_searches'); + const shortcutKey=preferenceStorageKey(projectId,'protocol_shortcuts'); + const earlierPins={earlier:{section:'pinned',rank:0}}; + const local=storage({[searchKey]:JSON.stringify([search]),[shortcutKey]:JSON.stringify(earlierPins)}); + let failSearch=true; + const request=(path,options)=>options?.body.field==='recent_searches'&&failSearch?Promise.reject(new Error('disk full')):server.request(path,options); + const client=createProjectPreferenceClient({projectId,request,storage:local}); + await client.load(); + assert.deepEqual(client.get('recent_searches').value,[search]); + assert.match(client.get('recent_searches').error,/Earlier device shortcuts could not be saved/); + assert.deepEqual(JSON.parse(local.getItem(searchKey)),[search]); + assert.equal(Object.hasOwn(server.read().state,'recent_searches'),false); + assert.deepEqual(server.read().state.protocol_shortcuts,earlierPins); + await client.update('protocol_shortcuts',previous=>({...previous,another:{section:'main',rank:1}})); + assert.deepEqual(client.get('recent_searches').value,[search]); + assert.deepEqual(JSON.parse(local.getItem(searchKey)),[search]); + // A completely new client models closing/reloading the page, rather than + // relying on the first client's in-memory legacy copy. + const refreshed=createProjectPreferenceClient({projectId,request,storage:local}); + await refreshed.load(); + assert.deepEqual(refreshed.get('recent_searches').value,[search]); + assert.match(refreshed.get('recent_searches').error,/disk full/); + assert.deepEqual(JSON.parse(local.getItem(searchKey)),[search]); + failSearch=false; + await refreshed.update('recent_searches',previous=>previous); + assert.equal(refreshed.get('recent_searches').error,null); + assert.deepEqual(server.read().state.recent_searches,[search]); + assert.deepEqual(server.read().state.protocol_shortcuts,{...earlierPins,another:{section:'main',rank:1}}); + const reopened=createProjectPreferenceClient({projectId,request,storage:local}); + const before=server.calls.filter(call=>call.options).length; + await reopened.load(); + assert.deepEqual(reopened.get('recent_searches').value,[search]); + assert.equal(server.calls.filter(call=>call.options).length,before); +}); + +test('sidebar move intent preserves another window pin when its revision conflicts',async()=>{ + const protocols=[{protocol_uuid:'first',name:'Experiment A'},{protocol_uuid:'second',name:'Experiment B'},{protocol_uuid:'typing',name:'SingleSpot'}]; + const original={first:{section:'main',rank:0},second:{section:'main',rank:1},typing:{section:'support',rank:0},unloaded:{section:'pinned',rank:9}}; + const server=backend({protocol_shortcuts:original}); + const client=createProjectPreferenceClient({projectId,request:server.request,storage:storage()}); + await client.load(); + await server.request('/project-preferences',{method:'PUT',body:{field:'protocol_shortcuts',expected_revision:0,value:moveProtocolPreference(original,protocols,'second','pinned')}}); + await client.update('protocol_shortcuts',previous=>moveProtocolPreference(previous,protocols,'first','pinned')); + const saved=server.read().state.protocol_shortcuts; + assert.equal(saved.first.section,'pinned'); + assert.equal(saved.second.section,'pinned'); + assert.equal(saved.second.rank,0); + assert.equal(saved.first.rank,1); + assert.deepEqual(saved.typing,{section:'support',rank:0}); + assert.deepEqual(saved.unloaded,original.unloaded); +}); + +test('malformed legacy entries never render or migrate while raw cache survives a failed save',async()=>{ + const server=backend(); + const key=preferenceStorageKey(projectId,'recent_searches'); + const raw=JSON.stringify([null,{id:'missing-predicate'}, {...search,id:'bad-group',predicate:{all:'not an array'}}, + {...search,id:'bad-child',predicate:{not:null}}, {...search,id:'bad-label',name:{}}, {...search,id:'bad-count',cell_count:true}, search, search]); + const local=storage({[key]:raw}); + const attempts=[]; + let fail=true; + const request=(path,options)=>{ + if(options){attempts.push(structuredClone(options.body.value));if(fail)return Promise.reject(new Error('offline'));} + return server.request(path,options); + }; + const client=createProjectPreferenceClient({projectId,request,storage:local}); + await client.load(); + assert.deepEqual(client.get('recent_searches').value,[search]); + assert.deepEqual(attempts,[[search]]); + assert.equal(local.getItem(key),raw); + assert.match(client.get('recent_searches').error,/offline/); + const refreshed=createProjectPreferenceClient({projectId,request,storage:local}); + await refreshed.load(); + assert.deepEqual(refreshed.get('recent_searches').value,[search]); + assert.equal(local.getItem(key),raw); + fail=false; + await refreshed.update('recent_searches',previous=>previous); + assert.deepEqual(server.read().state.recent_searches,[search]); + assert.deepEqual(JSON.parse(local.getItem(key)),[search]); +}); diff --git a/workspace-app/src/projectTransfer.js b/workspace-app/src/projectTransfer.js index edbdbc3..11cf3d5 100644 --- a/workspace-app/src/projectTransfer.js +++ b/workspace-app/src/projectTransfer.js @@ -17,6 +17,23 @@ export function localProjectUrl(url, base) { return destination.href; } +// A prepared copy contains a logical database backup. It must be restored to +// a new local folder instead of being opened as a live project. +export async function inspectAndOpenProject({directory,request,relocateDestination}) { + const inspection=await request('/projects/inspect-folder',{method:'POST',body:{directory}}); + if(inspection?.kind==='project-root-suggestions')return {action:'choose-root',inspection,directory}; + if(inspection?.valid!==true)throw new Error('The project folder did not pass inspection.'); + if(inspection.kind==='prepared-transfer')return {action:'restore',inspection,directory}; + if(inspection.kind&&inspection.kind!=='project')throw new Error('The project service returned an unknown folder type.'); + if(relocateDestination){ + const moved=await request('/projects/relocate',{method:'POST',body:{directory,destination:relocateDestination}}); + if(typeof moved.directory!=='string'||!moved.directory.trim())throw new Error('The project service did not return the moved folder.'); + directory=moved.directory; + } + const response=await request('/projects/open-folder',{method:'POST',body:{directory}}); + return {action:'open',inspection,directory,url:response.url}; +} + export async function runProjectTransfer({mode,directory,destination,request,signal,pause=ms=>new Promise(resolve=>setTimeout(resolve,ms))}) { if (!['prepare','restore'].includes(mode)) throw new Error('Unknown project transfer action.'); const job=await request(mode==='prepare'?'/projects/prepare-transfer':'/projects/restore-transfer',{ diff --git a/workspace-app/src/projectTransfer.test.js b/workspace-app/src/projectTransfer.test.js index a8f872a..6cc054b 100644 --- a/workspace-app/src/projectTransfer.test.js +++ b/workspace-app/src/projectTransfer.test.js @@ -1,6 +1,6 @@ import test from 'node:test'; import assert from 'node:assert/strict'; -import {localProjectUrl,verifiedTransferResult} from './projectTransfer.js'; +import {inspectAndOpenProject,localProjectUrl,verifiedTransferResult} from './projectTransfer.js'; test('only a verified transfer with a destination can be presented as ready',()=>{ const result={verified:true,directory:'/research/shared-project',project_uuid:'project'}; @@ -33,3 +33,41 @@ test('transfer monitors a job until verification completes and surfaces server f const unverifiedReplies=[{job_id:'unverified'},{state:'complete',result:{directory:'/new/project'}}]; await assert.rejects(runProjectTransfer({mode:'restore',request:async()=>unverifiedReplies.shift()}),/did not confirm/); }); + +test('received portable copies are inspected and routed to restore without opening or moving them',async()=>{ + const calls=[]; + const inspection={valid:true,kind:'prepared-transfer',project:{name:'Shared study'},source_count:2}; + const result=await inspectAndOpenProject({directory:'/received/study',relocateDestination:'/my/study',request:async(path,options)=>{calls.push({path,options});return inspection;}}); + assert.equal(result.action,'restore'); + assert.equal(result.inspection,inspection); + assert.equal(calls.length,1); + assert.equal(calls[0].path,'/projects/inspect-folder'); + assert.deepEqual(calls[0].options.body,{directory:'/received/study'}); +}); + +test('ordinary projects open after inspection, and optional relocation uses the moved directory',async()=>{ + const calls=[]; + const replies=[{valid:true,kind:'project'},{directory:'/preferred/study'},{url:'http://localhost:8123'}]; + const result=await inspectAndOpenProject({directory:'/received/study',relocateDestination:'/preferred/study',request:async(path,options)=>{calls.push({path,options});return replies.shift();}}); + assert.equal(result.action,'open'); + assert.equal(result.url,'http://localhost:8123'); + assert.deepEqual(calls.map(call=>call.path),['/projects/inspect-folder','/projects/relocate','/projects/open-folder']); + assert.deepEqual(calls[2].options.body,{directory:'/preferred/study'}); +}); + +test('failed or unrecognized inspection never starts a project service',async()=>{ + for(const inspection of [null,{valid:false},{valid:true,kind:'unrecognized'}]){ + let calls=0; + await assert.rejects(inspectAndOpenProject({directory:'/received/study',request:async()=>{calls++;return inspection;}})); + assert.equal(calls,1); + } +}); + +test('nearby project roots are returned for explicit selection without opening or moving any candidate',async()=>{ + const inspection={valid:false,kind:'project-root-suggestions',candidates:[{path:'/research/study-a',name:'Study A'},{path:'/research/study-b',name:'Study B'}]}; + const calls=[]; + const result=await inspectAndOpenProject({directory:'/research',relocateDestination:'/chosen/study',request:async(path)=>{calls.push(path);return inspection;}}); + assert.equal(result.action,'choose-root'); + assert.equal(result.inspection,inspection); + assert.deepEqual(calls,['/projects/inspect-folder']); +}); diff --git a/workspace-app/src/useProjectPreference.js b/workspace-app/src/useProjectPreference.js new file mode 100644 index 0000000..d9d026e --- /dev/null +++ b/workspace-app/src/useProjectPreference.js @@ -0,0 +1,28 @@ +import {useEffect,useState} from 'react'; +import {api} from './api.js'; +import {createProjectPreferenceClient,preferenceStorageKey} from './projectPreferences.js'; + +const clients=new Map(); +function clientFor(projectId){ + if(!clients.has(projectId)){ + let storage;try{storage=window.localStorage;}catch{} + clients.set(projectId,createProjectPreferenceClient({projectId,request:api,storage})); + } + return clients.get(projectId); +} +export function useProjectPreference(projectId,field){ + const client=clientFor(projectId); + const [snapshot,setSnapshot]=useState(()=>({client,field,...client.get(field)})); + useEffect(()=>{ + const update=()=>setSnapshot({client,field,...client.get(field)}); + update();const unsubscribe=client.subscribe(update); + if(projectId)client.load().catch(()=>{}); + const refresh=()=>{if(projectId)client.refresh().catch(()=>{});}; + const storageChanged=event=>{if(event.key===preferenceStorageKey(projectId,field))refresh();}; + window.addEventListener('focus',refresh); + window.addEventListener('storage',storageChanged); + return()=>{unsubscribe();window.removeEventListener('focus',refresh);window.removeEventListener('storage',storageChanged);}; + },[client,field,projectId]); + const visible=snapshot.client===client&&snapshot.field===field?snapshot:client.get(field); + return {...visible,update:change=>client.update(field,change),reload:()=>client.reload()}; +} From b3778d5d5b7e8230ae9647b432360e5ded222046 Mon Sep 17 00:00:00 2001 From: arthurh <49833088+maxwellsdm1867@users.noreply.github.com> Date: Tue, 29 Sep 2026 22:04:49 -0700 Subject: [PATCH 2/6] Keep project setup in a popup above the active workspace --- docs/WORKSPACE_SHARING_AND_UPDATES.md | 5 ++++ docs/dev/NATIVE_E2E_VALIDATION.md | 11 ++++++++ .../project-create-popup-over-workspace.jpg | Bin 0 -> 109155 bytes docs/dev/project-popup-over-workspace.jpg | Bin 0 -> 113282 bytes workspace-app/src/App.jsx | 4 ++- .../src/components/ProjectOnboarding.jsx | 13 +++++----- .../src/components/ProjectSetupDialog.css | 5 ++++ .../src/components/ProjectSetupDialog.jsx | 24 ++++++++++++++++++ 8 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 docs/dev/project-create-popup-over-workspace.jpg create mode 100644 docs/dev/project-popup-over-workspace.jpg create mode 100644 workspace-app/src/components/ProjectSetupDialog.css create mode 100644 workspace-app/src/components/ProjectSetupDialog.jsx diff --git a/docs/WORKSPACE_SHARING_AND_UPDATES.md b/docs/WORKSPACE_SHARING_AND_UPDATES.md index 41b7476..ddca198 100644 --- a/docs/WORKSPACE_SHARING_AND_UPDATES.md +++ b/docs/WORKSPACE_SHARING_AND_UPDATES.md @@ -2,6 +2,11 @@ ## Choose the project folder itself +The **+** in the left project rail opens a popup over the current workspace. +Choose either project action inside it. The workspace remains visible; **×** +or **Escape** closes the popup and returns focus to **+**. Creating a new +project from the welcome screen also opens a popup. + The left sidebar has two project actions: - **Add new project** opens an existing working project or a portable copy someone diff --git a/docs/dev/NATIVE_E2E_VALIDATION.md b/docs/dev/NATIVE_E2E_VALIDATION.md index 4bac244..cbfed3a 100644 --- a/docs/dev/NATIVE_E2E_VALIDATION.md +++ b/docs/dev/NATIVE_E2E_VALIDATION.md @@ -281,3 +281,14 @@ Final feature-only snapshot: **697 backend tests passed**, all native gates enabled with no skips; **245 frontend tests passed** and production build passed. Whitespace checks passed. The additional tests in the larger shared working tree belong to other ongoing changes and are not part of this push. + +### Project popup follow-up + +The project rail **+** now opens a native modal chooser above the existing app. +Creation stays within that popup; the welcome screen also opens creation in a +modal. A live disposable workspace verified that its overview URL and contents +remain in place, **×** and **Escape** return focus to **+**, and forward/reverse +Tab stay inside the popup. No project files were created by this UI check. +Screenshots: `project-popup-over-workspace.jpg` and +`project-create-popup-over-workspace.jpg`. The feature-only frontend suite and +production build were checked again for this UI correction. diff --git a/docs/dev/project-create-popup-over-workspace.jpg b/docs/dev/project-create-popup-over-workspace.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eaaa02d38811c4da4816d7f601c2dbd281425509 GIT binary patch literal 109155 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%0A7$ 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 Oaw76#^#+&v|2F|Nh?tcC literal 0 HcmV?d00001 diff --git a/workspace-app/src/App.jsx b/workspace-app/src/App.jsx index 69e2146..d5c7b19 100644 --- a/workspace-app/src/App.jsx +++ b/workspace-app/src/App.jsx @@ -12,6 +12,7 @@ import AnnotationProfile from './components/AnnotationProfile.jsx'; import useProtocolTreeLayout from './useProtocolTreeLayout.js'; const ProtocolInfographic=lazy(()=>import('./components/ProtocolInfographic.jsx')); import ProjectOnboarding from './components/ProjectOnboarding.jsx'; +import ProjectSetupDialog from './components/ProjectSetupDialog.jsx'; import { lazy, Suspense, useCallback, useEffect, useRef, useState } from 'react'; import { Activity, ArrowLeft, ArrowRight, ArrowUpRight, Check, ChevronDown, CircleDot, Database, Download, FileJson, FolderOpen, GitBranch, Layers, LayoutDashboard, ListFilter, PanelLeftClose, PanelLeftOpen, Plus, RefreshCw, Search, Settings2, ShieldCheck, Upload, Users, Clock3, X } from 'lucide-react'; import { api, useResource, number, duration, humanize, time, eligibleExportCount } from './api.js'; @@ -119,6 +120,7 @@ export default function App(){ const importQueue=useImportQueue(importJobs,setTransfer,changed); useEffect(()=>{if(!importQueue.busy&&pendingImportReview.current){setReviewImportJob(pendingImportReview.current);pendingImportReview.current=null;}},[importQueue.busy,revision]); const [projectSetup,setProjectSetup]=useState(false); + const [projectSetupBusy,setProjectSetupBusy]=useState(false); useEffect(()=>{if(transfer?.phase==='accepted'&&importJobs.data?.jobs?.some(job=>job.job_uuid===transfer.job_uuid))setTransfer(null);},[transfer,importJobs.data]); const [openingProject,setOpeningProject]=useState(null),[projectError,setProjectError]=useState(''); function setPage(next){if(next!==page)navigation.go(next);} @@ -140,4 +142,4 @@ export default function App(){ function searchEpoch(result){if(result.protocol_uuid)openInspection(result.protocol_uuid,result);else openQC(result.cell_uuid,result.epoch_uuid);} function searchPredicate(predicate){navigation.go('explore',{explorePredicate:predicate});} function changed(){setRevision(x=>x+1);} - const data=overview.data;const projectId=registry.data?.current_project_uuid || data?.project?.project_uuid;const registeredProjects=registry.data?.projects || [];const currentProject=registeredProjects.find(project=>project.current)||registeredProjects.find(project=>project.uuid===projectId);const projectName=data?.project?.display_name || currentProject?.name || data?.project?.name || 'Project';useEffect(()=>{document.title=isLauncher?'Rieke OS · Projects':`${projectName} · Rieke OS`;},[projectName,isLauncher]);async function selectProject(project){if(openingProject||!project.available)return;if(project.current){setPage('overview');return;}setOpeningProject(project.name);setProjectError('');try{const result=await api(project.path?'/projects/open-folder':`/projects/${project.uuid}/open`,{method:'POST',body:project.path?{directory:project.path}:{}});window.location.assign(localProjectUrl(result.url,window.location.href));}catch(error){setProjectError(error.message);setOpeningProject(null);}}const setup={setProjectSetup(false);setFolderOpen(true);}} onWorkspaceChanged={registry.reload} registry={registry.data} onSelect={selectProject} onCreated={async project=>{registry.reload();await selectProject(project);}} onCancel={isLauncher&&projectSetup!=='create'?undefined:()=>setProjectSetup(false)} createOnly={projectSetup==='create'} loading={!!openingProject} error={projectError||registry.error}/>;if(isLauncher)return
setFolderOpen({mode:'prepare',directory})}/>{setup}
{folderOpen&&setFolderOpen(false)} onTransferComplete={()=>registry.reload()}/>}
;return
/ {page==='protocol'?humanize(data?.protocols?.find(p=>p.protocol_uuid===protocol)?.name):page==='explore'?'Search predicate':page==='import'?'Add data store':page==='stores'?'Data stores':page==='cell-qc'?'Cell QC':humanize(page)}openQC(result.cell_uuid,result.epoch_uuid)} onPredicate={searchPredicate}/> Local workspace
{reviewImportJob&&}setPage('import')}/>
{folderOpen&&setFolderOpen(false)} onFiles={()=>setPage('files')} onTransferComplete={()=>registry.reload()}/>}{projectSetup&&
{setup}
}{openingProject&&
Opening {openingProject}…
}{projectError&&
{projectError}
}{page==='cell-qc'?navigation.canBack?navigation.back():setPage('overview')}/>:page==='stores'?setPage('import')} onProtocol={navigate} onFiles={()=>setPage('files')} onLogs={()=>setPage('activity')}/>:!data?:page==='overview'?setPage('import')} onExplore={()=>explore()}/>:page==='explore'?explore(null,{},true)} onExit={()=>explore()} key={route.key} session={sessions.current.get(route.key) || (route.resumeExplorer?lastExplorerSession.current:null)} onSession={rememberExplorer} initialPredicate={explorePredicate} initialRevisionId={exploreRevisionId} initialExportIntent={exploreExportIntent} initialProtocolId={exploreTargetId} onProtocolApplied={protocolApplied} onChange={changed} revision={revision} protocols={data.protocols || []} onInspect={openInspection}/>:page==='protocol'?item.protocol_uuid===protocol)} suggestionsError={suggestionsResource.error} onRetrySuggestions={suggestionsResource.reload} initialRecipe={initialRecipe} initialInspection={initialInspection} onRefine={explore} onReviewCandidate={reviewCandidate} onStores={()=>setPage('stores')} id={protocol} revision={revision} onChange={changed} onImport={()=>setPage('import')}/>:page==='activity'?:page==='files'?setPage('stores')}/>:page==='import'?setPage('stores')} jobs={importJobs} suggestions={suggestionsResource.data?.suggestions||[]} approvedHistory={suggestionsResource.data?.approved_history||[]} suggestionsError={suggestionsResource.error} onRetrySuggestions={suggestionsResource.reload} onReviewCandidate={reviewCandidate} onProtocol={navigate}/>:}
;} + const data=overview.data;const projectId=registry.data?.current_project_uuid || data?.project?.project_uuid;const registeredProjects=registry.data?.projects || [];const currentProject=registeredProjects.find(project=>project.current)||registeredProjects.find(project=>project.uuid===projectId);const projectName=data?.project?.display_name || currentProject?.name || data?.project?.name || 'Project';useEffect(()=>{document.title=isLauncher?'Rieke OS · Projects':`${projectName} · Rieke OS`;},[projectName,isLauncher]);async function selectProject(project){if(openingProject||!project.available)return;if(project.current){setPage('overview');return;}setOpeningProject(project.name);setProjectError('');try{const result=await api(project.path?'/projects/open-folder':`/projects/${project.uuid}/open`,{method:'POST',body:project.path?{directory:project.path}:{}});window.location.assign(localProjectUrl(result.url,window.location.href));}catch(error){setProjectError(error.message);setOpeningProject(null);}}const setup={setProjectSetup(false);setFolderOpen(true);}} onWorkspaceChanged={registry.reload} registry={registry.data} onSelect={async project=>{await selectProject(project);if(project.current)setProjectSetup(false);}} onCreated={async project=>{registry.reload();await selectProject(project);}} onCancel={()=>setProjectSetup(false)} createOnly={projectSetup==='create'} loading={!!openingProject} error={projectError||registry.error}/>;const setupDialog=projectSetup&&setProjectSetup(false)}>{setup};const launcherSetup=setFolderOpen(true)} onNewProject={()=>setProjectSetup('create')} onWorkspaceChanged={registry.reload} registry={registry.data} onSelect={selectProject} loading={!!openingProject} error={projectError||registry.error}/>;if(isLauncher)return
setFolderOpen({mode:'prepare',directory})}/>{launcherSetup}{setupDialog}
{folderOpen&&setFolderOpen(false)} onTransferComplete={()=>registry.reload()}/>}
;return
/ {page==='protocol'?humanize(data?.protocols?.find(p=>p.protocol_uuid===protocol)?.name):page==='explore'?'Search predicate':page==='import'?'Add data store':page==='stores'?'Data stores':page==='cell-qc'?'Cell QC':humanize(page)}openQC(result.cell_uuid,result.epoch_uuid)} onPredicate={searchPredicate}/> Local workspace
{reviewImportJob&&}setPage('import')}/>
{folderOpen&&setFolderOpen(false)} onFiles={()=>setPage('files')} onTransferComplete={()=>registry.reload()}/>}{setupDialog}{openingProject&&
Opening {openingProject}…
}{projectError&&
{projectError}
}{page==='cell-qc'?navigation.canBack?navigation.back():setPage('overview')}/>:page==='stores'?setPage('import')} onProtocol={navigate} onFiles={()=>setPage('files')} onLogs={()=>setPage('activity')}/>:!data?:page==='overview'?setPage('import')} onExplore={()=>explore()}/>:page==='explore'?explore(null,{},true)} onExit={()=>explore()} key={route.key} session={sessions.current.get(route.key) || (route.resumeExplorer?lastExplorerSession.current:null)} onSession={rememberExplorer} initialPredicate={explorePredicate} initialRevisionId={exploreRevisionId} initialExportIntent={exploreExportIntent} initialProtocolId={exploreTargetId} onProtocolApplied={protocolApplied} onChange={changed} revision={revision} protocols={data.protocols || []} onInspect={openInspection}/>:page==='protocol'?item.protocol_uuid===protocol)} suggestionsError={suggestionsResource.error} onRetrySuggestions={suggestionsResource.reload} initialRecipe={initialRecipe} initialInspection={initialInspection} onRefine={explore} onReviewCandidate={reviewCandidate} onStores={()=>setPage('stores')} id={protocol} revision={revision} onChange={changed} onImport={()=>setPage('import')}/>:page==='activity'?:page==='files'?setPage('stores')}/>:page==='import'?setPage('stores')} jobs={importJobs} suggestions={suggestionsResource.data?.suggestions||[]} approvedHistory={suggestionsResource.data?.approved_history||[]} suggestionsError={suggestionsResource.error} onRetrySuggestions={suggestionsResource.reload} onReviewCandidate={reviewCandidate} onProtocol={navigate}/>:}
;} diff --git a/workspace-app/src/components/ProjectOnboarding.jsx b/workspace-app/src/components/ProjectOnboarding.jsx index 431b735..14cd33e 100644 --- a/workspace-app/src/components/ProjectOnboarding.jsx +++ b/workspace-app/src/components/ProjectOnboarding.jsx @@ -14,18 +14,19 @@ function ProjectContents({creating=false}){
; } -export default function ProjectOnboarding({registry,onSelect,onCreated,onCancel,onWorkspaceChanged,onOpenProject,createOnly=false,loading=false,error=null}){ +export default function ProjectOnboarding({registry,onSelect,onCreated,onCancel,onWorkspaceChanged,onOpenProject,onNewProject,onBusyChange,createOnly=false,modal=false,titleId,loading=false,error=null}){ const [creating,setCreating]=useState(createOnly),[name,setName]=useState(''),[directory,setDirectory]=useState(''),[busy,setBusy]=useState(false),[failure,setFailure]=useState(''),[created,setCreated]=useState(null); const [selectedRegistry,setSelectedRegistry]=useState(null),[rootEditing,setRootEditing]=useState(false),[rootPath,setRootPath]=useState(registry?.managed_root||''),[rootMessage,setRootMessage]=useState(''); const currentRegistry=selectedRegistry||registry; const projects=currentRegistry?.projects||[]; const recent=projects.filter(item=>item.uuid===currentRegistry?.last_project_uuid),last=projects.find(item=>item.path===currentRegistry?.last_project_path)||(recent.length===1?recent[0]:null); useEffect(()=>{ - if(!onCancel)return; + if(!onCancel||modal)return; function cancel(event){if(event.key==='Escape'&&!busy&&!loading){event.preventDefault();onCancel();}} document.addEventListener('keydown',cancel); return()=>document.removeEventListener('keydown',cancel); - },[onCancel,busy,loading]); + },[onCancel,busy,loading,modal]); + useEffect(()=>{onBusyChange?.(busy||loading);},[busy,loading,onBusyChange]); useEffect(()=>{if(selectedRegistry&®istry?.managed_root===selectedRegistry.managed_root&®istry?.workspace_initialized===selectedRegistry.workspace_initialized)setSelectedRegistry(null);},[registry,selectedRegistry]); async function chooseRoot(event){ event.preventDefault();if(busy||!rootPath.trim())return;setBusy(true);setFailure('');setRootMessage(''); @@ -38,8 +39,8 @@ export default function ProjectOnboarding({registry,onSelect,onCreated,onCancel, try{const result=await api('/projects',{method:'POST',body:{name:name.trim(),...(directory.trim()?{project_directory:directory.trim()}:{})}});if(!result.project?.uuid)throw new Error('The server did not return a project identity. Refresh the project list before retrying.');setCreated({...result.project,registry_warning:result.registry_warning});await onCreated?.(result.project);} catch(error){setFailure(error.message);}finally{setBusy(false);} } - return
-
RIEKE OS

{created?'Project ready':creating?'New project':'Your projects'}

{onCancel&&}
+ return
+
RIEKE OS

{created?'Project ready':creating?'New project':'Your projects'}

{onCancel&&}
{(error||failure)&&
{failure||error}
} {created?
{created.name}{shortPath(created.path)}

{loading?<> Opening project…:'Ready to add recordings.'}

{created.registry_warning&&

{created.registry_warning}

}
{!createOnly&&}
:creating?
@@ -47,7 +48,7 @@ export default function ProjectOnboarding({registry,onSelect,onCreated,onCancel,
{!createOnly&&}
:<> -
{onOpenProject&&}
+
{onOpenProject&&}

Your project roots

{projects.length}
{loading&&

Opening project…

} diff --git a/workspace-app/src/components/ProjectSetupDialog.css b/workspace-app/src/components/ProjectSetupDialog.css new file mode 100644 index 0000000..86c4252 --- /dev/null +++ b/workspace-app/src/components/ProjectSetupDialog.css @@ -0,0 +1,5 @@ +.project-setup-dialog{width:min(680px,calc(100vw - 32px));max-height:calc(100dvh - 40px);overflow:auto;padding:0;border:1px solid var(--border,#ded7e4);border-radius:14px;background:var(--surface,#fff);color:var(--ink,#302b36);box-shadow:0 18px 70px #30253624} +.project-setup-dialog::backdrop{background:#30253626} +.project-setup-dialog .project-onboarding.project-onboarding-modal{width:100%;margin:0;padding:24px;border:0;border-radius:0;box-shadow:none} +.project-onboarding-modal>header{margin-bottom:20px}.project-onboarding-modal h1{font-size:20px;letter-spacing:-.3px}.project-onboarding-modal .onboarding-mark{width:40px;height:40px;border-radius:10px}.project-onboarding-modal .onboarding-main-actions{gap:10px;margin-bottom:17px}.project-onboarding-modal .onboarding-main-actions>.onboarding-action-card{padding:14px 12px;min-height:90px;gap:10px}.project-onboarding-modal .onboarding-action-card strong{font-size:12px}.project-onboarding-modal .onboarding-action-card small{font-size:10px}.project-onboarding-modal .onboarding-action-icon{width:37px;height:39px;border-radius:9px}.project-onboarding-modal .onboarding-action-icon>svg{width:23px;height:23px}.project-onboarding-modal .onboarding-folder-preview{margin-top:18px}.project-onboarding-modal .onboarding-project-list{max-height:min(250px,28dvh);overflow:auto}.project-onboarding-modal .onboarding-root{margin-top:17px;padding-top:13px}.project-onboarding-modal .onboarding-contents{padding:13px 15px}.project-onboarding-modal form>label{margin-top:15px} +@media(max-width:650px){.project-setup-dialog{width:calc(100vw - 20px);max-height:calc(100dvh - 24px)}.project-setup-dialog .project-onboarding.project-onboarding-modal{padding:20px}.project-onboarding-modal .onboarding-main-actions>.onboarding-action-card{min-height:76px}.project-onboarding-modal .onboarding-project-list{max-height:24dvh}} diff --git a/workspace-app/src/components/ProjectSetupDialog.jsx b/workspace-app/src/components/ProjectSetupDialog.jsx new file mode 100644 index 0000000..3c90701 --- /dev/null +++ b/workspace-app/src/components/ProjectSetupDialog.jsx @@ -0,0 +1,24 @@ +import {useEffect,useRef} from 'react'; +import {createPortal} from 'react-dom'; +import './ProjectSetupDialog.css'; + +export default function ProjectSetupDialog({onClose,busy=false,children}){ + const dialog=useRef(null),busyRef=useRef(busy),closeRef=useRef(onClose); + busyRef.current=busy;closeRef.current=onClose; + useEffect(()=>{ + const element=dialog.current,previousFocus=document.activeElement; + element.showModal(); + return()=>{element.close();if(previousFocus?.isConnected)previousFocus.focus({preventScroll:true});}; + },[]); + function containTab(event){ + if(event.key!=='Tab')return; + const controls=[...dialog.current.querySelectorAll('button:not(:disabled),input:not(:disabled),select:not(:disabled),textarea:not(:disabled),a[href],[tabindex]:not([tabindex="-1"]):not(:disabled)')].filter(element=>element.getClientRects().length); + const first=controls[0],last=controls.at(-1),active=document.activeElement; + if(!first){event.preventDefault();dialog.current.focus();} + else if(event.shiftKey&&(active===first||active===dialog.current)){event.preventDefault();last.focus();} + else if(!event.shiftKey&&active===last){event.preventDefault();first.focus();} + } + return createPortal({event.preventDefault();if(!busyRef.current)closeRef.current?.();}}> + {children} + ,document.body); +} From c40f32e8172633a1f7bcf91d3349191534fa343a Mon Sep 17 00:00:00 2001 From: arthurh <49833088+maxwellsdm1867@users.noreply.github.com> Date: Tue, 29 Sep 2026 22:29:52 -0700 Subject: [PATCH 3/6] Add folder browsing and clear new-project actions Project setup offers Cancel and Create & open above the active workspace. Every project location has Browse, with read-only folder navigation and explicit new destination names. Validated 253 scoped frontend tests, production build, 11 folder API tests, 10 open-folder tests and live cancellation, keyboard focus and nonmutation behavior. --- docs/WORKSPACE_SHARING_AND_UPDATES.md | 9 ++ docs/dev/NATIVE_E2E_VALIDATION.md | 24 +++ docs/dev/project-browse-picker.jpg | Bin 0 -> 95420 bytes docs/dev/project-create-browse-cancel.jpg | Bin 0 -> 110933 bytes python/tests/test_workspace_folder_browser.py | 147 ++++++++++++++++++ python/workspace_folder_browser.py | 119 ++++++++++++++ python/workspace_launcher.py | 2 + .../src/components/FolderBrowserDialog.css | 6 + .../src/components/FolderBrowserDialog.jsx | 67 ++++++++ .../src/components/FolderPathInput.css | 1 + .../src/components/FolderPathInput.jsx | 21 +++ .../src/components/ProjectFolder.css | 2 + .../src/components/ProjectFolder.jsx | 16 +- .../src/components/ProjectOnboarding.css | 2 + .../src/components/ProjectOnboarding.jsx | 12 +- workspace-app/src/folderBrowser.js | 63 ++++++++ workspace-app/src/folderBrowser.test.js | 68 ++++++++ 17 files changed, 547 insertions(+), 12 deletions(-) create mode 100644 docs/dev/project-browse-picker.jpg create mode 100644 docs/dev/project-create-browse-cancel.jpg create mode 100644 python/tests/test_workspace_folder_browser.py create mode 100644 python/workspace_folder_browser.py create mode 100644 workspace-app/src/components/FolderBrowserDialog.css create mode 100644 workspace-app/src/components/FolderBrowserDialog.jsx create mode 100644 workspace-app/src/components/FolderPathInput.css create mode 100644 workspace-app/src/components/FolderPathInput.jsx create mode 100644 workspace-app/src/folderBrowser.js create mode 100644 workspace-app/src/folderBrowser.test.js diff --git a/docs/WORKSPACE_SHARING_AND_UPDATES.md b/docs/WORKSPACE_SHARING_AND_UPDATES.md index ddca198..43d1b28 100644 --- a/docs/WORKSPACE_SHARING_AND_UPDATES.md +++ b/docs/WORKSPACE_SHARING_AND_UPDATES.md @@ -7,6 +7,15 @@ Choose either project action inside it. The workspace remains visible; **×** or **Escape** closes the popup and returns focus to **+**. Creating a new project from the welcome screen also opens a popup. +Every project location field has **Browse…**. Choose folders using the local +folder picker; paths remain editable. New projects can use an existing empty +folder or a named new folder inside a chosen location. Move, share and restore +destinations ask for a new folder name. Browsing only selects a path; it does not +create or modify files. Cancel the folder picker to return to setup unchanged. + +New project setup ends with **Cancel** and **Create & open**. **Cancel** closes +the popup and returns to the visible workspace. + The left sidebar has two project actions: - **Add new project** opens an existing working project or a portable copy someone diff --git a/docs/dev/NATIVE_E2E_VALIDATION.md b/docs/dev/NATIVE_E2E_VALIDATION.md index cbfed3a..216f91b 100644 --- a/docs/dev/NATIVE_E2E_VALIDATION.md +++ b/docs/dev/NATIVE_E2E_VALIDATION.md @@ -292,3 +292,27 @@ Tab stay inside the popup. No project files were created by this UI check. Screenshots: `project-popup-over-workspace.jpg` and `project-create-popup-over-workspace.jpg`. The feature-only frontend suite and production build were checked again for this UI correction. + +## Project folder browser and creation actions — 2026-09-29 + +Every editable project location now has Browse: creation, preferred location, +opening, moving, sharing and receiving. The browser fallback navigates immediate +folders with location shortcuts, parent navigation and explicit new-folder names. +It reads folder metadata only and never creates files. The optional desktop +chooser contract is covered by adapter tests; a native OS dialog was not exercised +in this browser validation. + +A scoped checkout passed 253 frontend tests, the production build, 11 new folder +API tests and 10 existing open-folder tests. Folder tests include pagination, +permission errors, same-origin local access, missing destinations and occupied +folders containing only hidden entries or files. + +Live browser validation confirmed the new-project popup has Cancel and Create & +open above the existing workspace. Escape from the nested folder browser preserved +the project name and folder value, kept setup open and returned focus to Browse. +[Creation popup](project-create-browse-cancel.jpg) and +[Folder navigator](project-browse-picker.jpg). + +Main Cancel closed setup and restored focus to its sidebar opener at the same +overview URL. Tab/Shift+Tab remained in the nested picker. Choosing a proposed +new folder filled the form without creating that folder on disk. diff --git a/docs/dev/project-browse-picker.jpg b/docs/dev/project-browse-picker.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bf6fa8a71bcfda82e29ed495395c27ef4e388ef0 GIT binary patch literal 95420 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 Nef}-B1|9ru;-Bi`Mos_# literal 0 HcmV?d00001 diff --git a/docs/dev/project-create-browse-cancel.jpg b/docs/dev/project-create-browse-cancel.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a5c73734a33d76c9801e90172d3b508b5f4f72ab GIT binary patch literal 110933 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

ZJyij6 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 AzyJUM literal 0 HcmV?d00001 diff --git a/python/tests/test_workspace_folder_browser.py b/python/tests/test_workspace_folder_browser.py new file mode 100644 index 0000000..aa05b51 --- /dev/null +++ b/python/tests/test_workspace_folder_browser.py @@ -0,0 +1,147 @@ +"""Folder navigation stays local, read-only, shallow and explicitly paged.""" +import os +from pathlib import Path +import tempfile +import unittest +from unittest.mock import patch + +from flask import Flask + +import workspace_folder_browser as browser + + +class FolderBrowserTests(unittest.TestCase): + def setUp(self): + self.temporary = tempfile.TemporaryDirectory() + self.addCleanup(self.temporary.cleanup) + self.root = Path(self.temporary.name).resolve() + for name in ('Beta', 'alpha', 'Zulu', '.hidden'): + (self.root / name).mkdir() + (self.root / 'recording.h5').write_bytes(b'file contents must never be served') + (self.root / 'alias').symlink_to(self.root / 'alpha', target_is_directory=True) + (self.root / 'broken alias').symlink_to(self.root / 'absent', target_is_directory=True) + (self.root / 'alpha/nested').mkdir() + self.app = Flask(__name__) + browser.register_folder_browser_routes(self.app) + self.client = self.app.test_client() + self.headers = {'X-Workspace-Request': '1'} + + def test_sorted_direct_folders_only_and_no_file_reads(self): + with patch.object(Path, 'open', side_effect=AssertionError('Do not read files')): + result = browser.list_folder(self.root) + self.assertEqual(result['directory'], str(self.root)) + self.assertEqual(result['parent'], str(self.root.parent)) + self.assertEqual([folder['name'] for folder in result['folders']], ['alpha', 'Beta', 'Zulu']) + self.assertEqual([folder['path'] for folder in result['folders']], + [str(self.root / name) for name in ('alpha', 'Beta', 'Zulu')]) + self.assertEqual(result['total'], 3) + self.assertFalse(result['has_more']) + self.assertFalse(result['truncated']) + + def test_nonexistent_destination_uses_nearest_parent_without_creating_it(self): + target = self.root / 'alpha/new project/data' + before = set(self.root.rglob('*')) + result = browser.list_folder(target) + self.assertEqual(result['directory'], str(self.root / 'alpha')) + self.assertEqual([folder['name'] for folder in result['folders']], ['nested']) + self.assertEqual(before, set(self.root.rglob('*'))) + self.assertFalse(target.exists()) + + def test_home_locations_and_root_parent(self): + for name in ('Documents', 'Desktop'): + (self.root / name).mkdir() + with patch.object(Path, 'home', return_value=self.root): + result = browser.list_folder() + self.assertEqual(result['directory'], str(self.root)) + locations = {entry['name']: entry['path'] for entry in result['locations']} + self.assertEqual(locations['Home'], str(self.root)) + self.assertEqual(locations['Documents'], str(self.root / 'Documents')) + self.assertEqual(locations['Desktop'], str(self.root / 'Desktop')) + self.assertIsNone(browser.list_folder('/')['parent']) + + def test_parent_aliases_are_resolved_to_normal_absolute_paths(self): + alias = self.root / 'directory alias' + alias.symlink_to(self.root / 'alpha', target_is_directory=True) + result = browser.list_folder(alias / 'nested/future project') + self.assertEqual(result['directory'], str(self.root / 'alpha/nested')) + self.assertNotIn('directory alias', result['directory']) + + def test_pagination_is_explicit_and_bounded(self): + first = browser.list_folder(self.root, limit=2) + self.assertEqual([entry['name'] for entry in first['folders']], ['alpha', 'Beta']) + self.assertTrue(first['has_more']) + self.assertEqual(first['next_offset'], 2) + last = browser.list_folder(self.root, offset=2, limit=2) + self.assertEqual([entry['name'] for entry in last['folders']], ['Zulu']) + self.assertFalse(last['has_more']) + self.assertIsNone(last['next_offset']) + self.assertEqual(browser.list_folder(self.root, offset=10)['folders'], []) + for kwargs in ({'offset': -1}, {'offset': True}, {'limit': 0}, {'limit': 201}, {'limit': True}): + with self.subTest(kwargs=kwargs), self.assertRaises(ValueError): + browser.list_folder(self.root, **kwargs) + + def test_scan_cap_is_reported_without_silent_truncation(self): + with patch.object(browser, 'MAX_ENTRIES', 1): + result = browser.list_folder(self.root) + self.assertTrue(result['truncated']) + self.assertLessEqual(result['total'], 1) + self.assertFalse(result['empty']) + + def test_empty_counts_all_entries_including_files_and_hidden_names(self): + selected = self.root / 'empty folder' + selected.mkdir() + self.assertTrue(browser.list_folder(selected)['empty']) + for name in ('recording.h5', '.hidden file'): + with self.subTest(name=name): + file = selected / name + file.write_bytes(b'only entry') + result = browser.list_folder(selected) + self.assertEqual(result['folders'], []) + self.assertFalse(result['empty']) + file.unlink() + + def test_inaccessible_children_are_omitted_and_selected_folder_reports_error(self): + actual_access = os.access + with patch.object(browser.os, 'access', side_effect=lambda path, mode: ( + False if Path(path) == self.root / 'Beta' else actual_access(path, mode))): + result = browser.list_folder(self.root) + self.assertEqual([entry['name'] for entry in result['folders']], ['alpha', 'Zulu']) + with patch.object(browser.os, 'access', return_value=False): + with self.assertRaisesRegex(ValueError, 'Access denied'): + browser.list_folder(self.root) + with patch.object(browser.os, 'scandir', side_effect=PermissionError('private details')): + with self.assertRaisesRegex(ValueError, '^Access denied'): + browser.list_folder(self.root) + + def test_relative_empty_nonstring_and_file_paths_are_rejected(self): + for value in ('relative/folder', '', [], self.root / 'recording.h5'): + with self.subTest(value=value), self.assertRaises(ValueError): + browser.list_folder(value) + + def test_route_accepts_deliberate_local_requests_and_rejects_invalid_queries(self): + response = self.client.get('/api/folders', query_string={'directory': str(self.root), 'limit': 2}, + headers={**self.headers, 'Origin': 'http://localhost'}) + self.assertEqual(response.status_code, 200) + self.assertEqual(response.get_json()['next_offset'], 2) + for query in ({'file': str(self.root / 'recording.h5')}, {'directory': ''}, + {'directory': 'relative'}, {'offset': '-1'}, {'offset': '1.5'}, + {'offset': '\u0661'}, {'limit': '201'}, {'offset': '1' * 20}): + with self.subTest(query=query): + result = self.client.get('/api/folders', query_string=query, headers=self.headers) + self.assertEqual(result.status_code, 400) + response = self.client.get('/api/folders?directory=/&directory=/tmp', headers=self.headers) + self.assertEqual(response.status_code, 400) + + def test_privacy_boundary_rejects_untrusted_get_before_filesystem_access(self): + requests = ({'headers': {}}, + {'headers': {**self.headers, 'Origin': 'https://other.example'}}, + {'headers': self.headers, 'base_url': 'http://localhost.evil.example'}, + {'headers': self.headers, 'environ_overrides': {'REMOTE_ADDR': '192.0.2.1'}}) + with patch.object(browser, 'list_folder', side_effect=AssertionError('No filesystem access')): + for kwargs in requests: + with self.subTest(kwargs=kwargs): + self.assertEqual(self.client.get('/api/folders', **kwargs).status_code, 403) + + +if __name__ == '__main__': + unittest.main() diff --git a/python/workspace_folder_browser.py b/python/workspace_folder_browser.py new file mode 100644 index 0000000..ddd8ce9 --- /dev/null +++ b/python/workspace_folder_browser.py @@ -0,0 +1,119 @@ +"""Read-only, paged local directory navigation for the browser app.""" +from __future__ import annotations + +import os +from pathlib import Path +from urllib.parse import urlsplit + +PAGE_LIMIT = 200 +MAX_ENTRIES = 20_000 + + +def _directory(path): + if path is None: + path = Path.home() + if not isinstance(path, (str, Path)) or not str(path).strip(): + raise ValueError('Choose an absolute folder path.') + candidate = Path(str(path).strip()).expanduser() + if not candidate.is_absolute(): + raise ValueError('Choose an absolute folder path.') + try: + # Resolving supports normal macOS aliases such as /var and /tmp. + candidate = candidate.resolve() + while not candidate.exists(): + parent = candidate.parent + if parent == candidate: + raise ValueError('The folder does not exist.') + candidate = parent + if not candidate.is_dir(): + raise ValueError('Choose a folder, not a file.') + if not os.access(candidate, os.R_OK | os.X_OK): + raise ValueError('Access denied for this folder.') + return candidate + except PermissionError as error: + raise ValueError('Access denied for this folder.') from error + except (OSError, RuntimeError) as error: + raise ValueError('This folder cannot be accessed. Choose another location.') from error + + +def _locations(): + home = Path.home() + locations, seen = [], set() + for name, path in (('Home', home), ('Documents', home / 'Documents'), + ('Desktop', home / 'Desktop'), ('Volumes', Path('/Volumes')), + ('Computer', Path('/'))): + try: + if not path.is_dir() or not os.access(path, os.R_OK | os.X_OK): + continue + path = str(path.resolve()) + except (OSError, RuntimeError): + continue + if path not in seen: + locations.append({'name': name, 'path': path}) + seen.add(path) + return locations + + +def list_folder(path=None, *, offset=0, limit=PAGE_LIMIT): + """List immediate accessible folders, never files or a recursive tree. + + A destination that has not been created opens its nearest existing parent. + Page size and the number of inspected directory entries are both bounded. + """ + if type(offset) is not int or offset < 0 or type(limit) is not int or not 1 <= limit <= PAGE_LIMIT: + raise ValueError('Use a nonnegative offset and a folder page size from 1 to 200.') + root = _directory(path) + folders, truncated, empty = [], False, True + try: + with os.scandir(root) as entries: + for index, entry in enumerate(entries): + empty = False # Files, hidden names and aliases also occupy the folder. + if index >= MAX_ENTRIES: + truncated = True + break + if entry.name.startswith('.'): + continue + try: + if entry.is_symlink() or not entry.is_dir(follow_symlinks=False): + continue + child = root / entry.name + if not os.access(child, os.R_OK | os.X_OK): + continue + folders.append({'name': entry.name, 'path': str(child)}) + except OSError: + continue # An inaccessible or disappearing child is not selectable. + except OSError as error: + raise ValueError('Access denied for this folder. Choose another location.') from error + folders.sort(key=lambda folder: (folder['name'].casefold(), folder['name'])) + has_more = offset + limit < len(folders) + return {'directory': str(root), 'parent': None if root == root.parent else str(root.parent), + 'folders': folders[offset:offset + limit], 'locations': _locations(), + 'offset': offset, 'limit': limit, 'total': len(folders), 'has_more': has_more, + 'next_offset': offset + limit if has_more else None, 'truncated': truncated, + 'empty': empty and not truncated} + + +def register_folder_browser_routes(app): + """Require a deliberate same-origin loopback request even though this is GET.""" + from flask import jsonify, request + + @app.get('/api/folders') + def folder_browser(): + if (request.remote_addr not in {'127.0.0.1', '::1'} + or urlsplit(request.host_url).hostname not in {'localhost', '127.0.0.1', '::1'} + or request.headers.get('X-Workspace-Request') != '1' + or request.headers.get('Origin', request.host_url.rstrip('/')) != request.host_url.rstrip('/')): + return jsonify(error='Folder browsing requires a same-origin local app request.'), 403 + if (set(request.args) - {'directory', 'offset', 'limit'} + or any(len(request.args.getlist(key)) != 1 for key in request.args)): + return jsonify(error='Folder browsing accepts one directory, offset and limit only.'), 400 + numbers = {} + for key, default in (('offset', 0), ('limit', PAGE_LIMIT)): + value = request.args.get(key, str(default)) + if not value.isascii() or not value.isdecimal() or len(value) > 9: + return jsonify(error='Folder offset and page size must be integers.'), 400 + numbers[key] = int(value) + try: + return jsonify(list_folder(request.args.get('directory'), **numbers)) + except ValueError as error: + return jsonify(error=str(error)), 400 diff --git a/python/workspace_launcher.py b/python/workspace_launcher.py index 1ea0835..a230737 100644 --- a/python/workspace_launcher.py +++ b/python/workspace_launcher.py @@ -14,6 +14,8 @@ def register_project_routes(app, *, retinanalysis_dir, project_dir=None, root=No """Used by both the launcher and an opened project's API.""" from workspace_app_routes import register_app_routes register_app_routes(app) + from workspace_folder_browser import register_folder_browser_routes + register_folder_browser_routes(app) current = Path(project_dir).resolve() if project_dir else None root_provider = root if callable(root) else lambda: managed_root(root or current.parent) @app.get('/api/projects') diff --git a/workspace-app/src/components/FolderBrowserDialog.css b/workspace-app/src/components/FolderBrowserDialog.css new file mode 100644 index 0000000..a825449 --- /dev/null +++ b/workspace-app/src/components/FolderBrowserDialog.css @@ -0,0 +1,6 @@ +.folder-browser-dialog{width:min(680px,calc(100vw - 40px));max-height:calc(100vh - 50px);padding:0;overflow:auto;border:1px solid var(--border,#ded7e4);border-radius:13px;background:var(--surface,#fff);color:var(--ink,#302b36);box-shadow:0 20px 70px #25143433}.folder-browser-dialog::backdrop{background:#21132d77}.folder-browser-dialog>header{display:flex;align-items:center;gap:12px;padding:20px 22px 16px}.folder-browser-mark{display:grid;place-items:center;width:41px;height:43px;border-radius:11px;background:var(--accent-soft,#eee5f4);color:var(--accent,#67447d);flex-shrink:0}.folder-browser-dialog header>div{min-width:0;flex:1}.folder-browser-dialog header small{font-size:9px;letter-spacing:1px;color:var(--ink-muted,#706478)}.folder-browser-dialog h2{font-size:18px;font-weight:650;line-height:1.4;margin:3px 0 0}.folder-browser-dialog .icon-button{padding:6px;border:0;background:transparent;color:var(--ink-muted);flex-shrink:0}.folder-browser-dialog .icon-button:hover{background:var(--surface-subtle,#f7f4f9)}.folder-browser-location{display:flex;align-items:center;gap:9px;margin:0 22px 14px;padding:7px 9px;background:var(--surface-subtle,#f7f4f9);border:1px solid #e9e1ef;border-radius:7px}.folder-browser-location>code{flex:1;min-width:0;font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--ink-secondary,#62566d)}.folder-browser-path-form{display:flex;gap:8px;padding:0 22px 14px}.folder-browser-path-form>input{min-width:0;flex:1;font-size:12px;padding:8px}.folder-browser-path-form>button{font-size:11px} +.folder-browser-body{display:grid;grid-template-columns:140px minmax(0,1fr);border-top:1px solid var(--border);border-bottom:1px solid var(--border);min-height:250px}.folder-browser-body>nav{display:flex;flex-direction:column;gap:4px;padding:13px 10px;background:#fcfafd;border-right:1px solid #e9e1ef}.folder-browser-body>nav>button{justify-content:flex-start;padding:9px 8px;font-size:11px;border:0;background:transparent;text-align:left}.folder-browser-body>nav>button:hover{background:var(--accent-soft)}.folder-browser-body>nav>button>svg{color:#947aa4;flex-shrink:0}.folder-browser-body>nav>button>span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.folder-browser-folders{padding:9px;min-width:0;max-height:340px;overflow:auto}.folder-browser-folder{display:flex;align-items:center;gap:10px;width:100%;padding:10px 11px;text-align:left;font-size:12px;border:0;border-radius:6px;background:transparent}.folder-browser-folder:hover{background:var(--surface-subtle);color:var(--accent)}.folder-browser-folder>svg{color:#9a7cab;flex-shrink:0}.folder-browser-folder>span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.folder-browser-folder>svg:last-child{color:#ac98b8}.folder-browser-status{display:flex;flex-direction:column;justify-content:center;align-items:center;gap:11px;min-height:235px;padding:20px;text-align:center;color:var(--ink-muted);font-size:12px;line-height:1.5;overflow-wrap:anywhere}.folder-browser-status>svg{color:#a389b3}.folder-browser-status>small{font-size:11px}.folder-browser-status>button{font-size:11px;padding:6px 9px}.folder-browser-pages{display:flex;justify-content:space-between;align-items:center;gap:8px;padding:9px 20px;border-bottom:1px solid var(--border);font-size:10px;color:var(--ink-muted)}.folder-browser-pages>button{padding:5px 7px;font-size:10px} +.folder-browser-new{padding:16px 22px 2px}.folder-browser-new>label{display:flex;align-items:center;gap:7px;font-size:12px;font-weight:600;color:var(--ink-secondary)}.folder-browser-new>label>svg{color:#9678a7}.folder-browser-new>input{display:block;width:100%;margin-top:8px;padding:9px 11px;font-size:13px}.folder-browser-new>code,.folder-browser-new>small{display:block;margin-top:7px;font-size:10px;line-height:1.5;color:var(--ink-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.folder-browser-new>.folder-browser-name-error{color:var(--error-ink,#963f3f);white-space:normal}.folder-browser-dialog>footer{display:flex;justify-content:flex-end;gap:8px;padding:16px 22px 20px}.folder-browser-dialog>footer>button{font-size:12px;padding:9px 12px} +.folder-browser-create-option{display:flex;align-items:center;gap:8px;margin:14px 22px 0;font-size:11px;color:var(--ink-secondary)}.folder-browser-create-option>input{margin:0;accent-color:var(--accent)}.folder-browser-create-option>svg{color:#9678a7;flex-shrink:0} +.folder-browser-limit{padding:10px 22px;background:var(--surface-subtle);color:var(--warning-ink,#78531d);font-size:11px;line-height:1.5} +@media(max-width:550px){.folder-browser-dialog{width:calc(100vw - 20px);max-height:calc(100vh - 20px)}.folder-browser-dialog>header{padding:16px}.folder-browser-location{margin-right:16px;margin-left:16px}.folder-browser-body{grid-template-columns:112px minmax(0,1fr)}.folder-browser-body>nav{padding:10px 5px}.folder-browser-body>nav>button{font-size:10px;padding:9px 6px}.folder-browser-new{padding:13px 16px 0}.folder-browser-dialog>footer{padding:15px 16px}.folder-browser-folder{padding:10px 7px;font-size:11px}.folder-browser-pages{padding:9px 14px}} diff --git a/workspace-app/src/components/FolderBrowserDialog.jsx b/workspace-app/src/components/FolderBrowserDialog.jsx new file mode 100644 index 0000000..f7ece1e --- /dev/null +++ b/workspace-app/src/components/FolderBrowserDialog.jsx @@ -0,0 +1,67 @@ +import {useEffect,useId,useRef,useState} from 'react'; +import {createRoot} from 'react-dom/client'; +import {ArrowLeft,ArrowRight,ChevronRight,Folder,FolderOpen,FolderPlus,Home,LoaderCircle,MapPin,Pencil,X} from 'lucide-react'; +import {api} from '../api.js'; +import {absoluteFolderPath,folderParentPath,newFolderPath,readFolderListing} from '../folderBrowser.js'; +import './FolderBrowserDialog.css'; + +export function openFolderBrowserDialog(options){ + if(!globalThis.document?.body)throw new Error('The folder browser is unavailable. Reopen the app and try again.'); + return new Promise(resolve=>{ + const host=document.createElement('div');host.className='folder-browser-host';document.body.appendChild(host); + const root=createRoot(host);let finished=false; + const finish=value=>{if(finished)return;finished=true;resolve(value);queueMicrotask(()=>{root.unmount();host.remove();});}; + root.render(); + }); +} + +export default function FolderBrowserDialog({purpose='existing',title='Choose a folder',initialDirectory='',initialName='New project',request=api,onChoose}){ + const dialog=useRef(null),nameInput=useRef(null),chooseButton=useRef(null),titleId=useId(),nameId=useId(); + const [directory,setDirectory]=useState(initialDirectory),[offset,setOffset]=useState(0),[data,setData]=useState(null),[loading,setLoading]=useState(true),[error,setError]=useState(''); + const [name,setName]=useState(initialName),[editingPath,setEditingPath]=useState(false),[pathDraft,setPathDraft]=useState(initialDirectory),[retry,setRetry]=useState(0); + const [createNew,setCreateNew]=useState(true); + const usesNew=purpose==='new'||purpose==='create'&&createNew; + useEffect(()=>{const element=dialog.current;element.showModal();if(purpose!=='existing')nameInput.current?.focus();return()=>element.close();},[purpose]); + useEffect(()=>{ + if(purpose==='create'&&!usesNew&&!loading&&!dialog.current.contains(document.activeElement))chooseButton.current?.focus(); + },[purpose,usesNew,loading]); + useEffect(()=>{ + const controller=new AbortController();setLoading(true);setError(''); + readFolderListing({directory,offset,request:(path)=>request(path,{signal:controller.signal})}).then(listing=>{ + if(controller.signal.aborted)return;setData(listing);setLoading(false);if(purpose==='create')setCreateNew(!listing.empty); + }).catch(failure=>{if(!controller.signal.aborted){setData(null);setLoading(false);setError(`Cannot browse this folder: ${failure.message}`);}}); + return()=>controller.abort(); + },[directory,offset,retry,request,purpose]); + const location=data?.directory||directory; + const parent=data?.parent??(location?folderParentPath(location):null); + let proposed=null,nameError=''; + if(usesNew&&location){ + try{proposed=newFolderPath(location,name);if(data?.folders.some(folder=>folder.name===name.trim()))nameError='A folder with this name already exists.';} + catch(failure){nameError=failure.message;} + } + function navigate(path){setDirectory(path);setOffset(0);setEditingPath(false);setRetry(value=>value+1);} + function enterPath(event){event.preventDefault();try{navigate(absoluteFolderPath(pathDraft.trim()));}catch(failure){setError(failure.message);}} + function choose(){if(loading||!data||nameError||usesNew&&!proposed||purpose==='create'&&!usesNew&&!data.empty)return;onChoose(usesNew?{directory:data.directory,name:name.trim()}:data.directory);} + function trapFocus(event){ + if(event.key!=='Tab')return; + const controls=[...dialog.current.querySelectorAll('button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),a[href],[tabindex]:not([tabindex="-1"])')].filter(element=>!element.hidden&&element.getClientRects().length); + if(!controls.length)return; + event.preventDefault(); + const index=controls.indexOf(document.activeElement),step=event.shiftKey?-1:1; + controls[index<0?(event.shiftKey?controls.length-1:0):(index+step+controls.length)%controls.length].focus(); + } + const locations=data?.locations||[]; + return

{event.preventDefault();onChoose(null);}}> +
{purpose!=='existing'?:}
{purpose==='new'?'NEW FOLDER':purpose==='create'?'PROJECT FOLDER':'FOLDER BROWSER'}

{title}

+
{location||'Home'}
+ {editingPath&&
setPathDraft(event.target.value)} placeholder="/absolute/folder/path"/>
} +
+ {loading?
Loading folders…
:error?
{error}
:<>{data?.folders.map(folder=>)}{data&&!data.folders.length&&
{data.empty?'Empty folder':'No subfolders'}{usesNew?'Name a new folder below.':'You can choose this folder.'}
}} +
+ {data&&(data.has_more||data.offset>0)&&
{data.offset+1}–{data.offset+data.folders.length} of {data.total}
} + {data?.truncated&&
Some folders are not listed. Use “Enter a folder path” to reach them.
} + {purpose==='create'&&data&&} + {usesNew&&
setName(event.target.value)} onKeyDown={event=>{if(event.key==='Enter'){event.preventDefault();choose();}}}/>{nameError?{nameError}:proposed&&{proposed}}
} +
+
; +} diff --git a/workspace-app/src/components/FolderPathInput.css b/workspace-app/src/components/FolderPathInput.css new file mode 100644 index 0000000..c6511c4 --- /dev/null +++ b/workspace-app/src/components/FolderPathInput.css @@ -0,0 +1 @@ +.folder-path-field{min-width:0;width:100%;flex:1}.folder-path-control{display:flex;align-items:stretch;gap:7px;min-width:0}.folder-path-control>input{flex:1;min-width:0;width:0}.folder-path-control>button{flex-shrink:0;padding:8px 11px;font-size:11px;white-space:nowrap;gap:6px}.folder-path-error{display:block;margin-top:7px;padding:8px 10px;border-radius:6px;background:#fff1eb;color:#963f3f;font-size:11px;line-height:1.45;overflow-wrap:anywhere} diff --git a/workspace-app/src/components/FolderPathInput.jsx b/workspace-app/src/components/FolderPathInput.jsx new file mode 100644 index 0000000..23e4f71 --- /dev/null +++ b/workspace-app/src/components/FolderPathInput.jsx @@ -0,0 +1,21 @@ +import {useEffect,useRef,useState} from 'react'; +import {FolderOpen,LoaderCircle} from 'lucide-react'; +import {browseFolder} from '../folderBrowser.js'; +import './FolderPathInput.css'; + +export default function FolderPathInput({value,onChange,disabled=false,purpose='existing',title='Choose a folder',suggestedName,onBusyChange,...inputProps}){ + const [choosing,setChoosing]=useState(false),[error,setError]=useState(''); + const mounted=useRef(false),browseButton=useRef(null),restoreFocus=useRef(false); + useEffect(()=>{mounted.current=true;return()=>{mounted.current=false;};},[]); + useEffect(()=>{if(!choosing&&!disabled&&restoreFocus.current){restoreFocus.current=false;browseButton.current?.focus({preventScroll:true});}},[choosing,disabled]); + async function browse(){ + if(disabled||choosing)return; + setChoosing(true);setError('');onBusyChange?.(true); + try{ + const directory=await browseFolder({directory:value,purpose,title,suggestedName}); + if(mounted.current&&directory!==null)onChange(directory); + }catch(error){if(mounted.current)setError(error.message||'The folder chooser could not open.');} + finally{if(mounted.current){restoreFocus.current=true;setChoosing(false);onBusyChange?.(false);}} + } + return
{setError('');onChange(event.target.value);}}/>
{error&&{error}}
; +} diff --git a/workspace-app/src/components/ProjectFolder.css b/workspace-app/src/components/ProjectFolder.css index bb264e8..d9f2067 100644 --- a/workspace-app/src/components/ProjectFolder.css +++ b/workspace-app/src/components/ProjectFolder.css @@ -45,3 +45,5 @@ @media(prefers-reduced-motion:reduce){.project-folder-dialog .spin{animation:none}} .project-folder-root-suggestions{display:grid;gap:8px;margin-top:17px;padding-top:14px;border-top:1px solid #ede5f3}.project-folder-root-suggestions>p{font-size:11px;margin-bottom:3px;color:#8a7198}.project-folder-root-suggestions>button{display:flex;align-items:center;gap:10px;padding:12px;text-align:left;white-space:normal;border:1px solid #dfd2e8;background:#fcfafd;border-radius:9px}.project-folder-root-suggestions>button>svg{color:#9779a7;flex-shrink:0}.project-folder-root-suggestions>button>span:nth-child(2){flex:1;min-width:0}.project-folder-root-suggestions strong{display:flex;align-items:center;gap:7px;flex-wrap:wrap;font-size:12px;color:#735582}.project-folder-root-suggestions strong>small{font-size:9px;font-weight:400;padding:2px 5px;border-radius:4px;background:#eee5f5;color:#997caf}.project-folder-root-suggestions code{display:block;overflow-wrap:anywhere;font:10px/1.5 ui-monospace,SFMono-Regular,monospace;color:#9983a5;margin-top:4px}.project-folder-root-suggestions .project-folder-use-root{display:flex;align-items:center;gap:5px;flex-shrink:0;font-size:10px;color:#8b6c9f}.project-folder-root-suggestions>button:hover:not(:disabled){background:#f5eef9;border-color:#c4acd4}@media(max-width:400px){.project-folder-root-suggestions>button{flex-wrap:wrap}.project-folder-root-suggestions .project-folder-use-root{margin-left:auto}} + +.project-folder-dialog .folder-path-control>input{width:0}.project-folder-organize>.folder-path-field{margin-top:7px}.project-folder-input-row>.folder-path-field{flex:1;min-width:0}@media(max-width:560px){.project-folder-input-row{flex-wrap:wrap}.project-folder-input-row>.folder-path-field{flex-basis:100%}.project-folder-input-row>button{margin-left:auto}} diff --git a/workspace-app/src/components/ProjectFolder.jsx b/workspace-app/src/components/ProjectFolder.jsx index 6b68e62..e5ebe6f 100644 --- a/workspace-app/src/components/ProjectFolder.jsx +++ b/workspace-app/src/components/ProjectFolder.jsx @@ -4,6 +4,7 @@ import {Activity,ArrowRight,Check,CheckCircle2,ChevronRight,Clock3,Copy,Database import {api} from '../api.js'; import {inspectAndOpenProject,localProjectUrl,runProjectTransfer} from '../projectTransfer.js'; import './ProjectFolder.css'; +import FolderPathInput from './FolderPathInput.jsx'; const tasks=[{mode:'open',label:'Open',icon:FolderOpen},{mode:'prepare',label:'Share',icon:Package},{mode:'restore',label:'Receive',icon:PackageOpen}]; const contents=[{label:'Recordings',icon:Activity},{label:'Database',icon:Database},{label:'Saved queries',icon:Search},{label:'Tags',icon:Tags},{label:'History',icon:Clock3},{label:'Exports',icon:Download}]; @@ -15,7 +16,8 @@ export default function ProjectFolder({project,onClose,onFiles,initialMode='open const [directory,setDirectory]=useState(initialDirectory||(initialMode==='restore'?'':project?.path||'')); const [destination,setDestination]=useState(''),[inspection,setInspection]=useState(null); const [rootSuggestions,setRootSuggestions]=useState(null); - const [busy,setBusy]=useState(false),[opening,setOpening]=useState(false),[closing,setClosing]=useState(false),[checking,setChecking]=useState(false),[error,setError]=useState(''),[result,setResult]=useState(null); + const [working,setBusy]=useState(false),[browsing,setBrowsing]=useState(false),[opening,setOpening]=useState(false),[closing,setClosing]=useState(false),[checking,setChecking]=useState(false),[error,setError]=useState(''),[result,setResult]=useState(null); + const busy=working||browsing; useEffect(()=>{const element=dialog.current;element.showModal();return()=>{requestController.current?.abort();element.close();};},[]); function chooseMode(next){ setMode(next);setDirectory(next==='prepare'?project?.path||initialDirectory||'':'');setDestination('');setError('');setResult(null);setInspection(null);setRootSuggestions(null); @@ -84,22 +86,22 @@ export default function ProjectFolder({project,onClose,onFiles,initialMode='open {project&&
{project.name||'Current project'}Open here{project.path||'Folder unavailable'}
{project.path&&}{onFiles&&}{project.database_kind==='native-mysql'&&!needsClose&&}
}
-

{mode==='open'?'Add a project':preparing?'Make a portable copy':'Receive a portable copy'}

{mode==='open'?'Paste its top folder path, wherever it lives.':preparing?'Everything your colleague needs, in one folder.':'Check the received top folder, then restore locally.'}

+

{mode==='open'?'Add a project':preparing?'Make a portable copy':'Receive a portable copy'}

{mode==='open'?'Browse to its top folder, wherever it lives.':preparing?'Everything your colleague needs, in one folder.':'Check the received top folder, then restore locally.'}

{mode!=='open'&&
{contents.map(({label,icon:Icon})=>{label})}
} {mode==='open'?
{event.preventDefault();if(!busy&&openPath.trim()&&(!relocate||movePath.trim()))openDirectory(openPath.trim());}}> - {setOpenPath(event.target.value);setError('');setRootSuggestions(null);}} placeholder="/Users/you/Research/Spike response study"/>Usually named for your project, with the project files directly inside. Choose this folder, not its parent or an inner folder. -
Optional: move before opening {relocate&&<>setMovePath(event.target.value)} placeholder={preferredRoot?`${preferredRoot}/my-project`:'/absolute/path/to/new-folder'}/>Closed projects only · destination must be new · same disk}
+ {setOpenPath(value);setError('');setRootSuggestions(null);}} onBusyChange={setBrowsing} purpose="existing" title="Open project folder" placeholder="/Users/you/Research/Spike response study"/>Usually named for your project, with the project files directly inside. Choose this folder, not its parent or an inner folder. +
Optional: move before opening {relocate&&<>Closed projects only · destination must be new · same disk}
Checked before opening
:result?
{preparing?'Portable copy ready':'Project restored'}{result.directory}

{preparing?'Send this entire folder → recipient chooses Add new project.':'Recordings, saved work and history are ready.'}

{result.registry_warning&&

{result.registry_warning}

}{!preparing&&}
:
-
{setDirectory(event.target.value);setResult(null);setInspection(null);setError('');setRootSuggestions(null);}} placeholder="/absolute/path/to/project"/>{!preparing&&}
+
{setDirectory(value);setResult(null);setInspection(null);setError('');setRootSuggestions(null);}} onBusyChange={setBrowsing} purpose="existing" title={preparing?'Project folder to share':'Received portable copy'} placeholder="/absolute/path/to/project"/>{!preparing&&}
{needsClose&&
Close this project before sharing.
} {inspection&&
{inspection.project?.name||'Project'} Files verified{Number.isFinite(inspection.source_count)?` · ${inspection.source_count} recording${inspection.source_count===1?'':'s'}`:''}
} {inspection?.warnings?.map((warning,index)=>

{warning}

)} - {((preparing&&!needsClose)||inspection)&&<>{setDestination(event.target.value);setResult(null);}} placeholder="/absolute/path/to/new-folder"/>Choose a folder that does not exist yet.
{preparing?'Verification included':'Verified on restore'}
} + {((preparing&&!needsClose)||inspection)&&<>{setDestination(value);setResult(null);}} onBusyChange={setBrowsing} purpose="new" title={preparing?'Portable copy destination':'Restored project folder'} suggestedName={preparing?`${directory.trim().replace(/\/$/,'').split('/').pop()||'Project'} shared`:inspection?.project?.name} placeholder="/absolute/path/to/new-folder"/>Choose a folder that does not exist yet.
{preparing?'Verification included':'Verified on restore'}
} } {rootSuggestions&&

{rootSuggestions.message||'Choose the folder containing the project files.'}

{rootSuggestions.candidates?.filter(candidate=>typeof candidate.path==='string').map(candidate=>)}
}
- {busy&&
{progress}Keep this window open.
} + {working&&
{progress}Keep this window open.
} {error&&

{error}

}
{copied?'Project path copied':'Your project · your files'}
,document.body); diff --git a/workspace-app/src/components/ProjectOnboarding.css b/workspace-app/src/components/ProjectOnboarding.css index 65f8989..11fa02f 100644 --- a/workspace-app/src/components/ProjectOnboarding.css +++ b/workspace-app/src/components/ProjectOnboarding.css @@ -14,3 +14,5 @@ .onboarding-step-label{display:flex;align-items:center;gap:8px}.onboarding-step-label>b{display:grid;place-items:center;width:21px;height:21px;border-radius:6px;background:var(--accent-soft,#eee5f4);color:var(--accent,#67447d);font-size:10px;font-weight:600;flex-shrink:0}.onboarding-create-form label>small{line-height:1.45} .onboarding-created>.onboarding-registry-warning{grid-column:1/-1;padding:9px 11px;background:#fbf5eb;border-radius:6px;color:#94794d;font-size:11px;line-height:1.5;overflow-wrap:anywhere} + +.onboarding-field{display:flex;flex-direction:column;gap:7px;margin-top:15px;font-size:12px;color:var(--ink-secondary)}.onboarding-field>label{display:flex;flex-direction:column;gap:7px;font-weight:600}.onboarding-field>small{font-size:11px;line-height:1.45;color:var(--ink-muted)}.onboarding-root-form>.onboarding-field{flex:1}.project-onboarding .folder-path-control>input{width:0}.project-onboarding .folder-path-control>button{font-size:11px;padding:8px 11px}@media(max-width:650px){.onboarding-root-form>.onboarding-field{flex-basis:100%}} diff --git a/workspace-app/src/components/ProjectOnboarding.jsx b/workspace-app/src/components/ProjectOnboarding.jsx index 14cd33e..7a73d01 100644 --- a/workspace-app/src/components/ProjectOnboarding.jsx +++ b/workspace-app/src/components/ProjectOnboarding.jsx @@ -3,6 +3,7 @@ import {Activity,ArrowRight,Check,ChevronDown,Database,Download,FolderOpen,GitBr import {api} from '../api.js'; import {projectColor} from './ProjectNavigator.jsx'; import './ProjectOnboarding.css'; +import FolderPathInput from './FolderPathInput.jsx'; const folderName=path=>String(path||'').replace(/\/+$/,'').split('/').pop()||path; const shortPath=path=>{const parts=String(path||'').split('/').filter(Boolean);return parts.length>2?`…/${parts.slice(-2).join('/')}`:path;}; @@ -15,8 +16,9 @@ function ProjectContents({creating=false}){ } export default function ProjectOnboarding({registry,onSelect,onCreated,onCancel,onWorkspaceChanged,onOpenProject,onNewProject,onBusyChange,createOnly=false,modal=false,titleId,loading=false,error=null}){ - const [creating,setCreating]=useState(createOnly),[name,setName]=useState(''),[directory,setDirectory]=useState(''),[busy,setBusy]=useState(false),[failure,setFailure]=useState(''),[created,setCreated]=useState(null); + const [creating,setCreating]=useState(createOnly),[name,setName]=useState(''),[directory,setDirectory]=useState(''),[working,setBusy]=useState(false),[browsing,setBrowsing]=useState(false),[failure,setFailure]=useState(''),[created,setCreated]=useState(null); const [selectedRegistry,setSelectedRegistry]=useState(null),[rootEditing,setRootEditing]=useState(false),[rootPath,setRootPath]=useState(registry?.managed_root||''),[rootMessage,setRootMessage]=useState(''); + const busy=working||browsing; const currentRegistry=selectedRegistry||registry; const projects=currentRegistry?.projects||[]; const recent=projects.filter(item=>item.uuid===currentRegistry?.last_project_uuid),last=projects.find(item=>item.path===currentRegistry?.last_project_path)||(recent.length===1?recent[0]:null); @@ -42,11 +44,11 @@ export default function ProjectOnboarding({registry,onSelect,onCreated,onCancel, return
RIEKE OS

{created?'Project ready':creating?'New project':'Your projects'}

{onCancel&&}
{(error||failure)&&
{failure||error}
} - {created?
{created.name}{shortPath(created.path)}

{loading?<> Opening project…:'Ready to add recordings.'}

{created.registry_warning&&

{created.registry_warning}

}
{!createOnly&&}
:creating?
+ {created?
{created.name}{shortPath(created.path)}

{loading?<> Opening project…:'Ready to add recordings.'}

{created.registry_warning&&

{created.registry_warning}

}
{!createOnly&&}
:creating? - +
A matching folder name is easier to recognize; other names work too.
-
{!createOnly&&}
+
:<>
{onOpenProject&&}
@@ -55,7 +57,7 @@ export default function ProjectOnboarding({registry,onSelect,onCreated,onCancel,
{projects.map(project=>)}
{!projects.length&&!loading&&
No projects yetChoose a project root or start fresh above.
}
- {rootEditing&&
} + {rootEditing&&
} {rootMessage&&

} }
; diff --git a/workspace-app/src/folderBrowser.js b/workspace-app/src/folderBrowser.js new file mode 100644 index 0000000..5faf215 --- /dev/null +++ b/workspace-app/src/folderBrowser.js @@ -0,0 +1,63 @@ +// Choosing a path never creates, restores, moves or modifies a folder. +export function absoluteFolderPath(value){ + if(typeof value!=='string'||!value.startsWith('/')||value.includes('\0'))throw new Error('Choose an absolute folder path on this computer.'); + return value.replace(/\/+$/,'')||'/'; +} +export function folderParentPath(value){ + const path=absoluteFolderPath(value); + if(path==='/')return null; + return path.slice(0,path.lastIndexOf('/'))||'/'; +} +export function folderBasename(value){ + return value?absoluteFolderPath(value).split('/').pop():''; +} +export function newFolderPath(parent,name){ + const directory=absoluteFolderPath(parent); + if(typeof name!=='string'||!name.trim()||['.','..'].includes(name.trim())||/[\\/\x00-\x1f]/.test(name)||name.trim().length>255)throw new Error('Use a folder name without slashes, dots alone or control characters.'); + return `${directory==='/'?'':directory}/${name.trim()}`; +} +export async function readFolderListing({directory='',offset=0,request}){ + if(directory)absoluteFolderPath(directory); + if(!Number.isSafeInteger(offset)||offset<0)throw new Error('Folder page is invalid.'); + const query=new URLSearchParams({offset:String(offset),limit:'200'}); + if(directory)query.set('directory',directory); + const data=await request(`/folders?${query}`); + if(!data||typeof data!=='object'||!Array.isArray(data.folders)||!Array.isArray(data.locations)||typeof data.has_more!=='boolean'||!Number.isSafeInteger(data.offset)||data.offset<0||!Number.isSafeInteger(data.total)||data.total<0)throw new Error('The folder browser returned an incomplete listing.'); + if(Object.hasOwn(data,'empty')&&typeof data.empty!=='boolean')throw new Error('The folder browser returned invalid empty-folder information.'); + if(Object.hasOwn(data,'truncated')&&typeof data.truncated!=='boolean')throw new Error('The folder browser returned invalid listing-limit information.'); + absoluteFolderPath(data.directory); + if(data.parent!==null)absoluteFolderPath(data.parent); + for(const folder of [...data.folders,...data.locations]){ + if(!folder||typeof folder.name!=='string'||!folder.name)throw new Error('The folder browser returned an invalid folder.'); + absoluteFolderPath(folder.path); + } + if(data.has_more&&(!Number.isSafeInteger(data.next_offset)||data.next_offset<=data.offset))throw new Error('The next folder page is unavailable.'); + return data; +} +async function chooseFolderDialog(options){ + const {openFolderBrowserDialog}=await import('./components/FolderBrowserDialog.jsx'); + return openFolderBrowserDialog(options); +} +export async function browseFolder({directory='',purpose='existing',title,suggestedName,parentDirectory, + nativeBridge=globalThis.window?.riekeDesktop||null,chooseDialog=chooseFolderDialog,request}={}){ + if(!['existing','new','create'].includes(purpose))throw new Error('Choose an existing folder, an empty project folder or a new destination.'); + let initialDirectory=directory?absoluteFolderPath(directory):''; + const initialName=purpose!=='existing'?(folderBasename(initialDirectory)||suggestedName||'New project'):undefined; + if(purpose==='new')initialDirectory=parentDirectory?absoluteFolderPath(parentDirectory):(initialDirectory?folderParentPath(initialDirectory)||'/':''); + if(typeof nativeBridge?.chooseProjectFolder==='function'){ + let selected; + try{selected=await nativeBridge.chooseProjectFolder();} + catch(error){throw new Error(`The folder chooser could not open: ${error.message||'Try again.'}`);} + if(selected===null||selected===undefined)return null; + const nativePath=absoluteFolderPath(selected); + if(purpose==='existing')return nativePath; + initialDirectory=nativePath; + } + const selection=await chooseDialog({purpose,title:title||(purpose!=='existing'?'Choose a project folder':'Choose a folder'),initialDirectory,initialName,request}); + if(selection===null||selection===undefined)return null; + if(purpose==='new'||purpose==='create'&&typeof selection==='object'){ + if(!selection||typeof selection!=='object')throw new Error('Choose a parent folder and name the new folder.'); + return newFolderPath(selection.directory,selection.name); + } + return absoluteFolderPath(selection); +} diff --git a/workspace-app/src/folderBrowser.test.js b/workspace-app/src/folderBrowser.test.js new file mode 100644 index 0000000..4ed97e0 --- /dev/null +++ b/workspace-app/src/folderBrowser.test.js @@ -0,0 +1,68 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import {absoluteFolderPath,browseFolder,newFolderPath,readFolderListing} from './folderBrowser.js'; + +test('native existing selection returns its exact absolute folder and never invokes browser fallback',async()=>{ + let chosen=0; + const result=await browseFolder({purpose:'existing',nativeBridge:{chooseProjectFolder:async()=>{chosen++;return '/Users/scientist/Study folder';}},chooseDialog:()=>assert.fail('Native choice must not start browser fallback')}); + assert.equal(result,'/Users/scientist/Study folder');assert.equal(chosen,1); +}); + +test('native cancel stays cancelled for existing, new and create without a second chooser',async()=>{ + for(const purpose of ['existing','new','create'])assert.equal(await browseFolder({purpose,nativeBridge:{chooseProjectFolder:async()=>null},chooseDialog:()=>assert.fail('Cancellation must not open another chooser')}),null); +}); + +test('browser fallback selects folders through an injected dialog without filesystem writes',async()=>{ + let options; + const result=await browseFolder({directory:'/Volumes/Research',purpose:'existing',title:'Add a project',nativeBridge:null,chooseDialog:async value=>{options=value;return '/Volumes/Research/Received';}}); + assert.equal(result,'/Volumes/Research/Received'); + assert.equal(options.initialDirectory,'/Volumes/Research'); + assert.equal(options.purpose,'existing'); + assert.equal(options.title,'Add a project'); + assert.equal(await browseFolder({nativeBridge:null,chooseDialog:async()=>null}),null); +}); + +test('new native choice is a parent followed by an explicit child name, never the existing parent itself',async()=>{ + let options; + const result=await browseFolder({purpose:'new',directory:'/old/location/Received study',nativeBridge:{chooseProjectFolder:async()=>'/selected/parent'},chooseDialog:async value=>{options=value;return {directory:value.initialDirectory,name:value.initialName};}}); + assert.equal(options.initialDirectory,'/selected/parent'); + assert.equal(options.initialName,'Received study'); + assert.equal(result,'/selected/parent/Received study'); + await assert.rejects(browseFolder({purpose:'new',nativeBridge:null,chooseDialog:async()=>'/existing/parent'}),/parent folder and name/); +}); + +test('browser new destination seeds its parent and supports naming without any path paste',async()=>{ + let options; + const result=await browseFolder({purpose:'new',directory:'/research/My study',nativeBridge:null,chooseDialog:async value=>{options=value;return {directory:'/Volumes/Other drive',name:'Restored study'};}}); + assert.equal(options.initialDirectory,'/research');assert.equal(options.initialName,'My study'); + assert.equal(result,'/Volumes/Other drive/Restored study'); + await browseFolder({purpose:'new',suggestedName:'Shared study',nativeBridge:null,chooseDialog:async value=>{assert.equal(value.initialName,'Shared study');assert.equal(value.initialDirectory,'');return null;}}); +}); + +test('create can use a native-selected empty root exactly or propose a child from a parent',async()=>{ + let options; + const empty=await browseFolder({purpose:'create',suggestedName:'Study',nativeBridge:{chooseProjectFolder:async()=>'/research/Empty root'},chooseDialog:async value=>{options=value;return value.initialDirectory;}}); + assert.equal(options.initialDirectory,'/research/Empty root'); + assert.equal(empty,'/research/Empty root'); + const child=await browseFolder({purpose:'create',nativeBridge:null,suggestedName:'Study',chooseDialog:async()=>({directory:'/research',name:'Study'})}); + assert.equal(child,'/research/Study'); +}); + +test('invalid folder paths and child names fail before callers can mutate the filesystem',async()=>{ + for(const path of ['relative','~/Study','/folder\0secret',42])assert.throws(()=>absoluteFolderPath(path),/absolute folder/); + for(const name of ['', '.', '..', '../outside','a/b','a\\b','bad\0name'])assert.throws(()=>newFolderPath('/parent',name),/folder name/); + assert.equal(newFolderPath('/','Study'),'/Study'); + await assert.rejects(browseFolder({nativeBridge:{chooseProjectFolder:async()=> 'relative'},chooseDialog:()=>assert.fail()}),/absolute folder/); + await assert.rejects(browseFolder({nativeBridge:{chooseProjectFolder:async()=>{throw Error('Chooser unavailable');}}}),/could not open: Chooser unavailable/); +}); + +test('folder listing uses only a paged GET path, preserves shortcuts and checks pagination metadata',async()=>{ + const reply={directory:'/research/Studies',parent:'/research',folders:[{name:'Study A',path:'/research/Studies/Study A'}],locations:[{name:'Home',path:'/Users/scientist'}],offset:200,limit:200,total:402,has_more:true,next_offset:400,empty:false,truncated:true}; + const paths=[]; + const result=await readFolderListing({directory:'/research/Studies',offset:200,request:async path=>{paths.push(path);return reply;}}); + const query=new URL(paths[0],'http://localhost/api'); + assert.equal(query.pathname,'/folders');assert.equal(query.searchParams.get('directory'),'/research/Studies');assert.equal(query.searchParams.get('offset'),'200');assert.equal(query.searchParams.get('limit'),'200'); + assert.equal(result,reply);assert.equal(result.truncated,true); + await assert.rejects(readFolderListing({request:async()=>({...reply,next_offset:200})}),/next folder page/); + await assert.rejects(readFolderListing({request:async()=>({...reply,empty:'yes'})}),/empty-folder/); +}); From 01a254fce74d5d6c0bb832e15fe08333fc324050 Mon Sep 17 00:00:00 2001 From: arthurh <49833088+maxwellsdm1867@users.noreply.github.com> Date: Tue, 29 Sep 2026 22:34:17 -0700 Subject: [PATCH 4/6] Preserve proposed project folders during browsing Distinguish a missing proposed child from its existing empty parent so Browse preserves the intended folder name. Recover from unfinished path hints without accepting relative selections. Validated 10 folder-client tests, 12 folder API tests, production build and live selection with no filesystem writes. --- docs/dev/NATIVE_E2E_VALIDATION.md | 8 +++++++ ...project-browse-empty-parent-regression.jpg | Bin 0 -> 52030 bytes python/tests/test_workspace_folder_browser.py | 13 +++++++++++ python/workspace_folder_browser.py | 11 +++++---- .../src/components/FolderBrowserDialog.jsx | 4 ++-- workspace-app/src/folderBrowser.js | 8 ++++++- workspace-app/src/folderBrowser.test.js | 21 +++++++++++++++++- 7 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 docs/dev/project-browse-empty-parent-regression.jpg diff --git a/docs/dev/NATIVE_E2E_VALIDATION.md b/docs/dev/NATIVE_E2E_VALIDATION.md index 216f91b..edc5a7c 100644 --- a/docs/dev/NATIVE_E2E_VALIDATION.md +++ b/docs/dev/NATIVE_E2E_VALIDATION.md @@ -316,3 +316,11 @@ the project name and folder value, kept setup open and returned focus to Browse. Main Cancel closed setup and restored focus to its sidebar opener at the same overview URL. Tab/Shift+Tab remained in the nested picker. Choosing a proposed new folder filled the form without creating that folder on disk. + +Final audit regression: a missing proposed child inside an empty parent now stays +a new-folder proposal rather than selecting its parent. The API reports whether +the requested directory exists; the picker preserves the entered child name. A +live check returned the exact proposed child path, while its parent stayed empty +and the child was not created. Unfinished typed paths can still open Browse. +10 focused folder-client tests, 12 folder API tests and the scoped production +build pass. [Empty-parent check](project-browse-empty-parent-regression.jpg). diff --git a/docs/dev/project-browse-empty-parent-regression.jpg b/docs/dev/project-browse-empty-parent-regression.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c6ce33e7ebc8790b803103e25ceb6d5081519f4e GIT binary patch literal 52030 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 z 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Μy{p7m!#hzmMFlH1z-LzWK3OOw( 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 literal 0 HcmV?d00001 diff --git a/python/tests/test_workspace_folder_browser.py b/python/tests/test_workspace_folder_browser.py index aa05b51..fac5b8f 100644 --- a/python/tests/test_workspace_folder_browser.py +++ b/python/tests/test_workspace_folder_browser.py @@ -46,6 +46,7 @@ def test_nonexistent_destination_uses_nearest_parent_without_creating_it(self): self.assertEqual([folder['name'] for folder in result['folders']], ['nested']) self.assertEqual(before, set(self.root.rglob('*'))) self.assertFalse(target.exists()) + self.assertFalse(result['requested_exists']) def test_home_locations_and_root_parent(self): for name in ('Documents', 'Desktop'): @@ -65,6 +66,7 @@ def test_parent_aliases_are_resolved_to_normal_absolute_paths(self): result = browser.list_folder(alias / 'nested/future project') self.assertEqual(result['directory'], str(self.root / 'alpha/nested')) self.assertNotIn('directory alias', result['directory']) + self.assertTrue(browser.list_folder(alias)['requested_exists']) def test_pagination_is_explicit_and_bounded(self): first = browser.list_folder(self.root, limit=2) @@ -91,6 +93,7 @@ def test_empty_counts_all_entries_including_files_and_hidden_names(self): selected = self.root / 'empty folder' selected.mkdir() self.assertTrue(browser.list_folder(selected)['empty']) + self.assertTrue(browser.list_folder(selected)['requested_exists']) for name in ('recording.h5', '.hidden file'): with self.subTest(name=name): file = selected / name @@ -100,6 +103,16 @@ def test_empty_counts_all_entries_including_files_and_hidden_names(self): self.assertFalse(result['empty']) file.unlink() + def test_missing_destination_inside_empty_parent_is_not_an_existing_empty_folder(self): + parent = self.root / 'Empty parent' + parent.mkdir() + result = browser.list_folder(parent / 'New study') + self.assertEqual(result['directory'], str(parent)) + self.assertTrue(result['empty']) + self.assertFalse(result['requested_exists']) + self.assertTrue(browser.list_folder(parent)['requested_exists']) + self.assertFalse((parent / 'New study').exists()) + def test_inaccessible_children_are_omitted_and_selected_folder_reports_error(self): actual_access = os.access with patch.object(browser.os, 'access', side_effect=lambda path, mode: ( diff --git a/python/workspace_folder_browser.py b/python/workspace_folder_browser.py index ddd8ce9..713ca53 100644 --- a/python/workspace_folder_browser.py +++ b/python/workspace_folder_browser.py @@ -20,16 +20,19 @@ def _directory(path): try: # Resolving supports normal macOS aliases such as /var and /tmp. candidate = candidate.resolve() - while not candidate.exists(): + requested_exists = candidate.exists() + exists = requested_exists + while not exists: parent = candidate.parent if parent == candidate: raise ValueError('The folder does not exist.') candidate = parent + exists = candidate.exists() if not candidate.is_dir(): raise ValueError('Choose a folder, not a file.') if not os.access(candidate, os.R_OK | os.X_OK): raise ValueError('Access denied for this folder.') - return candidate + return candidate, requested_exists except PermissionError as error: raise ValueError('Access denied for this folder.') from error except (OSError, RuntimeError) as error: @@ -62,7 +65,7 @@ def list_folder(path=None, *, offset=0, limit=PAGE_LIMIT): """ if type(offset) is not int or offset < 0 or type(limit) is not int or not 1 <= limit <= PAGE_LIMIT: raise ValueError('Use a nonnegative offset and a folder page size from 1 to 200.') - root = _directory(path) + root, requested_exists = _directory(path) folders, truncated, empty = [], False, True try: with os.scandir(root) as entries: @@ -90,7 +93,7 @@ def list_folder(path=None, *, offset=0, limit=PAGE_LIMIT): 'folders': folders[offset:offset + limit], 'locations': _locations(), 'offset': offset, 'limit': limit, 'total': len(folders), 'has_more': has_more, 'next_offset': offset + limit if has_more else None, 'truncated': truncated, - 'empty': empty and not truncated} + 'empty': empty and not truncated, 'requested_exists': requested_exists} def register_folder_browser_routes(app): diff --git a/workspace-app/src/components/FolderBrowserDialog.jsx b/workspace-app/src/components/FolderBrowserDialog.jsx index f7ece1e..89430a8 100644 --- a/workspace-app/src/components/FolderBrowserDialog.jsx +++ b/workspace-app/src/components/FolderBrowserDialog.jsx @@ -2,7 +2,7 @@ import {useEffect,useId,useRef,useState} from 'react'; import {createRoot} from 'react-dom/client'; import {ArrowLeft,ArrowRight,ChevronRight,Folder,FolderOpen,FolderPlus,Home,LoaderCircle,MapPin,Pencil,X} from 'lucide-react'; import {api} from '../api.js'; -import {absoluteFolderPath,folderParentPath,newFolderPath,readFolderListing} from '../folderBrowser.js'; +import {absoluteFolderPath,folderParentPath,newFolderPath,readFolderListing,shouldCreateNewFolder} from '../folderBrowser.js'; import './FolderBrowserDialog.css'; export function openFolderBrowserDialog(options){ @@ -28,7 +28,7 @@ export default function FolderBrowserDialog({purpose='existing',title='Choose a useEffect(()=>{ const controller=new AbortController();setLoading(true);setError(''); readFolderListing({directory,offset,request:(path)=>request(path,{signal:controller.signal})}).then(listing=>{ - if(controller.signal.aborted)return;setData(listing);setLoading(false);if(purpose==='create')setCreateNew(!listing.empty); + if(controller.signal.aborted)return;setData(listing);setLoading(false);if(purpose==='create')setCreateNew(shouldCreateNewFolder(listing)); }).catch(failure=>{if(!controller.signal.aborted){setData(null);setLoading(false);setError(`Cannot browse this folder: ${failure.message}`);}}); return()=>controller.abort(); },[directory,offset,retry,request,purpose]); diff --git a/workspace-app/src/folderBrowser.js b/workspace-app/src/folderBrowser.js index 5faf215..a5a1764 100644 --- a/workspace-app/src/folderBrowser.js +++ b/workspace-app/src/folderBrowser.js @@ -16,6 +16,9 @@ export function newFolderPath(parent,name){ if(typeof name!=='string'||!name.trim()||['.','..'].includes(name.trim())||/[\\/\x00-\x1f]/.test(name)||name.trim().length>255)throw new Error('Use a folder name without slashes, dots alone or control characters.'); return `${directory==='/'?'':directory}/${name.trim()}`; } +export function shouldCreateNewFolder(listing){ + return !listing.empty||listing.requested_exists===false; +} export async function readFolderListing({directory='',offset=0,request}){ if(directory)absoluteFolderPath(directory); if(!Number.isSafeInteger(offset)||offset<0)throw new Error('Folder page is invalid.'); @@ -24,6 +27,7 @@ export async function readFolderListing({directory='',offset=0,request}){ const data=await request(`/folders?${query}`); if(!data||typeof data!=='object'||!Array.isArray(data.folders)||!Array.isArray(data.locations)||typeof data.has_more!=='boolean'||!Number.isSafeInteger(data.offset)||data.offset<0||!Number.isSafeInteger(data.total)||data.total<0)throw new Error('The folder browser returned an incomplete listing.'); if(Object.hasOwn(data,'empty')&&typeof data.empty!=='boolean')throw new Error('The folder browser returned invalid empty-folder information.'); + if(Object.hasOwn(data,'requested_exists')&&typeof data.requested_exists!=='boolean')throw new Error('The folder browser returned invalid requested-folder information.'); if(Object.hasOwn(data,'truncated')&&typeof data.truncated!=='boolean')throw new Error('The folder browser returned invalid listing-limit information.'); absoluteFolderPath(data.directory); if(data.parent!==null)absoluteFolderPath(data.parent); @@ -41,7 +45,9 @@ async function chooseFolderDialog(options){ export async function browseFolder({directory='',purpose='existing',title,suggestedName,parentDirectory, nativeBridge=globalThis.window?.riekeDesktop||null,chooseDialog=chooseFolderDialog,request}={}){ if(!['existing','new','create'].includes(purpose))throw new Error('Choose an existing folder, an empty project folder or a new destination.'); - let initialDirectory=directory?absoluteFolderPath(directory):''; + let initialDirectory=''; + // An unfinished text field is only a navigation hint, not a selection. + if(directory){try{initialDirectory=absoluteFolderPath(directory);}catch{}} const initialName=purpose!=='existing'?(folderBasename(initialDirectory)||suggestedName||'New project'):undefined; if(purpose==='new')initialDirectory=parentDirectory?absoluteFolderPath(parentDirectory):(initialDirectory?folderParentPath(initialDirectory)||'/':''); if(typeof nativeBridge?.chooseProjectFolder==='function'){ diff --git a/workspace-app/src/folderBrowser.test.js b/workspace-app/src/folderBrowser.test.js index 4ed97e0..44a6fa2 100644 --- a/workspace-app/src/folderBrowser.test.js +++ b/workspace-app/src/folderBrowser.test.js @@ -1,6 +1,6 @@ import test from 'node:test'; import assert from 'node:assert/strict'; -import {absoluteFolderPath,browseFolder,newFolderPath,readFolderListing} from './folderBrowser.js'; +import {absoluteFolderPath,browseFolder,newFolderPath,readFolderListing,shouldCreateNewFolder} from './folderBrowser.js'; test('native existing selection returns its exact absolute folder and never invokes browser fallback',async()=>{ let chosen=0; @@ -48,6 +48,24 @@ test('create can use a native-selected empty root exactly or propose a child fro assert.equal(child,'/research/Study'); }); +test('create preserves a missing proposed child when its nearest existing parent is empty',async()=>{ + const existingEmpty={directory:'/research/Empty root',empty:true,requested_exists:true}; + const missingChild={directory:'/research/Empty root',empty:true,requested_exists:false}; + assert.equal(shouldCreateNewFolder(existingEmpty),false); + assert.equal(shouldCreateNewFolder(missingChild),true); + assert.equal(shouldCreateNewFolder({empty:false,requested_exists:true}),true); + const selected=await browseFolder({purpose:'create',directory:'/research/Empty root/NewStudy',nativeBridge:null,chooseDialog:async options=>shouldCreateNewFolder(missingChild)?{directory:missingChild.directory,name:options.initialName}:missingChild.directory}); + assert.equal(selected,'/research/Empty root/NewStudy'); +}); + +test('an unfinished typed path does not block native or browser folder selection',async()=>{ + for(const directory of ['Study','~/Study','/folder\0unfinished']){ + assert.equal(await browseFolder({directory,nativeBridge:{chooseProjectFolder:async()=>'/research/Chosen'},chooseDialog:()=>assert.fail('Native choice must not open fallback')}),'/research/Chosen'); + assert.equal(await browseFolder({directory,purpose:'create',suggestedName:'Study',nativeBridge:null,chooseDialog:async options=>{assert.equal(options.initialDirectory,'');assert.equal(options.initialName,'Study');return {directory:'/research',name:options.initialName};}}),'/research/Study'); + } + await assert.rejects(browseFolder({directory:'unfinished',nativeBridge:null,chooseDialog:async()=> 'relative selection'}),/absolute folder/); +}); + test('invalid folder paths and child names fail before callers can mutate the filesystem',async()=>{ for(const path of ['relative','~/Study','/folder\0secret',42])assert.throws(()=>absoluteFolderPath(path),/absolute folder/); for(const name of ['', '.', '..', '../outside','a/b','a\\b','bad\0name'])assert.throws(()=>newFolderPath('/parent',name),/folder name/); @@ -65,4 +83,5 @@ test('folder listing uses only a paged GET path, preserves shortcuts and checks assert.equal(result,reply);assert.equal(result.truncated,true); await assert.rejects(readFolderListing({request:async()=>({...reply,next_offset:200})}),/next folder page/); await assert.rejects(readFolderListing({request:async()=>({...reply,empty:'yes'})}),/empty-folder/); + await assert.rejects(readFolderListing({request:async()=>({...reply,requested_exists:'yes'})}),/requested-folder/); }); From 0415661c7354cc938ded3486fcb08361297173a7 Mon Sep 17 00:00:00 2001 From: arthurh <49833088+maxwellsdm1867@users.noreply.github.com> Date: Tue, 29 Sep 2026 22:48:13 -0700 Subject: [PATCH 5/6] Make file browsing accessible across the workspace Audit file and folder selection flows, replace the hidden-label H5 chooser with a keyboard-accessible Browse button, and add Open exports folder for the fixed local handoff directory. Validated 255 scoped frontend tests, 18 folder API tests, 10 open-folder tests, production build and live H5 keyboard selection and exports opening. --- docs/dev/NATIVE_E2E_VALIDATION.md | 41 +++++++++ docs/dev/ui-browse-h5-audit.jpg | Bin 0 -> 80478 bytes docs/dev/ui-open-exports-audit.jpg | Bin 0 -> 85414 bytes python/tests/test_workspace_folder_browser.py | 81 ++++++++++++++++++ python/workspace_folder_browser.py | 52 +++++++++-- python/workspace_launcher.py | 2 +- workspace-app/src/App.jsx | 3 +- .../src/components/BrowseFilesButton.jsx | 12 +++ .../src/components/LocalExportFolder.jsx | 13 ++- 9 files changed, 195 insertions(+), 9 deletions(-) create mode 100644 docs/dev/ui-browse-h5-audit.jpg create mode 100644 docs/dev/ui-open-exports-audit.jpg create mode 100644 workspace-app/src/components/BrowseFilesButton.jsx diff --git a/docs/dev/NATIVE_E2E_VALIDATION.md b/docs/dev/NATIVE_E2E_VALIDATION.md index edc5a7c..80af1fd 100644 --- a/docs/dev/NATIVE_E2E_VALIDATION.md +++ b/docs/dev/NATIVE_E2E_VALIDATION.md @@ -324,3 +324,44 @@ live check returned the exact proposed child path, while its parent stayed empty and the child was not created. Unfinished typed paths can still open Browse. 10 focused folder-client tests, 12 folder API tests and the scoped production build pass. [Empty-parent check](project-browse-empty-parent-regression.jpg). + +## Whole UI file and folder audit — 2026-09-29 + +Reviewed the entire component directory and App import/export pages, searching all +inputs, file-picker triggers, editable paths and copy-path actions. + +| Flow | File or folder action | +| --- | --- | +| New project / preferred projects location | Browse folders | +| Open / move / share / receive project | Browse sources and destination folders | +| Recording import | Browse H5 files; multiple selection and drag/drop | +| Tag and saved-query import | Native JSON file picker buttons | +| Selection masks | Native UGM and JSON file picker buttons | +| Exports | Download buttons; Open exports folder for local handoff | +| Project files | In-app categories, folders and breadcrumbs | +| Tag author profile | Author list and name; preferences saved automatically | + +The H5 chooser was a styled label around a hidden input, leaving it outside +keyboard navigation. It now uses a real Browse button with the same file filters, +multiple-file selection, queue behavior and disabled state. Cancel enqueues +nothing; resetting the input allows choosing the same recording again. + +The local exports card previously offered only Copy folder path. Open exports +folder now opens this project's existing exports folder in the system file +manager. Its endpoint accepts an empty body only, verifies a local app request, +and rejects missing folders and symlinks. It cannot choose an arbitrary location. +Copies, exports and original recordings keep their current storage layout. + +A scoped checkout passed 255 frontend tests, 18 folder API tests, 10 existing +open-folder tests and the production build. File-picker controls for tags, queries +and masks already existed. Filename/path search filters and readonly diagnostic +paths do not prompt for a filesystem selection. + +Live browser checks: Tab focused the H5 Browse button and Enter emitted a +multiple-file chooser event. No files were selected and import history remained +empty. Clicking Open exports folder completed without a visible error and +re-enabled the button; success requires the OS opener to exit successfully for +the fixed fixture exports path. The native computer-use service was unavailable +for Finder, so the Finder window itself was not visually inspected. +[H5 Browse](ui-browse-h5-audit.jpg) and +[Open exports folder](ui-open-exports-audit.jpg). diff --git a/docs/dev/ui-browse-h5-audit.jpg b/docs/dev/ui-browse-h5-audit.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee18917c24ae1bc28dcfb946955d1dcc429bed2a GIT binary patch literal 80478 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℞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

}; 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 literal 0 HcmV?d00001 diff --git a/python/tests/test_workspace_folder_browser.py b/python/tests/test_workspace_folder_browser.py index fac5b8f..17c4303 100644 --- a/python/tests/test_workspace_folder_browser.py +++ b/python/tests/test_workspace_folder_browser.py @@ -156,5 +156,86 @@ def test_privacy_boundary_rejects_untrusted_get_before_filesystem_access(self): self.assertEqual(self.client.get('/api/folders', **kwargs).status_code, 403) +class ExportsFolderOpenTests(unittest.TestCase): + def setUp(self): + self.temporary = tempfile.TemporaryDirectory() + self.addCleanup(self.temporary.cleanup) + self.root = Path(self.temporary.name).resolve() + self.exports = self.root / 'exports' + self.exports.mkdir() + self.app = Flask(__name__) + browser.register_folder_browser_routes(self.app, project_dir=self.root) + self.client = self.app.test_client() + self.headers = {'X-Workspace-Request': '1'} + + def test_fixed_exports_folder_opens_with_platform_command_without_reads_or_shell(self): + for platform, executable in (('darwin', 'open'), ('win32', 'explorer'), ('linux', 'xdg-open')): + with self.subTest(platform=platform), patch.object(browser.sys, 'platform', platform), \ + patch.object(browser.subprocess, 'run') as run, \ + patch.object(Path, 'open', side_effect=AssertionError('No file contents')): + result = self.client.post('/api/exports/open-folder', json={}, headers=self.headers) + self.assertEqual(result.status_code, 200) + self.assertEqual(result.get_json(), {'opened': True, 'directory': str(self.exports)}) + run.assert_called_once_with([executable, str(self.exports)], check=True, timeout=10, + stdout=browser.subprocess.DEVNULL, stderr=browser.subprocess.DEVNULL) + + def test_launcher_without_project_cannot_open_an_arbitrary_folder(self): + launcher = Flask('launcher') + browser.register_folder_browser_routes(launcher) + with patch.object(browser.subprocess, 'run') as run: + result = launcher.test_client().post('/api/exports/open-folder', json={}, headers=self.headers) + self.assertEqual(result.status_code, 400) + self.assertIn('Open a project', result.get_json()['error']) + run.assert_not_called() + + def test_missing_file_or_symlink_exports_never_launch_or_create_a_folder(self): + self.exports.rmdir() + with patch.object(browser.subprocess, 'run') as run: + result = self.client.post('/api/exports/open-folder', json={}, headers=self.headers) + self.assertEqual(result.status_code, 400) + self.assertFalse(self.exports.exists()) + self.exports.write_bytes(b'not a folder') + self.assertEqual(self.client.post('/api/exports/open-folder', json={}, headers=self.headers).status_code, 400) + self.exports.unlink() + for target in (self.root, self.root.parent): + with self.subTest(target=target): + self.exports.symlink_to(target, target_is_directory=True) + result = self.client.post('/api/exports/open-folder', json={}, headers=self.headers) + self.assertEqual(result.status_code, 400) + self.assertIn('symbolic link', result.get_json()['error']) + self.exports.unlink() + run.assert_not_called() + + def test_arbitrary_paths_queries_and_malformed_bodies_are_rejected(self): + with patch.object(browser.subprocess, 'run') as run: + for body in (None, [], True, {'directory': '/'}, {'path': str(self.root.parent)}): + with self.subTest(body=body): + result = self.client.post('/api/exports/open-folder', json=body, headers=self.headers) + self.assertEqual(result.status_code, 400) + self.assertEqual(self.client.post('/api/exports/open-folder?directory=/', json={}, headers=self.headers).status_code, 400) + run.assert_not_called() + + def test_file_manager_errors_are_descriptive_and_do_not_modify_storage(self): + for error in (FileNotFoundError('missing opener'), + browser.subprocess.CalledProcessError(1, ['open']), + browser.subprocess.TimeoutExpired(['open'], 10)): + with self.subTest(error=type(error).__name__), patch.object(browser.subprocess, 'run', side_effect=error): + result = self.client.post('/api/exports/open-folder', json={}, headers=self.headers) + self.assertEqual(result.status_code, 400) + self.assertIn('file manager', result.get_json()['error']) + self.assertTrue(self.exports.is_dir()) + self.assertEqual(list(self.exports.iterdir()), []) + + def test_untrusted_requests_fail_before_filesystem_or_process_access(self): + requests = ({'headers': {}}, + {'headers': {**self.headers, 'Origin': 'https://other.example'}}, + {'headers': self.headers, 'base_url': 'http://localhost.evil.example'}, + {'headers': self.headers, 'environ_overrides': {'REMOTE_ADDR': '192.0.2.1'}}) + with patch.object(browser, '_open_exports_folder', side_effect=AssertionError('No filesystem/process access')): + for kwargs in requests: + with self.subTest(kwargs=kwargs): + self.assertEqual(self.client.post('/api/exports/open-folder', json={}, **kwargs).status_code, 403) + + if __name__ == '__main__': unittest.main() diff --git a/python/workspace_folder_browser.py b/python/workspace_folder_browser.py index 713ca53..8f41ca1 100644 --- a/python/workspace_folder_browser.py +++ b/python/workspace_folder_browser.py @@ -3,6 +3,8 @@ import os from pathlib import Path +import subprocess +import sys from urllib.parse import urlsplit PAGE_LIMIT = 200 @@ -96,17 +98,45 @@ def list_folder(path=None, *, offset=0, limit=PAGE_LIMIT): 'empty': empty and not truncated, 'requested_exists': requested_exists} -def register_folder_browser_routes(app): - """Require a deliberate same-origin loopback request even though this is GET.""" +def _open_exports_folder(project_dir): + if project_dir is None: + raise ValueError('Open a project before opening its exports folder.') + try: + root = Path(project_dir).expanduser().resolve(strict=True) + folder = root / 'exports' + if folder.is_symlink(): + raise ValueError('The exports folder must not be a symbolic link.') + resolved = folder.resolve(strict=True) + if not root.is_dir() or not resolved.is_dir() or resolved != folder or not resolved.is_relative_to(root): + raise ValueError('This project exports folder is unavailable or redirects elsewhere.') + except (OSError, RuntimeError) as error: + raise ValueError('This project exports folder is unavailable. No folder was created.') from error + command = ['open', str(resolved)] if sys.platform == 'darwin' else ( + ['explorer', str(resolved)] if sys.platform == 'win32' else ['xdg-open', str(resolved)]) + try: + subprocess.run(command, check=True, timeout=10, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + except (OSError, subprocess.SubprocessError) as error: + raise ValueError('The file manager could not open the exports folder. Check that a file manager is available.') from error + return str(resolved) + + +def register_folder_browser_routes(app, *, project_dir=None): + """Require deliberate same-origin loopback requests for folder operations.""" from flask import jsonify, request - @app.get('/api/folders') - def folder_browser(): + def local_request(): if (request.remote_addr not in {'127.0.0.1', '::1'} or urlsplit(request.host_url).hostname not in {'localhost', '127.0.0.1', '::1'} or request.headers.get('X-Workspace-Request') != '1' or request.headers.get('Origin', request.host_url.rstrip('/')) != request.host_url.rstrip('/')): - return jsonify(error='Folder browsing requires a same-origin local app request.'), 403 + return jsonify(error='Folder operations require a same-origin local app request.'), 403 + + @app.get('/api/folders') + def folder_browser(): + boundary = local_request() + if boundary is not None: + return boundary if (set(request.args) - {'directory', 'offset', 'limit'} or any(len(request.args.getlist(key)) != 1 for key in request.args)): return jsonify(error='Folder browsing accepts one directory, offset and limit only.'), 400 @@ -120,3 +150,15 @@ def folder_browser(): return jsonify(list_folder(request.args.get('directory'), **numbers)) except ValueError as error: return jsonify(error=str(error)), 400 + + @app.post('/api/exports/open-folder') + def open_exports_folder(): + boundary = local_request() + if boundary is not None: + return boundary + if request.args or request.get_json(silent=True) != {}: + return jsonify(error='Opening the exports folder requires an empty object and no query parameters.'), 400 + try: + return jsonify(opened=True, directory=_open_exports_folder(project_dir)) + except ValueError as error: + return jsonify(error=str(error)), 400 diff --git a/python/workspace_launcher.py b/python/workspace_launcher.py index a230737..adb9e97 100644 --- a/python/workspace_launcher.py +++ b/python/workspace_launcher.py @@ -15,7 +15,7 @@ def register_project_routes(app, *, retinanalysis_dir, project_dir=None, root=No from workspace_app_routes import register_app_routes register_app_routes(app) from workspace_folder_browser import register_folder_browser_routes - register_folder_browser_routes(app) + register_folder_browser_routes(app, project_dir=project_dir) current = Path(project_dir).resolve() if project_dir else None root_provider = root if callable(root) else lambda: managed_root(root or current.parent) @app.get('/api/projects') diff --git a/workspace-app/src/App.jsx b/workspace-app/src/App.jsx index d5c7b19..f57f563 100644 --- a/workspace-app/src/App.jsx +++ b/workspace-app/src/App.jsx @@ -1,6 +1,7 @@ import {localProjectUrl} from './projectTransfer.js'; import {tagFilterLabel} from './protocolViewFilter.js'; import H5Inbox from './components/H5Inbox.jsx'; +import BrowseFilesButton from './components/BrowseFilesButton.jsx'; import ProjectClosedNotice from './components/ProjectClosedNotice.jsx'; import AppUpdates from './components/AppUpdates.jsx'; import ProjectFolder from './components/ProjectFolder.jsx'; @@ -94,7 +95,7 @@ function ImportPage({projectId,protocols,sources,onChange,onBack,jobs,suggestion const jobRecords=Array.isArray(jobs.data?.jobs)?jobs.data.jobs:[]; const blocked=queue.active; const error=queue.error; - return

ADD TO MAIN CATALOG

Import H5s

Choose one or more H5 recordings. New imports are copied into this project and verified before parsing.

e.preventDefault()} onDrop={e=>{e.preventDefault();queue.enqueue(e.dataTransfer.files);}}>

Drop Symphony H5 files here

Rieke OS keeps a managed copy for lazy loading. Keep the original until the import confirms that its copy is ready. Identical files are recognized even when renamed.

{queue.busy&&

Importing one file at a time · {queue.remaining} waiting. Keep this app tab open until the queue finishes.

}{error&&
{error}
}{suggestionsError&&
New-data suggestions could not load.
}

Import history

{jobs.connectionError&&jobs.data&&

Connection interrupted. Showing the last confirmed job history; use Refresh jobs to check again.

}
; + return
ADD TO MAIN CATALOG

Import H5s

Choose one or more H5 recordings. New imports are copied into this project and verified before parsing.

e.preventDefault()} onDrop={e=>{e.preventDefault();queue.enqueue(e.dataTransfer.files);}}>

Drop Symphony H5 files here

Rieke OS keeps a managed copy for lazy loading. Keep the original until the import confirms that its copy is ready. Identical files are recognized even when renamed.

queue.enqueue(files)}/>
{queue.busy&&

Importing one file at a time · {queue.remaining} waiting. Keep this app tab open until the queue finishes.

}{error&&
{error}
}{suggestionsError&&
New-data suggestions could not load.
}

Import history

{jobs.connectionError&&jobs.data&&

Connection interrupted. Showing the last confirmed job history; use Refresh jobs to check again.

}
; } function HistoryPage({kind,revision,onReuse}){const [reuseError,setReuseError]=useState(''),[reusing,setReusing]=useState(null);async function reuseExport(exported){const id=exported.dataset_uuid || exported.export_uuid;setReusing(id);setReuseError('');try{const recipe=await api(`/exports/${id}/reuse`);onReuse(recipe);}catch(error){setReuseError(error.message);}finally{setReusing(null);}}const result=useResource(kind==='exports'?'/exports':'/events',revision);return
;} export default function App(){ diff --git a/workspace-app/src/components/BrowseFilesButton.jsx b/workspace-app/src/components/BrowseFilesButton.jsx new file mode 100644 index 0000000..7ae72e7 --- /dev/null +++ b/workspace-app/src/components/BrowseFilesButton.jsx @@ -0,0 +1,12 @@ +import {useRef} from 'react'; +import {FolderOpen} from 'lucide-react'; + +export default function BrowseFilesButton({label='Browse files…',accept,multiple=false,disabled=false,onChoose,className='button'}){ + const input=useRef(null); + function choose(event){ + const files=Array.from(event.target.files||[]); + event.target.value=''; + if(files.length)onChoose?.(files); + } + return <>; +} diff --git a/workspace-app/src/components/LocalExportFolder.jsx b/workspace-app/src/components/LocalExportFolder.jsx index 565bcd2..5fa663f 100644 --- a/workspace-app/src/components/LocalExportFolder.jsx +++ b/workspace-app/src/components/LocalExportFolder.jsx @@ -1,14 +1,23 @@ import {useState} from 'react'; import {FolderOpen,Copy} from 'lucide-react'; +import {api} from '../api.js'; export default function LocalExportFolder({path}){ - const [message,setMessage]=useState(''); + const [message,setMessage]=useState(''),[busy,setBusy]=useState(false),[error,setError]=useState(''); if(!path)return null; async function copy(){try{await navigator.clipboard.writeText(path);setMessage('Folder path copied.');}catch{setMessage('Select and copy the folder path below.');}} + async function open(){ + if(busy)return; + setBusy(true);setError(''); + try{await api('/exports/open-folder',{method:'POST',body:{}});} + catch(error){setError(error.message||'The export folder could not open.');} + finally{setBusy(false);} + } return

Local export folder

Point Wheeler, MATLAB, or another service here once. All this project’s exports stay together.

-
{path}
+
{path}
Tags return through each export’s annotations folder. Refresh metadata checks updated selection masks here. + {error&&

{error}

} {message&&

{message}

}
; } From 9602ab5a4222e9c1c0a98a89ccb3c0061eedb546 Mon Sep 17 00:00:00 2001 From: arthurh <49833088+maxwellsdm1867@users.noreply.github.com> Date: Wed, 30 Sep 2026 09:04:32 -0700 Subject: [PATCH 6/6] Prepare Rieke OS 0.1.3 desktop and indexed workspace release --- .github/workflows/desktop-candidate.yml | 119 + .github/workflows/desktop-promote.yml | 69 + .../workflows/workspace-release-candidate.yml | 36 +- .gitignore | 6 + CHANGELOG.md | 20 + CONTEXT.md | 28 + desktop/.gitignore | 5 + desktop/README.md | 166 + desktop/bootstrap.cjs | 174 + desktop/distribution.cjs | 10 + desktop/distribution.json | 6 + desktop/draft-barrier.cjs | 26 + desktop/draft-store.cjs | 55 + desktop/e2e/backend-failure.e2e.cjs | 41 + desktop/e2e/bootstrap.e2e.cjs | 89 + desktop/e2e/github-updates.e2e.cjs | 79 + desktop/e2e/helpers.cjs | 54 + desktop/e2e/packaged.e2e.cjs | 410 ++ desktop/e2e/testing-upgrade.e2e.cjs | 139 + desktop/e2e/toolbar-preview.cjs | 50 + desktop/entitlements.mac.plist | 5 + desktop/icon.png | Bin 0 -> 1551104 bytes desktop/main.cjs | 222 + desktop/native-license-sources.json | 42 + desktop/package-lock.json | 3659 ++++++++++++++++ desktop/package.json | 104 + desktop/physical-fs.cjs | 5 + desktop/preload.cjs | 27 + desktop/python-runtime.json | 10 + desktop/recovery-install.cjs | 29 + desktop/recovery.css | 1 + desktop/recovery.html | 1 + desktop/recovery.js | 23 + desktop/requirements.lock | 3 + desktop/seal-testing.cjs | 19 + desktop/security.cjs | 34 + desktop/sign-runtime.cjs | 64 + desktop/supervisor.cjs | 178 + desktop/test/testing-updater.test.cjs | 216 + desktop/test/updater.test.cjs | 121 + desktop/testing-install.cjs | 189 + desktop/testing-update-validation.cjs | 127 + desktop/testing-updater.cjs | 250 ++ desktop/tests/bootstrap.test.cjs | 23 + desktop/tests/distribution.test.cjs | 11 + desktop/tests/draft-barrier.test.cjs | 20 + desktop/tests/draft-store.test.cjs | 30 + desktop/tests/e2e/updater-client.cjs | 119 + desktop/tests/physical-fs.test.cjs | 40 + desktop/tests/recovery-ui.test.cjs | 20 + desktop/tests/security.test.cjs | 27 + desktop/tests/sign-runtime.test.cjs | 22 + desktop/tests/supervisor.test.cjs | 92 + desktop/tests/testing-install.test.cjs | 261 ++ desktop/update-recovery.cjs | 66 + desktop/updater-validation.cjs | 146 + desktop/updater.cjs | 148 + docs/DATA_EFFICIENCY_AUDIT.md | 140 + docs/STORAGE_RECOVERY.md | 92 +- docs/WORKSPACE_SHARING_AND_UPDATES.md | 41 +- docs/design/app-icon-geometry-repair.md | 7 + docs/design/app-icon-shadow-cleanup.md | 7 + docs/design/app-icon-top-bar.md | 7 + docs/design/app-icon.md | 13 + docs/design/electron-production-spec.md | 261 ++ docs/design/external-tag-return.md | 75 + docs/design/one-click-installer.md | 337 ++ docs/dev/GITHUB_DESKTOP_UPDATE_PATTERNS.md | 135 + docs/dev/GITHUB_TESTING_RELEASE.md | 45 + docs/dev/INSTALLER_PRIMARY_SOURCE_REVIEW.md | 227 + docs/dev/NATIVE_E2E_VALIDATION.md | 89 +- docs/dev/TAG_SCOPE_AND_PROFILE_AUDIT.md | 62 + .../dev/releases/0.1.3-source-validation.json | 39 + docs/dev/releasing-rieke-os.md | 162 +- .../backend_index_probe.py | 79 + .../backend_source_dispatch_probe.py | 50 + .../benchmark_catalog_identity.py | 69 + .../benchmark_curation_vocabulary.py | 36 + .../benchmark_dense_protocol_state.py | 73 + .../benchmark_epoch_pages.py | 84 + .../benchmark_native_dense_tags.py | 288 ++ .../benchmark_native_tag_sequence.py | 465 ++ ...chmark_native_tag_sequence_post_profile.py | 413 ++ .../benchmark_protocol_state.py | 130 + .../benchmark_scientist_tag_workflow.py | 255 ++ .../benchmark_scientist_tag_workflow_v2.py | 329 ++ .../benchmark_service_scale.py | 135 + .../benchmark_single_tag_write.py | 247 ++ .../benchmark_tag_actions.py | 284 ++ .../benchmark_tag_collation.py | 122 + .../benchmark_tag_sequence.py | 340 ++ .../benchmark_tag_trigger_validation.py | 110 + .../benchmark_trace_integrity.py | 70 + .../catalog_collision_scale_probe.py | 178 + .../catalog_identity_native_probe.py | 196 + .../dense_shared_index_oracle.py | 204 + .../freeze_validation.py | 288 ++ .../frontend-benchmark.mjs | 63 + .../frontend-selection-race.mjs | 22 + .../metadata-field-index.fixed.mjs | 19 + .../metadata_ancestor_physical_oracle.py | 195 + .../mounted_scientist_workflow.mjs | 45 + .../mysql_generation_primitives.py | 147 + .../mysql_inflight_ddl_probe.py | 112 + .../native-tag-sequence-100000.json | 3743 +++++++++++++++++ .../native-tag-sequence-500.json | 3743 +++++++++++++++++ ...g-sequence-pre-autocompletefix-100000.json | 3307 +++++++++++++++ ...-tag-sequence-pre-autocompletefix-500.json | 3307 +++++++++++++++ ...-sequence-pre-autocompletefix-results.json | 632 +++ ...ag-sequence-pre-autocompletefix-results.md | 51 + ...ve-tag-sequence-pre-dictionary-100000.json | 3463 +++++++++++++++ ...ative-tag-sequence-pre-dictionary-500.json | 3463 +++++++++++++++ ...e-tag-sequence-pre-dictionary-results.json | 888 ++++ ...ive-tag-sequence-pre-dictionary-results.md | 65 + .../native-tag-sequence-results.json | 1462 +++++++ .../native-tag-sequence-results.md | 62 + .../native-tag-source-snapshot.json | 564 +++ .../native_generation_authority_probe.py | 283 ++ .../native_recovery_http_fault.py | 85 + .../native_recovery_roundtrip.py | 326 ++ .../run_stress_gates.py | 101 + .../safety_benchmark.py | 65 + .../safety_identity_probes.py | 84 + .../stress_contracts.py | 225 + .../summarize_scientist_tag_workflow.py | 123 + .../summarize_tag_actions.py | 84 + .../tag-sequence-after-100000.json | 3265 ++++++++++++++ .../tag-sequence-after-500.json | 3265 ++++++++++++++ python/recording_workspace.py | 490 ++- python/tests/test_desktop_release.py | 43 + python/tests/test_desktop_runtime_audit.py | 98 + .../tests/test_desktop_runtime_packaging.py | 170 + python/tests/test_desktop_test_release.py | 32 + python/tests/test_recording_workspace.py | 85 + .../test_workspace_annotation_density.py | 91 + .../test_workspace_annotation_preparation.py | 130 + python/tests/test_workspace_annotations.py | 64 +- python/tests/test_workspace_app_routes.py | 44 + .../test_workspace_backend_responsiveness.py | 294 ++ .../tests/test_workspace_backup_scheduler.py | 65 + .../tests/test_workspace_cache_lifecycle.py | 171 + .../tests/test_workspace_cache_publication.py | 118 + .../tests/test_workspace_catalog_collision.py | 180 + .../tests/test_workspace_catalog_identity.py | 203 + .../test_workspace_concurrent_requests.py | 92 + python/tests/test_workspace_curation_batch.py | 138 + python/tests/test_workspace_desktop.py | 342 ++ python/tests/test_workspace_desktop_paths.py | 42 + python/tests/test_workspace_disk_index.py | 41 +- .../tests/test_workspace_disk_index_crash.py | 84 + python/tests/test_workspace_empty_blocks.py | 49 + .../test_workspace_epoch_page_performance.py | 182 + python/tests/test_workspace_event_paging.py | 39 + python/tests/test_workspace_export_paths.py | 54 + .../test_workspace_generation_portability.py | 83 + .../test_workspace_identity_conflicts.py | 77 + .../tests/test_workspace_import_identities.py | 75 +- .../test_workspace_import_worker_lease.py | 98 + python/tests/test_workspace_installation.py | 19 + ...test_workspace_metadata_object_contract.py | 193 + .../tests/test_workspace_metadata_objects.py | 105 + python/tests/test_workspace_migration.py | 69 + python/tests/test_workspace_native_crash.py | 91 + .../tests/test_workspace_native_tag_filter.py | 62 + .../test_workspace_native_tag_integration.py | 353 ++ .../tests/test_workspace_native_tag_lookup.py | 143 + python/tests/test_workspace_path_api.py | 76 + python/tests/test_workspace_portability.py | 31 +- .../tests/test_workspace_project_servers.py | 5 + .../test_workspace_projection_objects.py | 151 + python/tests/test_workspace_protocol_state.py | 681 +++ .../test_workspace_recovery_generation.py | 182 + python/tests/test_workspace_recovery_store.py | 358 ++ python/tests/test_workspace_refresh_cache.py | 62 +- .../tests/test_workspace_root_boundaries.py | 96 + python/tests/test_workspace_service.py | 21 +- ...workspace_shared_tag_cache_dependencies.py | 106 + .../tests/test_workspace_shared_tag_index.py | 271 ++ .../test_workspace_shared_tag_threads.py | 79 + .../tests/test_workspace_shared_vocabulary.py | 117 + .../tests/test_workspace_source_identity.py | 304 ++ .../tests/test_workspace_state_generation.py | 289 ++ python/tests/test_workspace_updates.py | 91 + python/workspace_annotation_checkpoint.py | 199 + python/workspace_annotation_preparation.py | 185 + python/workspace_annotations.py | 149 +- python/workspace_api.py | 464 +- python/workspace_app_routes.py | 73 +- python/workspace_backup_scheduler.py | 83 + python/workspace_bootstrap.py | 89 +- python/workspace_cache_lifecycle.py | 220 + python/workspace_candidate_exports.py | 4 +- python/workspace_catalog_collision.py | 132 + python/workspace_catalog_identity.py | 174 + python/workspace_curation.py | 54 +- python/workspace_curation_vocabulary.py | 159 + python/workspace_desktop.py | 760 ++++ python/workspace_desktop_paths.py | 23 + python/workspace_disk_index.py | 148 +- python/workspace_explorer.py | 10 +- python/workspace_export_folder.py | 2 + python/workspace_import_progress.py | 9 +- python/workspace_installation.py | 31 +- python/workspace_launcher.py | 8 +- python/workspace_metadata_objects.py | 216 + python/workspace_migration.py | 258 ++ python/workspace_mysql_runtime.py | 14 + python/workspace_native_tag_filter.py | 122 + python/workspace_native_tag_lookup.py | 399 ++ python/workspace_paths.py | 21 + python/workspace_portability.py | 68 +- python/workspace_project_servers.py | 3 + python/workspace_project_validation.py | 6 + python/workspace_projection_cache.py | 228 +- python/workspace_projects.py | 19 +- python/workspace_protocol_state.py | 472 +++ python/workspace_recovery_generation.py | 421 ++ python/workspace_recovery_store.py | 543 +++ python/workspace_service.py | 247 +- python/workspace_shared_tag_index.py | 577 +++ python/workspace_shared_vocabulary.py | 122 + python/workspace_state_generation.py | 479 +++ python/workspace_state_snapshot.py | 224 +- python/workspace_tag_predicates.py | 8 +- python/workspace_tree_pages.py | 110 + python/workspace_updates.py | 60 +- rieke-release.json | 8 +- tools/desktop_artifact_e2e.py | 401 ++ tools/desktop_backend_smoke.py | 278 ++ tools/desktop_build_runtime.py | 434 ++ tools/desktop_no_docker_smoke.py | 156 + tools/desktop_release.py | 200 + tools/desktop_runtime_audit.py | 172 + tools/desktop_runtime_manifest.py | 130 + tools/desktop_runtime_smoke.py | 58 + tools/desktop_scientific_e2e.py | 714 ++++ tools/desktop_startup_failures.py | 83 + tools/desktop_test_release.py | 53 + workspace-app/README.md | 10 +- workspace-app/package-lock.json | 51 +- workspace-app/package.json | 5 +- workspace-app/src/App.jsx | 52 +- .../src/annotationReceiptWorkflow.test.js | 130 + workspace-app/src/annotationReceipts.js | 57 + workspace-app/src/api.js | 7 +- workspace-app/src/appUpdates.js | 16 +- workspace-app/src/appUpdates.test.js | 29 +- workspace-app/src/appUpdatesLifecycle.test.js | 97 + .../src/components/AnnotationTags.jsx | 65 +- workspace-app/src/components/AppUpdates.css | 6 +- workspace-app/src/components/AppUpdates.jsx | 52 +- .../src/components/DesktopDraftRecovery.jsx | 18 + .../src/components/FolderPathInput.jsx | 2 +- .../src/components/InspectionCellTree.jsx | 69 +- workspace-app/src/components/Inspector.jsx | 118 +- .../src/components/MetadataExplorer.jsx | 24 +- workspace-app/src/components/PagedTree.jsx | 40 +- workspace-app/src/components/ProjectFiles.css | 1 + workspace-app/src/components/ProjectFiles.jsx | 8 +- .../src/components/ProjectFolder.jsx | 29 +- .../src/components/ProjectOnboarding.css | 2 +- .../src/components/ProjectOnboarding.jsx | 2 +- .../src/components/metadataValues.js | 30 +- workspace-app/src/curationSelection.js | 27 + workspace-app/src/curationSelection.test.js | 52 + workspace-app/src/desktopDraftSession.js | 44 + workspace-app/src/desktopDraftSession.test.js | 34 + workspace-app/src/desktopLifecycle.js | 20 + workspace-app/src/desktopLifecycle.test.js | 19 + workspace-app/src/epochBrowserSource.js | 12 + workspace-app/src/epochBrowserSource.test.js | 10 +- workspace-app/src/epochSelection.js | 4 +- workspace-app/src/epochSelection.test.js | 16 +- .../src/folderPathInputLifecycle.test.js | 27 + workspace-app/src/inspectionCellTree.js | 21 + workspace-app/src/inspectionCellTree.test.js | 25 + .../src/inspectionTreeLifecycle.test.js | 96 + .../src/inspectorCurationLifecycle.test.js | 89 + workspace-app/src/main.jsx | 2 + workspace-app/src/metadataValues.test.js | 26 + workspace-app/src/pagedTreeLifecycle.test.js | 72 + workspace-app/src/projectTransfer.js | 11 +- workspace-app/src/projectTransfer.test.js | 23 + workspace-app/src/recordingIdentity.js | 3 +- workspace-app/src/resourceCache.js | 11 +- workspace-app/src/styles.css | 13 + .../src/test-support/inspectionTreeHarness.js | 54 + .../src/test-support/inspectorHarness.js | 39 + .../src/test-support/pagedTreeHarness.js | 68 + .../src/test-support/workflowHarness.js | 141 + workspace-app/src/useAnnotationReceipts.js | 29 + workspace-app/src/useDesktopDraft.js | 18 + workspace-app/src/useProjectPreference.js | 4 +- workspace-app/src/useWorkspaceChanges.js | 23 + workspace-app/src/useWorkspaceNavigation.js | 9 +- .../src/workflowResponsiveness.test.js | 236 ++ 296 files changed, 66818 insertions(+), 668 deletions(-) create mode 100644 .github/workflows/desktop-candidate.yml create mode 100644 .github/workflows/desktop-promote.yml create mode 100644 desktop/.gitignore create mode 100644 desktop/README.md create mode 100644 desktop/bootstrap.cjs create mode 100644 desktop/distribution.cjs create mode 100644 desktop/distribution.json create mode 100644 desktop/draft-barrier.cjs create mode 100644 desktop/draft-store.cjs create mode 100644 desktop/e2e/backend-failure.e2e.cjs create mode 100644 desktop/e2e/bootstrap.e2e.cjs create mode 100644 desktop/e2e/github-updates.e2e.cjs create mode 100644 desktop/e2e/helpers.cjs create mode 100644 desktop/e2e/packaged.e2e.cjs create mode 100644 desktop/e2e/testing-upgrade.e2e.cjs create mode 100644 desktop/e2e/toolbar-preview.cjs create mode 100644 desktop/entitlements.mac.plist create mode 100644 desktop/icon.png create mode 100644 desktop/main.cjs create mode 100644 desktop/native-license-sources.json create mode 100644 desktop/package-lock.json create mode 100644 desktop/package.json create mode 100644 desktop/physical-fs.cjs create mode 100644 desktop/preload.cjs create mode 100644 desktop/python-runtime.json create mode 100644 desktop/recovery-install.cjs create mode 100644 desktop/recovery.css create mode 100644 desktop/recovery.html create mode 100644 desktop/recovery.js create mode 100644 desktop/requirements.lock create mode 100644 desktop/seal-testing.cjs create mode 100644 desktop/security.cjs create mode 100644 desktop/sign-runtime.cjs create mode 100644 desktop/supervisor.cjs create mode 100644 desktop/test/testing-updater.test.cjs create mode 100644 desktop/test/updater.test.cjs create mode 100644 desktop/testing-install.cjs create mode 100644 desktop/testing-update-validation.cjs create mode 100644 desktop/testing-updater.cjs create mode 100644 desktop/tests/bootstrap.test.cjs create mode 100644 desktop/tests/distribution.test.cjs create mode 100644 desktop/tests/draft-barrier.test.cjs create mode 100644 desktop/tests/draft-store.test.cjs create mode 100644 desktop/tests/e2e/updater-client.cjs create mode 100644 desktop/tests/physical-fs.test.cjs create mode 100644 desktop/tests/recovery-ui.test.cjs create mode 100644 desktop/tests/security.test.cjs create mode 100644 desktop/tests/sign-runtime.test.cjs create mode 100644 desktop/tests/supervisor.test.cjs create mode 100644 desktop/tests/testing-install.test.cjs create mode 100644 desktop/update-recovery.cjs create mode 100644 desktop/updater-validation.cjs create mode 100644 desktop/updater.cjs create mode 100644 docs/DATA_EFFICIENCY_AUDIT.md create mode 100644 docs/design/app-icon-geometry-repair.md create mode 100644 docs/design/app-icon-shadow-cleanup.md create mode 100644 docs/design/app-icon-top-bar.md create mode 100644 docs/design/app-icon.md create mode 100644 docs/design/electron-production-spec.md create mode 100644 docs/design/external-tag-return.md create mode 100644 docs/design/one-click-installer.md create mode 100644 docs/dev/GITHUB_DESKTOP_UPDATE_PATTERNS.md create mode 100644 docs/dev/GITHUB_TESTING_RELEASE.md create mode 100644 docs/dev/INSTALLER_PRIMARY_SOURCE_REVIEW.md create mode 100644 docs/dev/TAG_SCOPE_AND_PROFILE_AUDIT.md create mode 100644 docs/dev/releases/0.1.3-source-validation.json create mode 100644 docs/dev/scale-audit-2026-09-29/backend_index_probe.py create mode 100644 docs/dev/scale-audit-2026-09-29/backend_source_dispatch_probe.py create mode 100644 docs/dev/scale-audit-2026-09-29/benchmark_catalog_identity.py create mode 100644 docs/dev/scale-audit-2026-09-29/benchmark_curation_vocabulary.py create mode 100644 docs/dev/scale-audit-2026-09-29/benchmark_dense_protocol_state.py create mode 100644 docs/dev/scale-audit-2026-09-29/benchmark_epoch_pages.py create mode 100644 docs/dev/scale-audit-2026-09-29/benchmark_native_dense_tags.py create mode 100644 docs/dev/scale-audit-2026-09-29/benchmark_native_tag_sequence.py create mode 100644 docs/dev/scale-audit-2026-09-29/benchmark_native_tag_sequence_post_profile.py create mode 100644 docs/dev/scale-audit-2026-09-29/benchmark_protocol_state.py create mode 100644 docs/dev/scale-audit-2026-09-29/benchmark_scientist_tag_workflow.py create mode 100644 docs/dev/scale-audit-2026-09-29/benchmark_scientist_tag_workflow_v2.py create mode 100644 docs/dev/scale-audit-2026-09-29/benchmark_service_scale.py create mode 100644 docs/dev/scale-audit-2026-09-29/benchmark_single_tag_write.py create mode 100644 docs/dev/scale-audit-2026-09-29/benchmark_tag_actions.py create mode 100644 docs/dev/scale-audit-2026-09-29/benchmark_tag_collation.py create mode 100644 docs/dev/scale-audit-2026-09-29/benchmark_tag_sequence.py create mode 100644 docs/dev/scale-audit-2026-09-29/benchmark_tag_trigger_validation.py create mode 100644 docs/dev/scale-audit-2026-09-29/benchmark_trace_integrity.py create mode 100644 docs/dev/scale-audit-2026-09-29/catalog_collision_scale_probe.py create mode 100644 docs/dev/scale-audit-2026-09-29/catalog_identity_native_probe.py create mode 100644 docs/dev/scale-audit-2026-09-29/dense_shared_index_oracle.py create mode 100644 docs/dev/scale-audit-2026-09-29/freeze_validation.py create mode 100644 docs/dev/scale-audit-2026-09-29/frontend-benchmark.mjs create mode 100644 docs/dev/scale-audit-2026-09-29/frontend-selection-race.mjs create mode 100644 docs/dev/scale-audit-2026-09-29/metadata-field-index.fixed.mjs create mode 100644 docs/dev/scale-audit-2026-09-29/metadata_ancestor_physical_oracle.py create mode 100644 docs/dev/scale-audit-2026-09-29/mounted_scientist_workflow.mjs create mode 100644 docs/dev/scale-audit-2026-09-29/mysql_generation_primitives.py create mode 100644 docs/dev/scale-audit-2026-09-29/mysql_inflight_ddl_probe.py create mode 100644 docs/dev/scale-audit-2026-09-29/native-tag-sequence-100000.json create mode 100644 docs/dev/scale-audit-2026-09-29/native-tag-sequence-500.json create mode 100644 docs/dev/scale-audit-2026-09-29/native-tag-sequence-pre-autocompletefix-100000.json create mode 100644 docs/dev/scale-audit-2026-09-29/native-tag-sequence-pre-autocompletefix-500.json create mode 100644 docs/dev/scale-audit-2026-09-29/native-tag-sequence-pre-autocompletefix-results.json create mode 100644 docs/dev/scale-audit-2026-09-29/native-tag-sequence-pre-autocompletefix-results.md create mode 100644 docs/dev/scale-audit-2026-09-29/native-tag-sequence-pre-dictionary-100000.json create mode 100644 docs/dev/scale-audit-2026-09-29/native-tag-sequence-pre-dictionary-500.json create mode 100644 docs/dev/scale-audit-2026-09-29/native-tag-sequence-pre-dictionary-results.json create mode 100644 docs/dev/scale-audit-2026-09-29/native-tag-sequence-pre-dictionary-results.md create mode 100644 docs/dev/scale-audit-2026-09-29/native-tag-sequence-results.json create mode 100644 docs/dev/scale-audit-2026-09-29/native-tag-sequence-results.md create mode 100644 docs/dev/scale-audit-2026-09-29/native-tag-source-snapshot.json create mode 100644 docs/dev/scale-audit-2026-09-29/native_generation_authority_probe.py create mode 100644 docs/dev/scale-audit-2026-09-29/native_recovery_http_fault.py create mode 100644 docs/dev/scale-audit-2026-09-29/native_recovery_roundtrip.py create mode 100644 docs/dev/scale-audit-2026-09-29/run_stress_gates.py create mode 100644 docs/dev/scale-audit-2026-09-29/safety_benchmark.py create mode 100644 docs/dev/scale-audit-2026-09-29/safety_identity_probes.py create mode 100644 docs/dev/scale-audit-2026-09-29/stress_contracts.py create mode 100644 docs/dev/scale-audit-2026-09-29/summarize_scientist_tag_workflow.py create mode 100644 docs/dev/scale-audit-2026-09-29/summarize_tag_actions.py create mode 100644 docs/dev/scale-audit-2026-09-29/tag-sequence-after-100000.json create mode 100644 docs/dev/scale-audit-2026-09-29/tag-sequence-after-500.json create mode 100644 python/tests/test_desktop_release.py create mode 100644 python/tests/test_desktop_runtime_audit.py create mode 100644 python/tests/test_desktop_runtime_packaging.py create mode 100644 python/tests/test_desktop_test_release.py create mode 100644 python/tests/test_workspace_annotation_density.py create mode 100644 python/tests/test_workspace_annotation_preparation.py create mode 100644 python/tests/test_workspace_backend_responsiveness.py create mode 100644 python/tests/test_workspace_backup_scheduler.py create mode 100644 python/tests/test_workspace_cache_lifecycle.py create mode 100644 python/tests/test_workspace_cache_publication.py create mode 100644 python/tests/test_workspace_catalog_collision.py create mode 100644 python/tests/test_workspace_catalog_identity.py create mode 100644 python/tests/test_workspace_concurrent_requests.py create mode 100644 python/tests/test_workspace_curation_batch.py create mode 100644 python/tests/test_workspace_desktop.py create mode 100644 python/tests/test_workspace_desktop_paths.py create mode 100644 python/tests/test_workspace_disk_index_crash.py create mode 100644 python/tests/test_workspace_empty_blocks.py create mode 100644 python/tests/test_workspace_epoch_page_performance.py create mode 100644 python/tests/test_workspace_event_paging.py create mode 100644 python/tests/test_workspace_export_paths.py create mode 100644 python/tests/test_workspace_generation_portability.py create mode 100644 python/tests/test_workspace_identity_conflicts.py create mode 100644 python/tests/test_workspace_import_worker_lease.py create mode 100644 python/tests/test_workspace_metadata_object_contract.py create mode 100644 python/tests/test_workspace_metadata_objects.py create mode 100644 python/tests/test_workspace_migration.py create mode 100644 python/tests/test_workspace_native_crash.py create mode 100644 python/tests/test_workspace_native_tag_filter.py create mode 100644 python/tests/test_workspace_native_tag_integration.py create mode 100644 python/tests/test_workspace_native_tag_lookup.py create mode 100644 python/tests/test_workspace_path_api.py create mode 100644 python/tests/test_workspace_projection_objects.py create mode 100644 python/tests/test_workspace_protocol_state.py create mode 100644 python/tests/test_workspace_recovery_generation.py create mode 100644 python/tests/test_workspace_recovery_store.py create mode 100644 python/tests/test_workspace_root_boundaries.py create mode 100644 python/tests/test_workspace_shared_tag_cache_dependencies.py create mode 100644 python/tests/test_workspace_shared_tag_index.py create mode 100644 python/tests/test_workspace_shared_tag_threads.py create mode 100644 python/tests/test_workspace_shared_vocabulary.py create mode 100644 python/tests/test_workspace_source_identity.py create mode 100644 python/tests/test_workspace_state_generation.py create mode 100644 python/workspace_annotation_checkpoint.py create mode 100644 python/workspace_annotation_preparation.py create mode 100644 python/workspace_backup_scheduler.py create mode 100644 python/workspace_cache_lifecycle.py create mode 100644 python/workspace_catalog_collision.py create mode 100644 python/workspace_catalog_identity.py create mode 100644 python/workspace_curation_vocabulary.py create mode 100644 python/workspace_desktop.py create mode 100644 python/workspace_desktop_paths.py create mode 100644 python/workspace_metadata_objects.py create mode 100644 python/workspace_migration.py create mode 100644 python/workspace_native_tag_filter.py create mode 100644 python/workspace_native_tag_lookup.py create mode 100644 python/workspace_paths.py create mode 100644 python/workspace_protocol_state.py create mode 100644 python/workspace_recovery_generation.py create mode 100644 python/workspace_recovery_store.py create mode 100644 python/workspace_shared_tag_index.py create mode 100644 python/workspace_shared_vocabulary.py create mode 100644 python/workspace_state_generation.py create mode 100644 tools/desktop_artifact_e2e.py create mode 100644 tools/desktop_backend_smoke.py create mode 100644 tools/desktop_build_runtime.py create mode 100644 tools/desktop_no_docker_smoke.py create mode 100644 tools/desktop_release.py create mode 100644 tools/desktop_runtime_audit.py create mode 100644 tools/desktop_runtime_manifest.py create mode 100644 tools/desktop_runtime_smoke.py create mode 100644 tools/desktop_scientific_e2e.py create mode 100644 tools/desktop_startup_failures.py create mode 100644 tools/desktop_test_release.py create mode 100644 workspace-app/src/annotationReceiptWorkflow.test.js create mode 100644 workspace-app/src/annotationReceipts.js create mode 100644 workspace-app/src/appUpdatesLifecycle.test.js create mode 100644 workspace-app/src/components/DesktopDraftRecovery.jsx create mode 100644 workspace-app/src/curationSelection.js create mode 100644 workspace-app/src/curationSelection.test.js create mode 100644 workspace-app/src/desktopDraftSession.js create mode 100644 workspace-app/src/desktopDraftSession.test.js create mode 100644 workspace-app/src/desktopLifecycle.js create mode 100644 workspace-app/src/desktopLifecycle.test.js create mode 100644 workspace-app/src/folderPathInputLifecycle.test.js create mode 100644 workspace-app/src/inspectionTreeLifecycle.test.js create mode 100644 workspace-app/src/inspectorCurationLifecycle.test.js create mode 100644 workspace-app/src/pagedTreeLifecycle.test.js create mode 100644 workspace-app/src/test-support/inspectionTreeHarness.js create mode 100644 workspace-app/src/test-support/inspectorHarness.js create mode 100644 workspace-app/src/test-support/pagedTreeHarness.js create mode 100644 workspace-app/src/test-support/workflowHarness.js create mode 100644 workspace-app/src/useAnnotationReceipts.js create mode 100644 workspace-app/src/useDesktopDraft.js create mode 100644 workspace-app/src/useWorkspaceChanges.js create mode 100644 workspace-app/src/workflowResponsiveness.test.js diff --git a/.github/workflows/desktop-candidate.yml b/.github/workflows/desktop-candidate.yml new file mode 100644 index 0000000..eb51930 --- /dev/null +++ b/.github/workflows/desktop-candidate.yml @@ -0,0 +1,119 @@ +name: Rieke OS desktop candidate +on: + push: + tags: ['v*'] + workflow_dispatch: + inputs: + tag: + description: Exact reviewed version tag in Rieke-OS + required: true + signed: + description: Require Developer ID signing and notarization + type: boolean + default: false +permissions: + contents: read +concurrency: + group: rieke-desktop-candidate-${{ inputs.tag || github.ref_name }} + cancel-in-progress: false +jobs: + build: + if: github.repository == 'maxwellsdm1867/Rieke-OS' + runs-on: macos-15 + environment: ${{ (github.event_name == 'push' || inputs.signed) && 'desktop-signing' || 'desktop-build' }} + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.tag || github.ref }} + fetch-depth: 0 + - uses: actions/setup-node@v4 + with: + node-version: '22.12.0' + - uses: astral-sh/setup-uv@v6 + - name: Verify clean canonical source and coordinated versions + env: + RELEASE_TAG: ${{ inputs.tag || github.ref_name }} + RELEASE_REPOSITORY: ${{ github.repository }} + run: | + test "$(uname -m)" = arm64 + python3 tools/desktop_release.py baseline --tag "$RELEASE_TAG" --repository "$RELEASE_REPOSITORY" --output "$RUNNER_TEMP/desktop-baseline.json" + - run: npm ci && npm test && npm run build + working-directory: workspace-app + - run: npm ci && npm test + working-directory: desktop + - name: Assemble the complete portable runtime + run: python3 tools/desktop_build_runtime.py --skip-frontend + - name: Verify backend and runtime contracts + run: | + desktop/build/runtime/python/bin/python3.11 -m unittest discover -s python/tests -p 'test_*desktop*.py' -v + desktop/build/runtime/python/bin/python3.11 -m unittest discover -s python/tests -p test_workspace_bootstrap.py -v + python3 tools/desktop_runtime_manifest.py + env: + PYTHONPATH: python + PYTHONDONTWRITEBYTECODE: '1' + - name: Build unsigned local qualification candidate + if: github.event_name != 'push' && !inputs.signed + working-directory: desktop + env: + CSC_IDENTITY_AUTO_DISCOVERY: 'false' + run: npm run dist + - name: Build signed and notarized candidate + if: github.event_name == 'push' || inputs.signed + working-directory: desktop + env: + CSC_LINK: ${{ secrets.CSC_LINK }} + CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }} + APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }} + APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }} + APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }} + CSC_IDENTITY_AUTO_DISCOVERY: 'false' + run: | + node -e "if(require('./distribution.json').channel!=='signed')throw new Error('Commit the reviewed signed distribution policy before building a signed release')" + test -n "$CSC_LINK" + test -n "$CSC_KEY_PASSWORD" + test -n "$APPLE_API_KEY" + test -n "$APPLE_API_KEY_ID" + test -n "$APPLE_API_ISSUER" + npm run dist + codesign --verify --deep --strict 'dist/mac-arm64/Rieke OS.app' + spctl --assess --type execute 'dist/mac-arm64/Rieke OS.app' + xcrun stapler validate 'dist/mac-arm64/Rieke OS.app' + - name: Exercise updater transport failures without installing + run: npm run test:e2e:updater --prefix desktop + - name: Exercise the actual packaged desktop UI and orderly lifecycle + run: npm run test:e2e --prefix desktop + - name: Exercise explicit unsigned Install and Open + if: github.event_name != 'push' && !inputs.signed + run: npm run test:e2e:bootstrap --prefix desktop + - name: Verify recovery before opening projects when backend startup fails + run: npm run test:e2e:startup-failure --prefix desktop + - name: Audit extracted installers and native database workflows + run: python3 tools/desktop_artifact_e2e.py --installed 'desktop/dist/mac-arm64/Rieke OS.app' --output docs/dev/desktop-artifact-e2e.json + - name: Inventory exact candidate bytes + run: | + python3 tools/desktop_release.py inventory --output desktop/dist/artifacts.json + cp "$RUNNER_TEMP/desktop-baseline.json" desktop/dist/desktop-baseline.json + cp desktop/build/runtime/runtime-audit.json desktop/dist/runtime-audit.json + - uses: actions/upload-artifact@v4 + if: always() + with: + name: desktop-e2e-evidence + path: | + docs/dev/desktop-updater-client-e2e.json + docs/dev/desktop-ui-e2e/ + docs/dev/desktop-artifact-e2e.json + if-no-files-found: warn + retention-days: 30 + - uses: actions/upload-artifact@v4 + with: + name: rieke-desktop-macos-arm64 + path: | + desktop/dist/*.dmg + desktop/dist/*.zip + desktop/dist/*.blockmap + desktop/dist/latest-mac.yml + desktop/dist/artifacts.json + desktop/dist/desktop-baseline.json + desktop/dist/runtime-audit.json + if-no-files-found: error + retention-days: 30 diff --git a/.github/workflows/desktop-promote.yml b/.github/workflows/desktop-promote.yml new file mode 100644 index 0000000..c53b72f --- /dev/null +++ b/.github/workflows/desktop-promote.yml @@ -0,0 +1,69 @@ +name: Promote qualified Rieke OS desktop +on: + workflow_dispatch: + inputs: + tag: + description: Reviewed stable tag + required: true + candidate_run_id: + description: Successful desktop-candidate run containing the exact qualified artifacts + required: true + evidence_path: + description: Reviewed qualification JSON committed to the default branch + required: true +permissions: + contents: read + actions: read +concurrency: + # All stable versions share a lock; an older build cannot race a newer promotion. + group: rieke-desktop-stable-promotion + cancel-in-progress: false +jobs: + promote: + if: github.repository == 'maxwellsdm1867/Rieke-OS' + runs-on: macos-15 + # Repository owners must enable required reviewers here. YAML alone does not. + environment: desktop-publishing + permissions: + contents: write + actions: read + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '22.12.0' + - run: npm ci --ignore-scripts + working-directory: desktop + - name: Require a successful canonical candidate run + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + CANDIDATE_RUN: ${{ inputs.candidate_run_id }} + run: | + python3 - <<'PY' + import json, os, re, subprocess + run_id = os.environ['CANDIDATE_RUN'] + if not re.fullmatch(r'\d+', run_id): raise SystemExit('Invalid candidate run ID') + receipt = json.loads(subprocess.check_output(['gh','api',f'repos/maxwellsdm1867/Rieke-OS/actions/runs/{run_id}'],text=True)) + if receipt['conclusion'] != 'success' or receipt['path'] != '.github/workflows/desktop-candidate.yml': + raise SystemExit('Candidate must be a successful desktop build') + PY + - uses: actions/download-artifact@v4 + with: + name: rieke-desktop-macos-arm64 + run-id: ${{ inputs.candidate_run_id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + path: desktop/dist + - name: Verify reviewed evidence, recover draft uploads, and promote exact bytes + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + RELEASE_TAG: ${{ inputs.tag }} + EVIDENCE_PATH: ${{ inputs.evidence_path }} + run: | + python3 - <<'PY' + import os, pathlib, subprocess + root = pathlib.Path.cwd().resolve() + evidence = (root / os.environ['EVIDENCE_PATH']).resolve(strict=True) + if not evidence.is_relative_to(root / 'release-evidence') or evidence.suffix != '.json': + raise SystemExit('Evidence must be a reviewed release-evidence JSON in this checkout') + subprocess.run(['python3','tools/desktop_release.py','promote','--tag',os.environ['RELEASE_TAG'],'--evidence',str(evidence)],check=True) + PY diff --git a/.github/workflows/workspace-release-candidate.yml b/.github/workflows/workspace-release-candidate.yml index 1bda0ea..f9d8f9d 100644 --- a/.github/workflows/workspace-release-candidate.yml +++ b/.github/workflows/workspace-release-candidate.yml @@ -1,12 +1,19 @@ -name: Build signed Rieke OS release candidate +name: Legacy source-release candidate (manual) on: workflow_dispatch: inputs: tag: description: Reviewed stable version tag, for example v0.1.0 required: true + publish: + description: Publish the validated candidate as the latest stable GitHub Release + type: boolean + default: false permissions: contents: read +concurrency: + group: rieke-release-${{ inputs.tag || github.ref_name }} + cancel-in-progress: false jobs: candidate: # First advertised platform only. Linux needs its own native validation. @@ -15,7 +22,7 @@ jobs: steps: - uses: actions/checkout@v4 with: - ref: ${{ inputs.tag }} + ref: ${{ inputs.tag || github.ref }} fetch-depth: 0 - uses: actions/setup-node@v4 with: @@ -58,5 +65,26 @@ jobs: name: signed-rieke-release-candidate path: ${{ runner.temp }}/rieke-candidate/ if-no-files-found: error - # Deliberately no public release publication. Promotion requires the real - # database, transfer, old-to-new upgrade and licensed MATLAB gates in docs. + publish: + needs: candidate + if: github.repository == 'maxwellsdm1867/Rieke-OS' && (github.event_name == 'push' || inputs.publish) + runs-on: ubuntu-latest + # Configure required reviewers here to attest the real upgrade/recovery and + # worker-shutdown evidence in docs/dev/releasing-rieke-os.md before promotion. + environment: release-publishing + permissions: + contents: write + steps: + - uses: actions/download-artifact@v4 + with: + name: signed-rieke-release-candidate + path: ${{ runner.temp }}/rieke-candidate + - name: Publish the exact signed candidate + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + RELEASE_TAG: ${{ inputs.tag || github.ref_name }} + CANDIDATE_DIRECTORY: ${{ runner.temp }}/rieke-candidate + run: | + gh release create "$RELEASE_TAG" "$CANDIDATE_DIRECTORY"/* \ + --verify-tag --latest=false --generate-notes --title "Rieke OS source $RELEASE_TAG" diff --git a/.gitignore b/.gitignore index 562c5ea..45274f2 100644 --- a/.gitignore +++ b/.gitignore @@ -69,3 +69,9 @@ docs/legacy/old_epochtree/ # Clone-local Rieke OS dependencies/config (never scientific project data) /.rieke-runtime/ + +# Desktop build closure and local packages (source/locks remain tracked) +/desktop/node_modules/ +/desktop/build/ +/desktop/dist/ +/desktop/resources/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 58e5826..2123aec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,26 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Rieke OS [0.1.3] - 2026-09-30 + +This desktop candidate uses the explicit unsigned testing channel. It is separate +from the MATLAB library version below and from signed production distribution. + +### Added +- Self-contained Apple Silicon desktop packaging with private Python and MySQL runtimes, folder selection, controlled installation, and testing-channel updates. +- Persistent native tag membership and autocomplete dictionaries, with Unicode prefix indexes, maintained usage counts, and exact author attribution. +- Transactional annotation history, incremental current-state recovery, and verified index migration and reuse. + +### Improved +- Small annotation batches acknowledge durable saves promptly; cell tags inherit by cell UUID without copying annotations into every epoch. +- Large-project browsing, selection, metadata storage, cache validation, and protocol-scoped curation preserve exact scientific identities. +- Portable project handling, folder-boundary checks, draft preservation, and desktop service lifecycle validation. + +At 100,000 synthetic epochs, tag autocomplete measured 21–26 ms. Initial native +index preparation took about two minutes; the paired two-save/filter API sequence +measured 192 ms. See the [reproducible benchmark report](docs/dev/scale-audit-2026-09-29/native-tag-sequence-results.md) +for scope, first-use measurements, and limitations. + ## [1.0.0] - 2026-02-28 ### Added diff --git a/CONTEXT.md b/CONTEXT.md index 8bb0866..db82380 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -28,6 +28,34 @@ _Avoid_: Matching cells solely by a repeated label such as Cell2 Recording date plus original cell name/number, with a separate cell-type tag; include a session qualifier when labels collide. Stable cell UUIDs are available as details. _Avoid_: Using a mutable cell-type classification as a database key +**Recorded cell identity**: +The identity of a cell in an acquisition, together with its recorded source and experimental ancestry. Matching dates, labels, classifications or measured values do not establish that two records identify the same cell. +_Avoid_: Cell number as identity, identity inferred from matching metadata + +**Cell correspondence**: +A reviewed scientific claim that distinct recorded cell identities refer to the same biological cell, supported by retained evidence and provenance. +_Avoid_: Automatic merge, renaming a cell to resolve uncertain identity + +**Source revision**: +One exact version of a recording's original contents. Moving or renaming an unchanged recording does not create a new source revision; changing its contents does. +_Avoid_: Filename as identity + +**Identity conflict**: +Evidence that a recorded identifier, its ancestry, or its source revision disagrees with another representation of the same acquisition. A conflict is distinct from two legitimate acquisitions sharing a display label. +_Avoid_: Duplicate inferred from name, overwriting to reconcile + +**Shared tag**: +A project annotation attached to an exact cell or epoch identity, with its author profile and provenance retained across protocol workspaces. +_Avoid_: A dataset-specific inclusion decision, an acquisition identifier + +**Inherited cell tag**: +A cell annotation visible on its epochs through their recorded cell UUID relationship. Inheritance does not copy or reassign the annotation to each epoch. +_Avoid_: Inheritance by matching cell labels or dates + +**Dataset tag**: +A curation tag scoped to an epoch within a particular protocol workspace. Multiple dataset tags and shared tags may coexist without changing acquisition identity. +_Avoid_: Treating all tags as one unscoped set + **Recorded duration**: The sum of recording durations for distinct epochs in an explicit scope and timebase, counting an epoch once across its streams and excluding gaps. _Avoid_: Session elapsed time, stimulation time, summing the same epoch once per device diff --git a/desktop/.gitignore b/desktop/.gitignore new file mode 100644 index 0000000..1096628 --- /dev/null +++ b/desktop/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +dist/ +resources/ +build-work/ +build/ diff --git a/desktop/README.md b/desktop/README.md new file mode 100644 index 0000000..162c99a --- /dev/null +++ b/desktop/README.md @@ -0,0 +1,166 @@ +# Rieke OS desktop + +This package contains the Electron shell for the existing scientific React app. +The first implementation targets macOS Apple Silicon. Its complete resource +closure currently requires a macOS 14.0 floor; support on that minimum still +needs real-device qualification. Other platforms are not advertised. The optional +debugpy PID attachment helper is excluded with provenance in the runtime receipt. + +Native signing applies the existing `allow-jit` entitlement only to the bundled +Python executable. The signed scientific and JIT workflow remains unqualified +without Developer ID credentials and independent final-artifact evidence. + +## Local build + +Building requires Node/npm, Python 3.11 or newer for build tools, uv, the macOS +developer toolchain and network access. Running the assembled app uses only its +bundled interpreter, parser, MySQL and frontend. It never provisions dependencies +at launch. + +The desktop app requires no Docker CLI, Docker Desktop or Docker daemon. Each +desktop project uses the native MySQL executable inside the app bundle, with its +database files outside the bundle in the project folder. Opening, creating, +importing, querying, exporting and reopening desktop projects work independently +of Docker. + +An older project can still have its only database inside the previous source +installation's Docker container. Reading that existing database is a one-time +source migration option, not a desktop runtime requirement. Receive a portable +transfer prepared by the source installation instead when Docker is unavailable +on the destination. A completed desktop copy uses the bundled native database. + +```sh +npm ci --prefix workspace-app +npm ci --prefix desktop +python3 tools/desktop_build_runtime.py +npm test --prefix desktop +python3 tools/desktop_runtime_manifest.py +CSC_IDENTITY_AUTO_DISCOVERY=false npm run dist --prefix desktop +``` + +The artifacts are in `desktop/dist`, including the complete +`mac-arm64/Rieke OS.app`, DMG, updater ZIP, blockmaps and `latest-mac.yml`. +Build caches and artifacts are ignored by Git. Parser and native dependency pins, +license inventory, source provenance and resource hashes are carried inside the +runtime; recordings, scientific projects and credentials are excluded. + +For development against the assembled runtime, run `npm start --prefix desktop`. +For local icon-based testing, place the complete unsigned app at +`~/Applications/Rieke OS.app` without overwriting an existing installation. +The complete app at that fixed location runs independently of the checkout. +This build explicitly selects the `unsigned-testing` distribution. Its Install +and Open action verifies the complete app and installs a user-owned copy while +preserving macOS quarantine. Its GitHub checks show newer testing versions; +downloads and restart/install require the user's action. Ordinary Quit never +installs a testing update. See [the testing release workflow](../docs/dev/GITHUB_TESTING_RELEASE.md). + +The default signed distribution still requires Developer ID verification for +installation and updates. Unsigned testing does not qualify that production path. + +## Packaged end-to-end tests + +After building, run the actual packaged UI and failure suites: + +```sh +npm run test:e2e --prefix desktop +npm run test:e2e:startup-failure --prefix desktop +npm run test:e2e:updater --prefix desktop +``` + +The UI suite copies the complete packaged app into a fresh temporary HOME, uses +an isolated Electron user-data directory and creates disposable native projects. +It tests the real sandboxed React UI, durable saved views, project navigation, +duplicate launches, renderer recovery and orderly shutdown. Only native folder +chooser return values are stubbed. Set `RIEKE_E2E_H5` to a read-only source fixture +to also test real import activity and native close deferral; the suite copies it +before import, and CI runs without private recordings. The startup-failure suite +changes and reseals only its disposable app copy to test failed backend readiness. +These tests never open or close the user's installed app. If orderly shutdown +fails, the test preserves its isolated processes for investigation. + +For an explicit no-Docker recording workflow check, run: + +```sh +python3 tools/desktop_no_docker_smoke.py --recording /path/to/test-recording.h5 +``` + +This uses the packaged runtime with a fresh HOME and restricted PATH. It denies +container commands and non-MySQL Unix sockets before access, tests those denials +with separate negative controls, and then exercises native project creation, +recording import, tags, query, export, reopen and orderly shutdown. The source +recording is copied for import; the host Docker daemon and installed app are +untouched. This is process-level test instrumentation, not a kernel sandbox or +clean-machine qualification. + +Receipts and screenshots go to `docs/dev/desktop-ui-e2e/`. The updater suite uses +the pinned real client with local HTTP transport faults. These unsigned local +tests do not qualify signed installation or signed old-to-new recovery. + +## Ownership and shutdown + +The Electron main process owns the private authenticated production Waitress +backend and all project services. A private child-pipe binding receipt precedes +the first authenticated HTTP request. The renderer is sandboxed, has no Node +integration and uses narrow validated top-frame IPC. Main injects per-session +headers only into verified owned origins; Python source update APIs are disabled +for desktop services. + +Renderer drafts and outstanding preference writes must acknowledge persistence +before backend drain. Imports, inbox work, transfers, streaming responses and +other active writes defer closure. Every owned project/database service and the +root backend must acknowledge actual exit. Timeouts and crashes do not authorize +process termination or app replacement. + +An older failed launcher can retain its idle root after rejecting a legacy +project. If recovery refuses Quit, preserve the installed bundle and service +registry for an ownership review. A controlled shutdown must first verify the +exact owned processes and confirm that no project service, database, import or +other writer is active; app replacement continues to refuse a live prior root. +Deleting registry files cannot establish that shutdown. The new launcher offers +legacy migration into a separate verified copy while preserving the source +project and its existing source application. This work's isolated tests leave +the user's older running installation unchanged. + +## Signed releases + +The public provider is explicitly `maxwellsdm1867/Rieke-OS`. Application, +frontend, and desktop metadata are coordinated at version 0.1.3. The current +`unsigned-testing` policy uses the separate `desktop-test-v0.1.3` prerelease; +it does not promote or replace the stable source release. Build from the exact +clean canonical source commit and qualify the resulting bytes before publishing. +`tools/desktop_release.py` separately rejects dirty, mismatched or foreign signed +production baselines and incomplete promotion. + +The desktop candidate workflow builds exact tagged sources. Signing is performed +on the native closure before resealing the runtime manifest and signing the outer +bundle. Notarization follows. Configure protected `desktop-signing` secrets +`CSC_LINK`, `CSC_KEY_PASSWORD`, `APPLE_API_KEY`, `APPLE_API_KEY_ID` and +`APPLE_API_ISSUER`; no credentials are included in the app. Configure required +reviewers for `desktop-publishing` in GitHub settings; YAML does not enable them. + +Promotion takes an existing successful candidate run and reviewed qualification +JSON from `release-evidence/` on the default branch. Evidence uses format +`rieke-desktop-qualification`, version 1, exact application/source/platform +identity, the artifact inventory from `artifacts.json`, and an entry for every +R01–R12 requirement. Each entry requires `passed: true` and `receipts` containing +a description and SHA-256 of the real-artifact evidence. Unit-test counts do not +substitute for qualification. Use confidential-source-free receipts. + +Promotion is serialized across versions. Existing release bytes cannot be +overwritten on retry. A complete draft becomes public without changing latest; +all public asset hashes are checked without authentication before stable/latest +is changed. An unsigned candidate must never be supplied as qualified evidence. +The legacy source-release workflow is manual and does not promote itself latest. + +Updates download quietly, are checked about hourly with jitter and require exact +signature, version, platform, resource and data-format validation. A signed prior +app is retained before installation. Ready means those candidate checks passed; +native staging and startup health are separate. Only the coordinator invokes the +native installer after draft/drain acknowledgements. Recovery verifies the +retained signer and data contract and uses the same controlled installation code. + +The production specification remains the acceptance authority: +[electron-production-spec.md](../docs/design/electron-production-spec.md). +Signing, notarization, clean-machine installation, source-user migration, full +fault-injection qualification and a real signed old-to-new update remain gates +until independently demonstrated with the final artifacts. diff --git a/desktop/bootstrap.cjs b/desktop/bootstrap.cjs new file mode 100644 index 0000000..bc8af7a --- /dev/null +++ b/desktop/bootstrap.cjs @@ -0,0 +1,174 @@ +'use strict'; +const fs = require('./physical-fs.cjs').promises; +const path = require('node:path'); +const os = require('node:os'); +const {execFile} = require('node:child_process'); +const {promisify} = require('node:util'); +const {randomUUID, createHash} = require('node:crypto'); +const runFile = promisify(execFile); +const {verifyResources, compareVersions, stableVersion, compatibleMacMinimum} = require('./updater-validation.cjs'); +const APP_ID = 'org.riekeos.desktop'; +function enclosingApp(executable) { + const marker = `${path.sep}Contents${path.sep}MacOS${path.sep}`; + const index = executable.lastIndexOf(marker); + return index >= 0 ? executable.slice(0, index) : null; +} +async function signatureIdentity(bundle, run = runFile) { + await run('/usr/bin/codesign', ['--verify', '--deep', '--strict', bundle]); + const details = await run('/usr/bin/codesign', ['--display', '--verbose=4', bundle]); + const text = `${details.stdout}\n${details.stderr}`; + const identifier = /^Identifier=(.+)$/m.exec(text)?.[1]; + const team = /^TeamIdentifier=(.+)$/m.exec(text)?.[1]; + if (identifier !== APP_ID || !team || team === 'not set' || !/^Authority=Developer ID Application:/m.test(text)) + throw new Error('Install and Open requires the verified Developer ID signed Rieke OS app'); + return {identifier, team}; +} +async function assertNotRunning(bundle, run = runFile, ignorePid = null) { + const {stdout} = await run('/bin/ps', ['-axo', 'pid=,comm=']); + const prefix = `${bundle}${path.sep}`; + if (stdout.split('\n').some(line => { + const match = /^\s*(\d+)\s+(.+)$/.exec(line); + return match && Number(match[1]) !== ignorePid && match[2].startsWith(prefix); + })) + throw new Error('The installed Rieke OS app is running. Quit it before installation.'); +} +async function readBundleManifest(bundle) { + return JSON.parse(await fs.readFile(path.join(bundle, 'Contents', 'Resources', 'runtime', 'runtime-manifest.json'), 'utf8')); +} +async function quarantineAttribute(bundle, run) { + try { + const result = await run('/usr/bin/xattr', ['-px', 'com.apple.quarantine', bundle]); + return result.stdout.replace(/\s/g, '').toLowerCase(); + } catch (error) { + if (error.code === 1 && /No such xattr/i.test(error.stderr || '')) return null; + throw error; + } +} +async function bundleDigest(bundle) { + const info = await fs.lstat(bundle); + if (!info.isDirectory() || info.isSymbolicLink()) throw new Error('A regular complete application bundle is required'); + const root = await fs.realpath(bundle), records = []; + let bytes = 0; + async function visit(directory) { + for (const name of (await fs.readdir(directory)).sort()) { + const file = path.join(directory, name), stat = await fs.lstat(file); + const relative = path.relative(root, file).split(path.sep).join('/'); + if (records.length >= 120000) throw new Error('Application bundle exceeds inventory bounds'); + const record = {path: relative, mode: stat.mode & 0o777}; + if (stat.isSymbolicLink()) { + const target = await fs.readlink(file), physical = await fs.realpath(file); + if (path.isAbsolute(target) || (!physical.startsWith(root + path.sep) && physical !== root)) throw new Error('Application symlink escapes its bundle'); + records.push({...record, type: 'symlink', target}); + } else if (stat.isDirectory()) { + records.push({...record, type: 'directory'}); await visit(file); + } else if (stat.isFile()) { + bytes += stat.size; + if (bytes > 8 * 1024 ** 3) throw new Error('Application bundle exceeds size bounds'); + const digest = createHash('sha256'), handle = await fs.open(file, 'r'); + try { for await (const chunk of handle.createReadStream()) digest.update(chunk); } finally { await handle.close(); } + records.push({...record, type: 'file', size: stat.size, sha256: digest.digest('hex')}); + } else throw new Error('Application contains a special file'); + } + } + await visit(root); + return createHash('sha256').update(JSON.stringify(records)).digest('hex'); +} +function testingDistribution(distribution) { + if (distribution === undefined || distribution === null || distribution.channel === 'signed') return false; + if (distribution.channel !== 'unsigned-testing') throw new Error('Unsupported application distribution policy'); + return true; +} +async function bundleIdentity(bundle, distribution, run, {verifyTestingSeal = true} = {}) { + if (!testingDistribution(distribution)) return signatureIdentity(bundle, run); + if (verifyTestingSeal) await run('/usr/bin/codesign', ['--verify', '--deep', '--strict', bundle]); + const plist = path.join(bundle, 'Contents', 'Info.plist'); + const declared = await run('/usr/libexec/PlistBuddy', ['-c', 'Print :CFBundleIdentifier', plist]); + if (declared.stdout.trim() !== APP_ID) throw new Error('Unsigned testing app identifier differs'); + const executable = await run('/usr/libexec/PlistBuddy', ['-c', 'Print :CFBundleExecutable', plist]); + if (executable.stdout.trim() !== 'Rieke OS' || !(await fs.stat(path.join(bundle, 'Contents', 'MacOS', 'Rieke OS'))).isFile()) throw new Error('Unsigned testing app executable is missing'); + return {identifier: APP_ID, team: null, channel: 'unsigned-testing'}; +} +async function verifyTestingBundle(bundle, run = runFile) { + await bundleIdentity(bundle, {channel: 'unsigned-testing'}, run); + const manifest = await readBundleManifest(bundle); + const required = ['python/bin/python3.11', 'mysql/bin/mysqld', 'mysql/bin/mysql', 'mysql/bin/mysqldump', 'application/python/workspace_desktop.py']; + if (!compatibleManifest(manifest, manifest) || !/^[a-f0-9]{40}$/.test(manifest.source_commit || '') || !/^[a-f0-9]{40}$/.test(manifest.parser_commit || '') || + !/^3\.11\.\d+$/.test(manifest.python_version || '') || !/^8\.4\.\d+$/.test(manifest.mysql_version || '') || !Array.isArray(manifest.workspace_formats) || !manifest.workspace_formats.length || + !Number.isInteger(manifest.database_compatibility) || !required.every(name => manifest.resources?.[name])) throw new Error('Unsigned testing runtime closure is incomplete'); + stableVersion(manifest.application_version); + const plist = path.join(bundle, 'Contents', 'Info.plist'); + const version = await run('/usr/libexec/PlistBuddy', ['-c', 'Print :CFBundleShortVersionString', plist]); + const minimum = await run('/usr/libexec/PlistBuddy', ['-c', 'Print :LSMinimumSystemVersion', plist]); + if (version.stdout.trim() !== manifest.application_version || minimum.stdout.trim() !== manifest.minimum_macos_version) throw new Error('Unsigned testing app and runtime versions differ'); + const host = await run('/usr/bin/sw_vers', ['-productVersion']); + compatibleMacMinimum(manifest.minimum_macos_version, host.stdout.trim()); + return manifest; +} +function compatibleManifest(candidate, current) { + return candidate.format === 'rieke-desktop-runtime' && candidate.version === 1 && candidate.platform === 'darwin' && candidate.architecture === 'arm64' && + candidate.mysql_version === current.mysql_version && + candidate.database_compatibility === current.database_compatibility && + JSON.stringify(candidate.workspace_formats) === JSON.stringify(current.workspace_formats); +} +async function installCompleteBundle({source, destination = path.join(os.homedir(), 'Applications', 'Rieke OS.app'), run = runFile, allowRollback = false, ignorePid = null, distribution, expectedBundleSha256}) { + const unsignedTesting = testingDistribution(distribution); + if (ignorePid !== null && (!allowRollback || ignorePid !== process.pid)) throw new Error('Only the dedicated current recovery helper may be exempted from running-app checks'); + if (!source || !source.endsWith('.app')) throw new Error('A complete app bundle is required'); + const parent = path.dirname(destination); + await fs.mkdir(parent, {recursive: true, mode: 0o700}); + const info = await fs.lstat(parent); + if (info.isSymbolicLink() || info.uid !== process.getuid()) throw new Error('Installation folder must be owned by the current user'); + const sourceDigest = unsignedTesting ? await bundleDigest(source) : null; + const quarantine = unsignedTesting ? await quarantineAttribute(source, run) : null; + if (expectedBundleSha256 !== undefined && sourceDigest !== expectedBundleSha256) throw new Error('Downloaded application bundle checksum differs'); + const sourceIdentity = await bundleIdentity(source, distribution, run); + const sourceManifest = await readBundleManifest(source); + if (unsignedTesting) await verifyTestingBundle(source, run); + stableVersion(sourceManifest.application_version); + if (!compatibleManifest(sourceManifest, sourceManifest) || !sourceManifest.source_commit || !sourceManifest.resources || + !Array.isArray(sourceManifest.workspace_formats) || !Number.isInteger(sourceManifest.database_compatibility)) + throw new Error('Downloaded app runtime manifest is invalid'); + const sourcePlist = await run('/usr/libexec/PlistBuddy', ['-c', 'Print :CFBundleShortVersionString', path.join(source, 'Contents', 'Info.plist')]); + if (sourcePlist.stdout.trim() !== sourceManifest.application_version) throw new Error('App and runtime versions differ'); + await verifyResources(path.join(source, 'Contents', 'Resources', 'runtime'), sourceManifest.resources); + const lock = path.join(parent, '.rieke-os-install.lock'); + await fs.mkdir(lock, {mode: 0o700}); + const staging = path.join(parent, `.Rieke OS.install-${randomUUID()}.app`); + const previous = path.join(parent, '.Rieke OS.previous.app'); + let movedPrevious = false; + try { + let existing = false; + try { + const targetInfo = await fs.lstat(destination); + if (targetInfo.isSymbolicLink() || targetInfo.uid !== process.getuid()) throw new Error('Installed app is not a user-owned bundle'); + const installedIdentity = await bundleIdentity(destination, distribution, run, {verifyTestingSeal: false}); + if (installedIdentity.team !== sourceIdentity.team) throw new Error('Installed app has a different signing identity'); + const installedManifest = await readBundleManifest(destination); + if (!compatibleManifest(sourceManifest, installedManifest)) throw new Error('Installed app uses incompatible workspace or database formats'); + if (!allowRollback && compareVersions(sourceManifest.application_version, installedManifest.application_version) < 0) throw new Error('Install and Open cannot downgrade the installed app'); + await verifyResources(path.join(destination, 'Contents', 'Resources', 'runtime'), installedManifest.resources); + await assertNotRunning(destination, run, ignorePid); existing = true; + } catch (error) { if (error.code !== 'ENOENT') throw error; } + await run('/usr/bin/ditto', ['--rsrc', '--extattr', '--acl', source, staging]); + const copiedIdentity = await bundleIdentity(staging, distribution, run); + if (copiedIdentity.team !== sourceIdentity.team) throw new Error('Copied app signature differs from downloaded app'); + await verifyResources(path.join(staging, 'Contents', 'Resources', 'runtime'), sourceManifest.resources); + if (unsignedTesting && await bundleDigest(staging) !== sourceDigest) throw new Error('Copied application bundle checksum differs'); + if (unsignedTesting && await quarantineAttribute(staging, run) !== quarantine) throw new Error('Copied application quarantine attribute differs'); + if (!unsignedTesting) await run('/usr/sbin/spctl', ['--assess', '--type', 'execute', staging]); + if (existing) { + await assertNotRunning(destination, run, ignorePid); + // Retain exactly one verified previous signed bundle, only after the new copy is complete. + await fs.rm(previous, {recursive: true, force: true}); + await fs.rename(destination, previous); movedPrevious = true; + } + try { await fs.rename(staging, destination); } + catch (error) { if (movedPrevious) await fs.rename(previous, destination); throw error; } + await bundleIdentity(destination, distribution, run); + return {destination, previous: movedPrevious ? previous : null}; + } finally { + await fs.rm(staging, {recursive: true, force: true}); + await fs.rm(lock, {recursive: true, force: true}); + } +} +module.exports = {APP_ID, enclosingApp, signatureIdentity, assertNotRunning, compatibleManifest, installCompleteBundle, readBundleManifest, bundleDigest, verifyTestingBundle}; diff --git a/desktop/distribution.cjs b/desktop/distribution.cjs new file mode 100644 index 0000000..e15f340 --- /dev/null +++ b/desktop/distribution.cjs @@ -0,0 +1,10 @@ +'use strict'; +const REPOSITORY = 'maxwellsdm1867/Rieke-OS'; +function distributionPolicy(value) { + if (value === undefined) return Object.freeze({channel:'signed',repository:REPOSITORY}); + if (value?.format !== 'rieke-desktop-distribution' || value.version !== 1 || + !['signed','unsigned-testing'].includes(value.channel) || value.repository !== REPOSITORY) + throw new Error('The desktop distribution policy is invalid.'); + return Object.freeze({...value}); +} +module.exports={distributionPolicy}; diff --git a/desktop/distribution.json b/desktop/distribution.json new file mode 100644 index 0000000..a893a0b --- /dev/null +++ b/desktop/distribution.json @@ -0,0 +1,6 @@ +{ + "format": "rieke-desktop-distribution", + "version": 1, + "channel": "unsigned-testing", + "repository": "maxwellsdm1867/Rieke-OS" +} diff --git a/desktop/draft-barrier.cjs b/desktop/draft-barrier.cjs new file mode 100644 index 0000000..096b198 --- /dev/null +++ b/desktop/draft-barrier.cjs @@ -0,0 +1,26 @@ +'use strict'; +const {randomUUID} = require('node:crypto'); +class DraftBarrier { + constructor({timeout = 10000, send = (window, value) => window.webContents.send('desktop:prepare-close', value)} = {}) { + this.timeout = timeout; this.send = send; this.pending = new Map(); + } + acknowledge(payload, window) { + if (!payload || typeof payload.requestId !== 'string' || typeof payload.ok !== 'boolean' || Object.keys(payload).sort().join(',') !== 'ok,requestId') throw new TypeError('Invalid draft acknowledgement'); + const pending = this.pending.get(payload.requestId); + if (!pending || pending.window !== window) throw new Error('No matching draft request'); + pending.resolve(payload.ok); return {acknowledged: true}; + } + async prepare(windows) { + if ([...windows].some(window => window.isDestroyed() || window.draftUnavailable)) + return {ready: false, reason: 'Renderer drafts have not been acknowledged. Restore the scientific window before quitting.'}; + const results = await Promise.all([...windows].map(window => new Promise(resolve => { + const requestId = randomUUID(); + const finish = ok => { clearTimeout(timer); this.pending.delete(requestId); resolve(ok); }; + const timer = setTimeout(() => finish(false), this.timeout); + this.pending.set(requestId, {window, resolve: finish}); + try { this.send(window, {requestId}); } catch { finish(false); } + }))); + return results.every(Boolean) ? {ready: true} : {ready: false, reason: 'Draft persistence was not acknowledged; quit and replacement are deferred'}; + } +} +module.exports = {DraftBarrier}; diff --git a/desktop/draft-store.cjs b/desktop/draft-store.cjs new file mode 100644 index 0000000..b992331 --- /dev/null +++ b/desktop/draft-store.cjs @@ -0,0 +1,55 @@ +'use strict'; +const fs = require('node:fs/promises'); +const path = require('node:path'); +const {randomUUID} = require('node:crypto'); +const {validateDraft, validateProjectId} = require('./security.cjs'); +const MAX_DRAFT_BYTES = 2 * 1024 * 1024; +function validStoredDraft(value, projectId) { + return value !== null && typeof value === 'object' && !Array.isArray(value) && + value.format === 'rieke-renderer-draft' && value.version === 1 && value.projectId === projectId && + value.value !== null && typeof value.value === 'object' && !Array.isArray(value.value); +} +class DraftStore { + constructor(userData) { this.userData = userData; this.directory = path.join(userData, 'drafts'); this.pending = new Set(); } + async location(projectId) { + const id = validateProjectId(projectId); + await fs.mkdir(this.directory, {recursive: true, mode: 0o700}); + const stat = await fs.lstat(this.directory); + if (!stat.isDirectory() || stat.isSymbolicLink() || stat.uid !== process.getuid()) throw new Error('Draft state directory is redirected or not privately owned'); + return {id, filename: path.join(this.directory, `${id}.json`)}; + } + recovery(id) { this.pending.add(id); return {format: 'rieke-draft-recovery', version: 1, projectId: id, reason: 'saved-draft-unreadable'}; } + async load(projectId) { + const id = validateProjectId(projectId); + if (this.pending.has(id)) return this.recovery(id); + let filename; + try { ({filename} = await this.location(id)); } + catch { return this.recovery(id); } + try { + const stat = await fs.lstat(filename); + if (!stat.isFile() || stat.isSymbolicLink() || stat.size > MAX_DRAFT_BYTES || stat.uid !== process.getuid()) return this.recovery(id); + const value = JSON.parse(await fs.readFile(filename, 'utf8')); + return validStoredDraft(value, id) ? value : this.recovery(id); + } catch (error) { return error.code === 'ENOENT' ? null : this.recovery(id); } + } + async save(payload) { + const {projectId, serialized} = validateDraft(payload); + if (!validStoredDraft(payload.value, projectId)) throw new TypeError('Invalid renderer draft identity or schema'); + await this.load(projectId); + if (this.pending.has(projectId)) throw new Error('Saved view needs an explicit recovery decision before it can be replaced'); + const {filename} = await this.location(projectId); + const temporary = `${filename}.${randomUUID()}.tmp`; + try { await fs.writeFile(temporary, serialized, {mode: 0o600, flag: 'wx'}); await fs.rename(temporary, filename); } + finally { await fs.rm(temporary, {force: true}); } + return {saved: true}; + } + async reset(projectId) { + const id = validateProjectId(projectId); + if (!this.pending.has(id)) throw new Error('No verified unreadable draft is pending recovery'); + const {filename} = await this.location(id); + try { await fs.rename(filename, path.join(this.directory, `${id}.corrupt-${randomUUID()}.json`)); } + catch (error) { if (error.code !== 'ENOENT') throw error; } + this.pending.delete(id); return {reset: true}; + } +} +module.exports = {DraftStore, validStoredDraft, MAX_DRAFT_BYTES}; diff --git a/desktop/e2e/backend-failure.e2e.cjs b/desktop/e2e/backend-failure.e2e.cjs new file mode 100644 index 0000000..d3ed942 --- /dev/null +++ b/desktop/e2e/backend-failure.e2e.cjs @@ -0,0 +1,41 @@ +'use strict'; +const assert = require('node:assert/strict'); +const fs = require('node:fs/promises'), path = require('node:path'); +const {createHash} = require('node:crypto'); +const {createFixture, launch, run} = require('./helpers.cjs'); +const {resealRuntimeManifest} = require('../sign-runtime.cjs'); +const {verifyResources} = require('../updater-validation.cjs'); +(async () => { + const fixture = await createFixture({reuse: false}); + const runtime = path.join(fixture.bundle, 'Contents/Resources/runtime'); + const sourceManifestSha256 = createHash('sha256').update(await fs.readFile(path.join(runtime, 'runtime-manifest.json'))).digest('hex'); + const appAsarSha256 = createHash('sha256').update(await fs.readFile(path.join(fixture.bundle, 'Contents/Resources/app.asar'))).digest('hex'); + const entry = path.join(runtime, 'application/python/workspace_desktop.py'); + // This faulted copy is disposable and never supplies signing/release evidence. + // The literal statement cannot import project code, bind services or start DB. + const literalFailure = "raise RuntimeError('Injected packaged backend failure before imports, binding, projects or databases')\n"; + await fs.writeFile(entry, literalFailure); + const manifest = await resealRuntimeManifest(runtime); await verifyResources(runtime, manifest.resources); + const {application, page} = await launch(fixture); + await page.getByRole('heading', {name: 'Rieke OS recovery', exact: true}).waitFor({timeout: 90000}); + const status = await page.evaluate(() => window.riekeDesktop.status()); + assert.equal(status.state, 'Recovery'); assert.match(status.detail, /exited before owning its listener/); + assert.equal(await page.getByRole('heading', {name: 'Your projects', exact: true}).count(), 0); + const record = JSON.parse(await fs.readFile(path.join(fixture.userData, 'desktop-service.json'), 'utf8')); + assert.ok(record.executable.startsWith(fixture.bundle + '/')); + await assert.rejects(run('/bin/ps', ['-p', String(record.pid), '-o', 'comm='])); + assert.equal((await page.evaluate(() => window.riekeDesktop.quit())).ready, false); + assert.equal((await fs.readdir(path.join(fixture.userData, 'backend'))).length, 0); + const output = path.resolve(__dirname, '../../docs/dev/desktop-ui-e2e'); await fs.mkdir(output, {recursive: true}); + await page.screenshot({path: path.join(output, 'backend-startup-recovery.png')}); + const receipt = {format: 'rieke-packaged-backend-failure-e2e', version: 1, passed: true, signed_qualification: false, + method: 'Separate disposable packaged clone; literal raise-before-import backend; clone-only manifest reseal', + source_manifest_sha256: sourceManifestSha256, app_asar_sha256: appAsarSha256, + fault_code_sha256: createHash('sha256').update(literalFailure).digest('hex'), recovery_before_projects: true, + backend_exited: true, no_service_or_database_start: true, unsafe_quit_deferred: true, + teardown: 'Only this test GUI exits after the known literal failed backend has exited; no workers or databases existed'}; + await fs.writeFile(path.join(output, 'backend-startup-failure.json'), JSON.stringify(receipt, null, 2) + '\n'); + const exited = new Promise(resolve => application.process().once('exit', resolve)); + await application.evaluate(({app}) => app.exit(0)); assert.equal(await exited, 0); + console.log(JSON.stringify(receipt)); +})().catch(error => {console.error(error.message); process.exitCode = 1;}); diff --git a/desktop/e2e/bootstrap.e2e.cjs b/desktop/e2e/bootstrap.e2e.cjs new file mode 100644 index 0000000..0c30bd1 --- /dev/null +++ b/desktop/e2e/bootstrap.e2e.cjs @@ -0,0 +1,89 @@ +'use strict'; +// Real downloaded app UI, installer copy/seal/quarantine checks and installed +// startup. Only Launch Services dispatch is stubbed in this disposable clone; +// it must never target the user's running application or profile. +const assert=require('node:assert/strict'),fs=require('node:fs/promises'),path=require('node:path'); +const {createHash}=require('node:crypto'); +const {_electron}=require('playwright'); +const asar=require('@electron/asar'); +const {createFixture,launch,gracefulQuit,run}=require('./helpers.cjs'); +const {verifyResources}=require('../updater-validation.cjs'); +const {bundleDigest}=require('../bootstrap.cjs'); +const output=path.resolve(__dirname,'../../docs/dev/desktop-ui-e2e/bootstrap-receipt.json'); +const receipt={format:'rieke-packaged-bootstrap-e2e',version:1,signed_qualification:false,checks:[],failures:[],method:'Real downloaded packaged clone with native install checks; only /usr/bin/open dispatch stubbed; isolated installed profile launched with Playwright'}; +let fixture,application,page; +async function write(){await fs.mkdir(path.dirname(output),{recursive:true});await fs.writeFile(output,JSON.stringify(receipt,null,2)+'\n');} +async function check(name,fn){try{const evidence=await fn();receipt.checks.push({name,passed:true,evidence});console.log('PASS '+name);}catch(error){receipt.failures.push({name,message:error.message});await write();throw error;}await write();} +async function main(){ + fixture=await createFixture({reuse:false});receipt.fixture_root=fixture.root; + const target=fixture.bundle,downloaded=path.join(fixture.home,'Downloads','Rieke OS.app'); + const resources=path.join(target,'Contents/Resources'),sourceAsar=path.join(resources,'app.asar'); + receipt.source_app_asar_sha256=createHash('sha256').update(await fs.readFile(sourceAsar)).digest('hex'); + const manifestBytes=await fs.readFile(path.join(resources,'runtime/runtime-manifest.json')),manifest=JSON.parse(manifestBytes); + receipt.source_manifest_sha256=createHash('sha256').update(manifestBytes).digest('hex');receipt.application_version=manifest.application_version; + await fs.mkdir(path.dirname(downloaded),{recursive:true});await fs.rename(target,downloaded); + fixture.bundle=downloaded;fixture.executable=path.join(downloaded,'Contents/MacOS/Rieke OS'); + const archive=path.join(downloaded,'Contents/Resources/app.asar'),unpacked=path.join(fixture.root,'bootstrap-test-asar'),handoff=path.join(fixture.home,'launch-services-handoff.json'); + asar.extractAll(archive,unpacked); + const mainFile=path.join(unpacked,'main.cjs'),original=await fs.readFile(mainFile,'utf8'); + const exact="const {execFile} = require('node:child_process');"; + assert.ok(original.includes(exact),'Expected packaged main OS process boundary'); + const wrapper=`const nativeExecFile = require('node:child_process').execFile; +const execFile = (...args) => nativeExecFile(...args); +execFile[require('node:util').promisify.custom] = async (file, args) => { + if (file === '/usr/bin/open') { require('node:fs').writeFileSync(${JSON.stringify(handoff)}, JSON.stringify({file,args,home:process.env.HOME,userData:app.getPath('userData')})+'\\n',{mode:0o600}); return {stdout:'',stderr:''}; } + return require('node:util').promisify(nativeExecFile)(file,args); +};`; + await fs.writeFile(mainFile,original.replace(exact,wrapper));await asar.createPackage(unpacked,archive);asar.uncacheAll(); + const headerHash=createHash('sha256').update(asar.getRawHeader(archive).headerString).digest('hex'); + await run('/usr/libexec/PlistBuddy',['-c',`Set :ElectronAsarIntegrity:Resources/app.asar:hash ${headerHash}`,path.join(downloaded,'Contents/Info.plist')]); + await run('/usr/bin/codesign',['--force','--sign','-','--entitlements',path.resolve(__dirname,'../entitlements.mac.plist'),downloaded]); + await run('/usr/bin/codesign',['--verify','--deep','--strict',downloaded]); + const quarantine='0083;66000000;Rieke-E2E;00000000-0000-4000-8000-000000000001'; + // Quarantine is assigned only AFTER this source test clone has launched. + // The quarantined installed copy is never executed or stripped of quarantine. + const before=await bundleDigest(downloaded); + await check('downloaded clone displays explicit unsigned Install and Open before any backend starts',async()=>{ + application=await _electron.launch({executablePath:fixture.executable,args:[`--user-data-dir=${fixture.userData}`],env:{...process.env,HOME:fixture.home,TMPDIR:fixture.root,XDG_CONFIG_HOME:fixture.userData},chromiumSandbox:true,bypassCSP:false,timeout:45000}); + const actual=await application.evaluate(({app})=>({home:process.env.HOME,userData:app.getPath('userData'),appPath:app.getAppPath(),packaged:app.isPackaged})); + assert.equal(actual.home,fixture.home);assert.equal(actual.userData,path.join(fixture.userData,'installer'));assert.ok(actual.appPath.startsWith(downloaded+'/'));assert.equal(actual.packaged,true); + page=await application.firstWindow();await page.getByRole('heading',{name:'Install Rieke OS',exact:true}).waitFor(); + await page.getByText('Unsigned testing',{exact:true}).waitFor();assert.match(await page.locator('#detail').innerText(),/Open Anyway/); + await page.getByRole('button',{name:'Install and Open',exact:true}).waitFor(); + assert.equal(await fs.stat(target).then(()=>true,()=>false),false);assert.equal(await fs.stat(handoff).then(()=>true,()=>false),false); + assert.equal(await fs.stat(path.join(fixture.userData,'desktop-service.json')).then(()=>true,()=>false),false); + await page.screenshot({path:path.join(path.dirname(output),'bootstrap-install-and-open.png')}); + await run('/usr/bin/xattr',['-w','com.apple.quarantine',quarantine,downloaded]);return {bootstrap:true,no_automatic_install:true,no_backend:true,isolated_installer_profile:true}; + }); + await check('explicit Install and Open copies the complete verified bundle and preserves quarantine and installed profile',async()=>{ + const exited=new Promise(resolve=>application.process().once('exit',resolve));await page.getByRole('button',{name:'Install and Open',exact:true}).click(); + const code=await Promise.race([exited,new Promise((_r,reject)=>setTimeout(()=>reject(new Error('Installer failed to complete its native copy')),420000).unref())]);assert.equal(code,0); + const dispatch=JSON.parse(await fs.readFile(handoff,'utf8')); + assert.deepEqual(dispatch.args,['-n','-a',target,'--env',`HOME=${fixture.home}`,'--args',`--user-data-dir=${fixture.userData}`]);assert.equal(dispatch.file,'/usr/bin/open');assert.equal(dispatch.home,fixture.home); + assert.equal(await bundleDigest(target),before);assert.equal(await bundleDigest(downloaded),before); + assert.equal((await run('/usr/bin/xattr',['-p','com.apple.quarantine',target])).stdout.trim(),quarantine); + await verifyResources(path.join(target,'Contents/Resources/runtime'),manifest.resources);await run('/usr/bin/codesign',['--verify','--deep','--strict',target]); + return {real_complete_copy:true,copy_hash_identical:true,source_unchanged:true,quarantine_preserved:true,exact_isolated_launch_profile:true,os_dispatch_only_stubbed:true}; + }); + await check('installed copy cold starts into Your projects using the base isolated profile',async()=>{ + // A completely separate never-quarantined fixture qualifies profile startup. + fixture=await createFixture({reuse:false});receipt.unquarantined_profile_fixture_root=fixture.root; + const cleanTarget=fixture.bundle,cleanDownload=path.join(fixture.home,'Downloads','Rieke OS.app'),cleanHandoff=path.join(fixture.home,'launch-services-handoff.json'); + await fs.mkdir(path.dirname(cleanDownload),{recursive:true});await fs.rename(cleanTarget,cleanDownload); + const cleanArchive=path.join(cleanDownload,'Contents/Resources/app.asar'),cleanUnpacked=path.join(fixture.root,'profile-test-asar');asar.extractAll(cleanArchive,cleanUnpacked); + const cleanMain=path.join(cleanUnpacked,'main.cjs'),cleanOriginal=await fs.readFile(cleanMain,'utf8');assert.ok(cleanOriginal.includes(exact)); + await fs.writeFile(cleanMain,cleanOriginal.replace(exact,wrapper.replace(JSON.stringify(handoff),JSON.stringify(cleanHandoff))));await asar.createPackage(cleanUnpacked,cleanArchive);asar.uncacheAll(); + await run('/usr/libexec/PlistBuddy',['-c',`Set :ElectronAsarIntegrity:Resources/app.asar:hash ${createHash('sha256').update(asar.getRawHeader(cleanArchive).headerString).digest('hex')}`,path.join(cleanDownload,'Contents/Info.plist')]); + await run('/usr/bin/codesign',['--force','--sign','-','--entitlements',path.resolve(__dirname,'../entitlements.mac.plist'),cleanDownload]);await run('/usr/bin/codesign',['--verify','--deep','--strict',cleanDownload]); + application=await _electron.launch({executablePath:path.join(cleanDownload,'Contents/MacOS/Rieke OS'),args:[`--user-data-dir=${fixture.userData}`],env:{...process.env,HOME:fixture.home,TMPDIR:fixture.root,XDG_CONFIG_HOME:fixture.userData},chromiumSandbox:true,bypassCSP:false,timeout:45000}); + page=await application.firstWindow();await page.getByRole('heading',{name:'Install Rieke OS',exact:true}).waitFor(); + const exited=new Promise(resolve=>application.process().once('exit',resolve));await page.getByRole('button',{name:'Install and Open',exact:true}).click();assert.equal(await Promise.race([exited,new Promise((_r,reject)=>setTimeout(()=>reject(new Error('Clean installer did not finish')),420000).unref())]),0); + assert.deepEqual(JSON.parse(await fs.readFile(cleanHandoff,'utf8')).args,['-n','-a',cleanTarget,'--env',`HOME=${fixture.home}`,'--args',`--user-data-dir=${fixture.userData}`]); + assert.equal(await run('/usr/bin/xattr',['-p','com.apple.quarantine',cleanTarget]).then(()=>true,error=>{if(error.code===1)return false;throw error;}),false,'This startup fixture must never carry quarantine'); + fixture.bundle=cleanTarget;fixture.executable=path.join(cleanTarget,'Contents/MacOS/Rieke OS');({application,page}=await launch(fixture)); + await page.getByRole('heading',{name:'Your projects',exact:true}).waitFor({timeout:90000});assert.equal((await page.evaluate(()=>window.riekeDesktop.status())).channel,'unsigned-testing'); + await gracefulQuit(application,page);await verifyResources(path.join(cleanTarget,'Contents/Resources/runtime'),manifest.resources);return {manual_macos_approval_unqualified:true,separate_never_quarantined_fixture:true,real_installed_startup:true,base_profile_restored:true,native_orderly_exit:true,runtime_immutable:true}; + }); + assert.equal(receipt.failures.length,0);await write();console.log('Bootstrap receipt: '+output); +} +main().catch(async error=>{console.error(error.stack);receipt.failures.push({name:'bootstrap-suite',message:error.message});await write();process.exitCode=1;}); diff --git a/desktop/e2e/github-updates.e2e.cjs b/desktop/e2e/github-updates.e2e.cjs new file mode 100644 index 0000000..17e2102 --- /dev/null +++ b/desktop/e2e/github-updates.e2e.cjs @@ -0,0 +1,79 @@ +'use strict'; +// Only the official GitHub HTTPS transport is mapped to a loopback asset server +// inside an isolated test clone. Descriptor, ZIP, candidate/runtime validation, +// UI, draft/writer drain and ordinary Quit all run the packaged implementation. +const assert=require('node:assert/strict'),fs=require('node:fs/promises'),nativeFs=require('node:fs'),path=require('node:path'),http=require('node:http'); +const {createHash}=require('node:crypto'),asar=require('@electron/asar'); +const {createFixture,launch,gracefulQuit,ownedControl,run}=require('./helpers.cjs'); +const {verifyResources}=require('../updater-validation.cjs'); +const output=path.resolve(__dirname,'../../docs/dev/desktop-ui-e2e/github-update-receipt.json'); +const receipt={format:'rieke-packaged-github-update-ui-e2e',version:1,signed_qualification:false,checks:[],failures:[],method:'Version-only Current clone, official HTTPS GitHub URLs mapped only at transport boundary to real final descriptor and ZIP; no candidate validation or drain mocks'}; +let fixture,application,page,server;const counts={api:0,descriptor:0,archive:0}; +const delay=ms=>new Promise(resolve=>setTimeout(resolve,ms)); +async function write(){await fs.mkdir(path.dirname(output),{recursive:true});await fs.writeFile(output,JSON.stringify({...receipt,requests:counts},null,2)+'\n');} +async function check(name,fn){const start=Date.now();try{const evidence=await fn();receipt.checks.push({name,passed:true,elapsed_ms:Date.now()-start,evidence});console.log('PASS '+name);}catch(error){receipt.failures.push({name,message:error.message});await write();throw error;}await write();} +async function main(){ + fixture=await createFixture({reuse:false});receipt.fixture_root=fixture.root; + const published=path.resolve(__dirname,'../dist/mac-arm64/Rieke OS.app'),sourceManifestFile=path.join(published,'Contents/Resources/runtime/runtime-manifest.json'),sourceBytes=await fs.readFile(sourceManifestFile),sourceManifest=JSON.parse(sourceBytes); + receipt.source_manifest_sha256=createHash('sha256').update(sourceBytes).digest('hex');receipt.source_app_asar_sha256=createHash('sha256').update(await fs.readFile(path.join(published,'Contents/Resources/app.asar'))).digest('hex'); + const candidateVersion=sourceManifest.application_version;assert.equal(candidateVersion,'0.1.3','Test scenario requires the final 0.1.3 package'); + const zip=path.resolve(__dirname,`../dist/Rieke-OS-${candidateVersion}-arm64.zip`),descriptorPath=path.join(fixture.root,'desktop-release.json'); + await run(path.join(fixture.bundle,'Contents/Resources/runtime/python/bin/python3.11'),['-B',path.resolve(__dirname,'../../tools/desktop_test_release.py'),'--app',published,'--archive',zip,'--output',descriptorPath],{env:{...process.env,PYTHONDONTWRITEBYTECODE:'1'}}); + const descriptorBytes=await fs.readFile(descriptorPath),descriptor=JSON.parse(descriptorBytes);receipt.candidate_archive_sha256=descriptor.archive.sha256; + const tag=`desktop-test-v${candidateVersion}`,root=`https://github.com/maxwellsdm1867/Rieke-OS/releases/download/${tag}/`; + const releases=Buffer.from(JSON.stringify([{draft:false,prerelease:true,tag_name:tag,assets:[{name:'desktop-release.json',browser_download_url:root+'desktop-release.json',size:descriptorBytes.length},{name:descriptor.archive.filename,browser_download_url:root+descriptor.archive.filename,size:descriptor.archive.size}]}])); + server=http.createServer((request,response)=>{ + if(request.url==='/api'){counts.api++;response.writeHead(200,{'content-length':releases.length});response.end(releases);} + else if(request.url==='/descriptor'){counts.descriptor++;response.writeHead(200,{'content-length':descriptorBytes.length});response.end(descriptorBytes);} + else if(request.url==='/archive'){counts.archive++;response.writeHead(200,{'content-length':descriptor.archive.size});nativeFs.createReadStream(zip).pipe(response);} + else{response.writeHead(404);response.end();} + });await new Promise(resolve=>server.listen(0,'127.0.0.1',resolve)); + const base=`http://127.0.0.1:${server.address().port}`,transport=path.join(fixture.root,'github-transport.cjs'); + await fs.writeFile(transport,`'use strict';const http=require('node:http');exports.transport=(url,{kind}={})=>{const target=url==='https://api.github.com/repos/maxwellsdm1867/Rieke-OS/releases?per_page=100&page=1'?'/api':url===${JSON.stringify(root+'desktop-release.json')}?'/descriptor':url===${JSON.stringify(root+descriptor.archive.filename)}?'/archive':null;if(!target)return Promise.reject(new Error('Unexpected official fixture URL'));return new Promise((resolve,reject)=>{http.get(${JSON.stringify(base)}+target,response=>resolve({statusCode:response.statusCode,headers:response.headers,body:response})).on('error',reject);});};\n`,{mode:0o600}); + const runtime=path.join(fixture.bundle,'Contents/Resources/runtime'),manifestFile=path.join(runtime,'runtime-manifest.json'),manifest=JSON.parse(await fs.readFile(manifestFile));manifest.application_version='0.1.2'; + const releaseNames=Object.keys(manifest.resources).filter(name=>name.endsWith('/rieke-release.json')); + assert.ok(releaseNames.includes('application/rieke-release.json')); + for(const name of releaseNames){const file=path.join(runtime,name),release=JSON.parse(await fs.readFile(file));release.version='0.1.2';const bytes=Buffer.from(JSON.stringify(release,null,2)+'\n');await fs.writeFile(file,bytes);manifest.resources[name]={sha256:createHash('sha256').update(bytes).digest('hex'),size:bytes.length};} + await fs.writeFile(manifestFile,JSON.stringify(manifest,null,2)+'\n'); + const archive=path.join(fixture.bundle,'Contents/Resources/app.asar'),unpacked=path.join(fixture.root,'update-ui-test-asar');asar.extractAll(archive,unpacked); + const mainFile=path.join(unpacked,'main.cjs'),original=await fs.readFile(mainFile,'utf8'),anchor='manifest: supervisor.manifest, distribution});';assert.ok(original.includes(anchor)); + await fs.writeFile(mainFile,original.replace(anchor,`manifest: supervisor.manifest, distribution, transport: require(${JSON.stringify(transport)}).transport});`)); + const packageFile=path.join(unpacked,'package.json'),pack=JSON.parse(await fs.readFile(packageFile));pack.version='0.1.2';await fs.writeFile(packageFile,JSON.stringify(pack,null,2)+'\n'); + await asar.createPackage(unpacked,archive);asar.uncacheAll();const plist=path.join(fixture.bundle,'Contents/Info.plist'); + await run('/usr/libexec/PlistBuddy',['-c','Set :CFBundleShortVersionString 0.1.2',plist]);await run('/usr/libexec/PlistBuddy',['-c','Set :CFBundleVersion 0.1.2',plist]); + await run('/usr/libexec/PlistBuddy',['-c',`Set :ElectronAsarIntegrity:Resources/app.asar:hash ${createHash('sha256').update(asar.getRawHeader(archive).headerString).digest('hex')}`,plist]); + await run('/usr/bin/codesign',['--force','--sign','-','--entitlements',path.resolve(__dirname,'../entitlements.mac.plist'),fixture.bundle]);await run('/usr/bin/codesign',['--verify','--deep','--strict',fixture.bundle]); + await verifyResources(runtime,manifest.resources);receipt.test_current_version='0.1.2'; + ({application,page}=await launch(fixture));page.on('pageerror',error=>receipt.failures.push({name:'renderer-pageerror',message:error.message})); + await page.getByRole('heading',{name:'Your projects',exact:true}).waitFor({timeout:90000}); + await check('background official release metadata creates a quiet version notice without downloading',async()=>{ + await page.waitForFunction(()=>[...document.querySelectorAll('.app-update-badge')].some(node=>node.textContent==='v0.1.3'),undefined,{timeout:30000}); + assert.ok(counts.api>0&&counts.descriptor>0);assert.equal(counts.archive,0);const status=await page.evaluate(()=>window.riekeDesktop.status());assert.equal(status.state,'Available');assert.equal(status.channel,'unsigned-testing');assert.equal(status.manual_updates,true);return {visible_available_version:'0.1.3',automatic_metadata:true,no_archive_download:true}; + }); + await check('explicit Check and Download prepare a fully validated real ZIP and show Restart to update',async()=>{ + await page.getByRole('button',{name:/^Release \/ Publish/}).first().click();const dialog=page.getByRole('dialog',{name:'Release / Publish',exact:true}); + assert.match(await dialog.innerText(),/Unsigned testing/);assert.doesNotMatch(await dialog.innerText(),/New versions download automatically|next launch applies/); + const before=counts.api;await dialog.getByRole('button',{name:'Check for updates',exact:true}).click();await page.waitForFunction(()=>window.riekeDesktop.status().then(s=>s.state==='Available'));assert.ok(counts.api>before);assert.equal(counts.archive,0); + await dialog.getByRole('button',{name:'Download update',exact:true}).click();await dialog.getByRole('button',{name:'Restart to update',exact:true}).waitFor({timeout:180000}); + const status=await page.evaluate(()=>window.riekeDesktop.status());assert.equal(status.state,'Ready');assert.equal(status.can_restart,true);assert.equal(counts.archive,1); + await page.screenshot({path:path.join(path.dirname(output),'github-testing-update-ready.png')});return {explicit_check:true,explicit_download:true,real_zip_validated:true,ready_version:status.available,no_install_before_restart:true}; + }); + if(process.env.RIEKE_E2E_H5)await check('Restart to update defers an actual importer while the current app remains usable',async()=>{ + await page.keyboard.press('Escape');await fs.mkdir(fixture.projects,{recursive:true});await page.getByRole('button',{name:/Start a brand new project/}).click();const form=page.locator('.onboarding-create-form');await form.getByRole('textbox').first().fill('Testing update writer fixture'); + await application.evaluate(({dialog},directory)=>{dialog.showOpenDialog=async()=>({canceled:false,filePaths:[directory]});},fixture.projects); + await form.getByRole('button',{name:'Browse: New project folder',exact:true}).click();const picker=page.getByRole('dialog',{name:'New project folder',exact:true});await picker.getByRole('checkbox',{name:'Create a new folder inside this location'}).check();await picker.getByRole('textbox',{name:'New folder name',exact:true}).fill('writer');await picker.getByRole('button',{name:'Use new folder',exact:true}).click();await page.getByRole('button',{name:'Create & open',exact:true}).click();await page.getByRole('button',{name:'Project overview',exact:true}).waitFor({timeout:90000}); + const author=page.getByRole('dialog',{name:'Tag author',exact:true});if(await author.waitFor({state:'visible',timeout:3000}).then(()=>true,()=>false)){await author.getByRole('textbox').fill('Update E2E');await author.getByRole('button',{name:'Create profile',exact:true}).click();} + const source=path.join(fixture.home,'writer.h5');await fs.copyFile(path.resolve(process.env.RIEKE_E2E_H5),source); + const job=await page.evaluate(async source=>{const response=await fetch('/api/imports',{method:'POST',headers:{'content-type':'application/json','X-Workspace-Request':'1'},body:JSON.stringify({source_path:source})});if(!response.ok)throw new Error(await response.text());return response.json();},source); + const before=await ownedControl(fixture,'health');await page.getByRole('button',{name:/^Release \/ Publish/}).first().click();const dialog=page.getByRole('dialog',{name:'Release / Publish',exact:true});await dialog.getByRole('button',{name:'Restart to update',exact:true}).click();await dialog.getByRole('alert').waitFor({timeout:30000}); + assert.match(await dialog.getByRole('alert').innerText(),/import|work|busy|writer/i);assert.equal(page.isClosed(),false);assert.equal((await ownedControl(fixture,'health')).pid,before.pid);assert.equal((await page.evaluate(()=>window.riekeDesktop.status())).state,'Ready'); + let done;for(let n=0;n<240;n++){done=await page.evaluate(async id=>(await fetch('/api/jobs').then(r=>r.json())).jobs.find(j=>j.job_uuid===id),job.job_uuid);if(['complete','completed','failed','cancelled'].includes(done?.status))break;await delay(500);}assert.ok(['complete','completed'].includes(done?.status));await page.keyboard.press('Escape');return {busy_restart_deferred:true,root_preserved:true,current_app_usable:true,real_import_completed:true}; + }); + await check('ordinary Quit with a prepared testing update leaves the current complete app installed',async()=>{ + await page.keyboard.press('Escape');assert.equal((await page.evaluate(()=>window.riekeDesktop.status())).state,'Ready');await gracefulQuit(application,page);application=null; + const after=JSON.parse(await fs.readFile(manifestFile));assert.equal(after.application_version,'0.1.2');await verifyResources(runtime,manifest.resources); + assert.equal(await fs.stat(path.join(path.dirname(fixture.bundle),'.Rieke OS.previous.app')).then(()=>true,()=>false),false);const cache=path.join(fixture.userData,'updates','unsigned-testing');const entries=await fs.readdir(cache).catch(()=>[]);assert.ok(!entries.some(name=>/^install-.*\.json$/.test(name)));return {ordinary_quit_did_not_install:true,current_version:'0.1.2',runtime_immutable:true,native_orderly_exit:true}; + }); + assert.equal(receipt.failures.length,0);await write();await new Promise(resolve=>server.close(resolve));server=null;console.log('GitHub update UI receipt: '+output); +} +main().catch(async error=>{console.error(error.stack);receipt.failures.push({name:'github-update-suite',message:error.message});await write();server?.close();process.exitCode=1;}); diff --git a/desktop/e2e/helpers.cjs b/desktop/e2e/helpers.cjs new file mode 100644 index 0000000..27577e3 --- /dev/null +++ b/desktop/e2e/helpers.cjs @@ -0,0 +1,54 @@ +'use strict'; +const fs = require('node:fs/promises'); +const path = require('node:path'); +const os = require('node:os'); +const {execFile} = require('node:child_process'); +const {promisify} = require('node:util'); +const {_electron} = require('playwright'); +const run = promisify(execFile); +async function createFixture({reuse = true} = {}) { + if (reuse && process.env.RIEKE_E2E_FIXTURE_ROOT) { + const root = await fs.realpath(process.env.RIEKE_E2E_FIXTURE_ROOT); + if (!root.startsWith(await fs.realpath(os.tmpdir()) + path.sep) || !path.basename(root).startsWith('rieke-packaged-ui-e2e-')) throw new Error('Reusable fixture must be an owned isolated test directory'); + const home = path.join(root, 'home'), bundle = path.join(home, 'Applications', 'Rieke OS.app'); + if ((await fs.stat(root)).uid !== process.getuid()) throw new Error('Test directory owner mismatch'); + return {root, home, bundle, userData: path.join(home, 'state'), executable: path.join(bundle, 'Contents/MacOS/Rieke OS'), projects: path.join(home, 'projects')}; + } + const root = await fs.realpath(await fs.mkdtemp(path.join(os.tmpdir(), 'rieke-packaged-ui-e2e-'))); + const home = path.join(root, 'home'); + const bundle = path.join(home, 'Applications', 'Rieke OS.app'); + const userData = path.join(home, 'state'); + await fs.mkdir(path.dirname(bundle), {recursive: true}); await fs.mkdir(userData, {recursive: true}); + await run('/usr/bin/ditto', [path.resolve(__dirname, '../dist/mac-arm64/Rieke OS.app'), bundle]); + return {root, home, bundle, userData, executable: path.join(bundle, 'Contents/MacOS/Rieke OS'), projects: path.join(home, 'projects')}; +} +async function launch(fixture) { + const application = await _electron.launch({executablePath: fixture.executable, args: [`--user-data-dir=${fixture.userData}`], + env: {...process.env, HOME: fixture.home, TMPDIR: fixture.root, XDG_CONFIG_HOME: fixture.userData}, + chromiumSandbox: true, bypassCSP: false, timeout: 45000}); + fixture.activeApplication = application; + const actual = await application.evaluate(({app}) => ({home: process.env.HOME, userData: app.getPath('userData'), + appPath: app.getAppPath(), packaged: app.isPackaged, pid: process.pid, electronVersion: process.versions.electron})); + if (actual.home !== fixture.home || actual.userData !== fixture.userData || !actual.appPath.startsWith(fixture.bundle + '/')) + throw new Error('Application state is not isolated; no UI interactions are permitted'); + const page = await application.firstWindow({timeout: 45000}); + return {application, page, actual}; +} +async function gracefulQuit(application, page) { + const exited = new Promise(resolve => application.process().once('exit', resolve)); + await page.evaluate(() => { void window.riekeDesktop.quit(); }); + const code = await Promise.race([exited, new Promise((_resolve, reject) => setTimeout(() => reject(new Error('App did not acknowledge orderly exit')), 45000).unref())]); + if (code !== 0) throw new Error('App exited without a successful orderly shutdown'); +} +async function ownedControl(fixture, endpoint, body) { + const record = JSON.parse(await fs.readFile(path.join(fixture.userData, 'desktop-service.json'), 'utf8')); + if (!record.executable.startsWith(fixture.bundle + '/')) throw new Error('Service does not belong to this test bundle'); + const command = await run('/bin/ps', ['eww', '-p', String(record.pid), '-o', 'command=']); + const capability = command.stdout.match(/(?:^|\s)RIEKE_DESKTOP_CAPABILITY=([a-f0-9]{64})(?:\s|$)/)?.[1]; + if (!capability) throw new Error('No capability for the owned test service'); + const response = await fetch(`http://127.0.0.1:${record.port}/api/desktop/${endpoint}`, {method: body === undefined ? 'GET' : 'POST', + headers: {'X-Rieke-Desktop-Capability': capability, 'X-Workspace-Request': '1', 'Content-Type': 'application/json'}, + ...(body === undefined ? {} : {body: JSON.stringify(body)}), signal: AbortSignal.timeout(35000)}); + const value = await response.json(); if (!response.ok) throw new Error(value.error || 'Owned test control failed'); return value; +} +module.exports = {createFixture, launch, gracefulQuit, ownedControl, run}; diff --git a/desktop/e2e/packaged.e2e.cjs b/desktop/e2e/packaged.e2e.cjs new file mode 100644 index 0000000..f7ebef1 --- /dev/null +++ b/desktop/e2e/packaged.e2e.cjs @@ -0,0 +1,410 @@ +'use strict'; +const assert = require('node:assert/strict'); +const fs = require('node:fs/promises'); +const path = require('node:path'); +const http = require('node:http'); +const {spawn} = require('node:child_process'); +const {createHash, randomUUID} = require('node:crypto'); +const {chromium} = require('playwright'); +const {createFixture, launch, gracefulQuit, ownedControl, run} = require('./helpers.cjs'); +const {verifyResources} = require('../updater-validation.cjs'); +const delay = ms => new Promise(resolve => setTimeout(resolve, ms)); +const output = path.resolve(__dirname, '../../docs/dev/desktop-ui-e2e'); +let fixture, application, page, recoveredBrowser, deliberateCrash = false; +const receipt = {format: 'rieke-packaged-ui-e2e', version: 1, signed_qualification: false, checks: [], failures: [], + method: 'Playwright Electron 1.63.0; exact packaged app clone; isolated HOME and standard --user-data-dir; sandbox enabled and CSP intact; native chooser return values stubbed only'}; +receipt.run_id = randomUUID().slice(0, 8); +const projectName = 'Electron lifecycle fixture ' + receipt.run_id; +process.on('uncaughtException', error => { + // Pinned Playwright throws this client assertion when Electron recovers the + // same target after forcefullyCrashRenderer. The app is inspected through + // its actual owned WebContents API during that fault, instead of its stale + // Playwright Page session. Other unexpected exceptions still fail the run. + if (deliberateCrash && error.message === 'Target crashed') {receipt.playwright_crash_session_warnings = (receipt.playwright_crash_session_warnings || 0) + 1; return;} + throw error; +}); +async function chooseTestProfile() { + const dialog = page.getByRole('dialog', {name: 'Tag author', exact: true}); + const visible = await dialog.waitFor({state: 'visible', timeout: 3000}).then(() => true).catch(() => false); + if (visible) { + const existing = dialog.getByRole('button', {name: 'Electron E2E', exact: true}); + if (await existing.count()) await existing.first().click(); + else {await dialog.getByRole('textbox').fill('Electron E2E'); await dialog.getByRole('button', {name: 'Create profile', exact: true}).click();} + await dialog.waitFor({state: 'hidden'}); + } +} +async function chooseNewProjectFolder(form, name) { + const selected = form.locator('#new-project-directory'); + assert.equal(await selected.getAttribute('readonly'), ''); + await application.evaluate(({dialog}, directory) => {dialog.showOpenDialog = async () => ({canceled:false,filePaths:[directory]});}, fixture.projects); + await form.getByRole('button', {name:'Browse: New project folder',exact:true}).click(); + const picker = page.getByRole('dialog', {name:'New project folder',exact:true}); + await picker.getByRole('checkbox', {name:'Create a new folder inside this location'}).check(); + await picker.getByRole('textbox', {name:'New folder name',exact:true}).fill(name); + await picker.getByRole('button', {name:'Use new folder',exact:true}).click(); + await picker.waitFor({state:'hidden'}); + assert.equal(await selected.inputValue(), path.join(fixture.projects,name)); +} +async function verifyHeaderIcon(selector, headerSelector, screenName) { + const measurements = []; + try { + for (const width of [1440, 960]) { + await application.evaluate(({BrowserWindow}, width) => BrowserWindow.getAllWindows()[0].setContentSize(width, 900), width); + await page.waitForFunction(({selector, width}) => { + const icon = document.querySelector(selector); + return window.innerWidth === width && icon?.complete && icon.naturalWidth > 0; + }, {selector, width}, {timeout: 15000}); + const geometry = await page.evaluate(({selector, headerSelector}) => { + const icon = document.querySelector(selector), header = document.querySelector(headerSelector); + const bounds = node => {const r = node.getBoundingClientRect(); return {left:r.left, right:r.right, top:r.top, bottom:r.bottom, width:r.width, height:r.height};}; + const others = [...header.children].filter(node => node !== icon && !node.classList.contains('spacer') && node.getClientRects().length && getComputedStyle(node).visibility !== 'hidden') + .map(node => ({tag: node.tagName, className: node.className, rect: bounds(node)})).filter(node => node.rect.width > 0 && node.rect.height > 0); + return {viewport: window.innerWidth, source: new URL(icon.currentSrc).pathname, naturalWidth:icon.naturalWidth, naturalHeight:icon.naturalHeight, + icon:bounds(icon), header:bounds(header), others}; + }, {selector, headerSelector}); + await page.screenshot({path: path.join(output, `${screenName}-${width}.png`)}); + assert.equal(geometry.source, '/rieke-os-icon.png'); assert.ok(geometry.naturalWidth > 0); + const expectedSize = selector === '.onboarding-app-icon' ? 48 : 32; + assert.equal(geometry.icon.width, expectedSize); assert.equal(geometry.icon.height, expectedSize); + assert.ok(geometry.icon.left >= geometry.header.left && geometry.icon.right <= geometry.header.right + 1 && geometry.icon.right <= width + 1, + 'App icon must remain inside its header and viewport: ' + JSON.stringify(geometry)); + assert.ok(geometry.icon.left > (geometry.header.left + geometry.header.right) / 2, 'App icon must be on the right'); + for (const sibling of geometry.others) { + const r = sibling.rect, icon = geometry.icon; + assert.ok(!(r.left < icon.right - 1 && r.right > icon.left + 1 && r.top < icon.bottom - 1 && r.bottom > icon.top + 1), + 'App icon overlaps an adjacent header control: ' + JSON.stringify({width, sibling, icon})); + } + measurements.push({viewport: width, naturalWidth: geometry.naturalWidth, icon: geometry.icon, header: geometry.header}); + } + } finally {await application.evaluate(({BrowserWindow}) => BrowserWindow.getAllWindows()[0].setContentSize(1440, 900));} + return {actual_packaged_icon_loaded: true, header_right: true, no_icon_overlap: true, native_window_widths: measurements}; +} +async function writeReceipt() { await fs.mkdir(output, {recursive: true}); await fs.writeFile(path.join(output, 'receipt.json'), JSON.stringify(receipt, null, 2) + '\n'); } +async function check(name, fn) { + const start = Date.now(); + try { const evidence = await fn(); receipt.checks.push({name, passed: true, elapsed_ms: Date.now() - start, ...(evidence ? {evidence} : {})}); console.log('PASS ' + name); } + catch (error) { receipt.failures.push({name, message: error.message}); console.error('FAIL ' + name + ': ' + error.message); await writeReceipt(); throw error; } + await writeReceipt(); +} +async function start(heading = 'Your projects') { + const launched = await launch(fixture); ({application, page} = launched); + page.on('pageerror', error => receipt.failures.push({name: 'renderer-pageerror', message: error.message})); + await page.getByRole('heading', {name: heading, exact: true}).waitFor({timeout: 90000}); + return launched.actual; +} +async function main() { + fixture = await createFixture(); console.log('Isolated fixture: ' + fixture.root); + const runtime = path.join(fixture.bundle, 'Contents/Resources/runtime'); + const bytes = await fs.readFile(path.join(runtime, 'runtime-manifest.json')); const manifest = JSON.parse(bytes); + receipt.manifest_sha256 = createHash('sha256').update(bytes).digest('hex'); receipt.application_version = manifest.application_version; + receipt.app_asar_sha256 = createHash('sha256').update(await fs.readFile(path.join(fixture.bundle, 'Contents/Resources/app.asar'))).digest('hex'); + receipt.app_icon_sha256 = createHash('sha256').update(await fs.readFile(path.join(runtime, 'frontend/rieke-os-icon.png'))).digest('hex'); + assert.equal(receipt.app_icon_sha256, '614f7bcd44ced5ff8cf76f648e7a4e23ec45bee3236ea5ad17f59e3a1e173483', 'Packaged renderer must use the existing app icon'); + await check('cold packaged launcher and state isolation', async () => {const actual = await start(); assert.equal(actual.packaged, true); assert.equal(actual.electronVersion, '44.5.0'); return {isolated_user_state: true, packaged: true, electron_version: actual.electronVersion};}); + await check('launcher actual app icon loads at upper right at normal and narrow native widths', + () => verifyHeaderIcon('.onboarding-app-icon', '.project-onboarding>header', 'launcher-icon')); + await check('renderer isolation, sandbox and CSP', async () => { + const settings = await application.evaluate(({BrowserWindow}) => { + const prefs = BrowserWindow.getAllWindows()[0].webContents.getLastWebPreferences(); + return {contextIsolation: prefs.contextIsolation, sandbox: prefs.sandbox, nodeIntegration: prefs.nodeIntegration, webSecurity: prefs.webSecurity}; + }); + assert.deepEqual(settings, {contextIsolation: true, sandbox: true, nodeIntegration: false, webSecurity: true}); + assert.deepEqual(await page.evaluate(() => ({require: typeof require, process: typeof process, rawIpc: typeof window.riekeDesktop.ipcRenderer})), {require: 'undefined', process: 'undefined', rawIpc: 'undefined'}); + const inlineRan = await page.evaluate(() => { const script = document.createElement('script'); script.textContent = 'window.__inline_e2e=true'; document.body.append(script); return window.__inline_e2e === true; }); + assert.equal(inlineRan, false); return settings; + }); + await check('testing updates preserve explicit download, restart and bootstrap boundaries', async () => { + const status = await page.evaluate(() => window.riekeDesktop.status()); + if(status.channel==='unsigned-testing') { + assert.equal(status.manual_updates,true); + assert.ok(!['Downloading','Validating','Ready','Draining','Installing'].includes(status.state), 'Background checks must never download or install'); + const result=await page.evaluate(()=>window.riekeDesktop.restartToUpdate());assert.equal(result.ready,false); + } else assert.equal(status.state, 'Deferred'); + const message = await page.evaluate(async () => { try { await window.riekeDesktop.installAndOpen(); return ''; } catch (error) { return error.message; } }); + assert.match(message, /before backend startup/); + }); + await check('malformed draft IPC and external release URLs reject', async () => { + const results = await page.evaluate(async () => { + const actions = [() => window.riekeDesktop.saveDraft({projectId: '../../escape', value: {}}), + () => window.riekeDesktop.saveDraft({projectId: 'launcher', value: {}, path: '/outside'}), + () => window.riekeDesktop.loadDraft('../../escape'), () => window.riekeDesktop.openReleaseNotes('https://evil.example/'), + () => window.riekeDesktop.acknowledgeDrafts('foreign-request', {ok: true})]; + return Promise.all(actions.map(async action => {try {await action(); return false;} catch {return true;}})); + }); assert.deepEqual(results, [true, true, true, true, true]); + }); + await check('renderer cannot drain, stop or source-update services', async () => { + const statuses = await page.evaluate(async () => Promise.all(['/api/desktop/drain', '/api/desktop/stop', '/api/desktop/authorize-project'].map(async url => + (await fetch(url, {method: 'POST', headers: {'Content-Type': 'application/json', 'X-Workspace-Request': '1'}, body: '{}'})).status))); + assert.deepEqual(statuses, [403, 403, 403]); + const sourceStatuses = await page.evaluate(async () => Promise.all(['/api/app/updates', '/api/app/updates/check', '/api/app/updates/stage', '/api/app/updates/download'] + .map(async url => (await fetch(url)).status))); + assert.deepEqual(sourceStatuses, [409, 409, 409, 409]); + }); + await check('scientific project creation cannot write into packaged resources or redirected parents', async () => { + const direct = path.join(fixture.bundle, 'Contents/Resources/forbidden-project'); + const alias = path.join(fixture.root, 'resource-parent-alias-' + receipt.run_id); + await fs.symlink(path.join(fixture.bundle, 'Contents/Resources'), alias); + for (const directory of [direct, path.join(alias, 'forbidden-project'), + path.join(fixture.bundle, 'forbidden-project'), path.join(fixture.bundle, 'Contents/MacOS/forbidden-project')]) { + const result = await page.evaluate(async project_directory => { + const response = await fetch('/api/projects', {method: 'POST', headers: {'Content-Type': 'application/json', 'X-Workspace-Request': '1'}, body: JSON.stringify({name: 'Must not be created', project_directory})}); + return {status: response.status, value: await response.json()}; + }, directory); + assert.equal(result.status, 400); assert.ok(result.value.error); + await assert.rejects(fs.stat(directory), {code: 'ENOENT'}); + } + }); + await check('foreign navigation, popups and cross-origin requests blocked', async () => { + let visits = 0; const server = http.createServer((_request, response) => {visits++; response.end('foreign');}); + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); const target = `http://127.0.0.1:${server.address().port}/`; + const previous = page.url(); + try { + await page.evaluate(url => {window.open(url); window.location.assign(url);}, target); await delay(600); + assert.equal(page.url(), previous); assert.equal(application.windows().length, 1); assert.equal(visits, 0); + const blocked = await page.evaluate(async url => {try {await fetch(url); return false;} catch {return true;}}, target); assert.equal(blocked, true); + await page.evaluate(url => {const frame = document.createElement('iframe'); frame.src = url; document.body.append(frame);}, target); await delay(100); assert.equal(visits, 0); + await page.evaluate(() => document.querySelectorAll('iframe').forEach(frame => frame.remove())); + // Chromium reports the deliberately denied navigation to CDP before + // Electron cancels it. Reset this test-created pending-navigation state. + await application.evaluate(({BrowserWindow}) => BrowserWindow.getAllWindows()[0].webContents.reload()); + await page.getByRole('heading', {name: 'Your projects', exact: true}).waitFor({timeout: 15000}); + } finally { await new Promise(resolve => server.close(resolve)); } + }); + await check('foreign renderer IPC cannot access desktop controls', async () => { + const preload = path.join(fixture.root, 'foreign-preload.cjs'); + await fs.writeFile(preload, "const {contextBridge,ipcRenderer}=require('electron');contextBridge.exposeInMainWorld('foreignProbe',{request:()=>ipcRenderer.invoke('desktop:status').then(()=>({accepted:true}),e=>({accepted:false,message:e.message}))});"); + const result = await application.evaluate(async ({BrowserWindow}, preload) => { + const foreign = new BrowserWindow({show: false, webPreferences: {sandbox: true, contextIsolation: true, nodeIntegration: false, preload}}); + try {await foreign.loadURL('data:text/html,

Foreign test renderer

'); return await foreign.webContents.executeJavaScript('window.foreignProbe.request()');} + finally {foreign.destroy();} + }, preload); + assert.equal(result.accepted, false); assert.match(result.message, /Unauthorized desktop frame/); + }); + await check('native project-folder chooser uses typed result', async () => { + await fs.mkdir(fixture.projects, {recursive: true}); + await application.evaluate(({dialog}, directory) => {dialog.showOpenDialog = async () => ({canceled: false, filePaths: [directory]});}, fixture.projects); + assert.equal(await page.evaluate(() => window.riekeDesktop.chooseProjectFolder()), fixture.projects); + await application.evaluate(({dialog}) => {dialog.showOpenDialog = async () => ({canceled: true, filePaths: []});}); + assert.equal(await page.evaluate(() => window.riekeDesktop.chooseProjectFolder()), null); + }); + await check('duplicate launch preserves one owner and existing backend', async () => { + const before = await ownedControl(fixture, 'health'); + const child = spawn(fixture.executable, [`--user-data-dir=${fixture.userData}`], {env: {...process.env, HOME: fixture.home, TMPDIR: fixture.root}, stdio: 'ignore'}); + const code = await Promise.race([new Promise(resolve => child.once('exit', resolve)), delay(10000).then(() => {throw new Error('Duplicate app did not exit');})]); + assert.equal(code, 0); assert.equal((await ownedControl(fixture, 'health')).pid, before.pid); assert.equal(application.windows().length, 1); + }); + await check('corrupted saved view is visible, blocks overwrite and supports preserved quit or explicit reset', async () => { + await gracefulQuit(application, page); application = null; page = null; + const filename = path.join(fixture.userData, 'drafts', 'launcher.json'); + const valid = JSON.parse(await fs.readFile(filename, 'utf8')); + const corrupted = '{intentional unreadable saved-view fixture'; await fs.writeFile(filename, corrupted); + await start('Saved view needs recovery'); + assert.ok((await page.getByRole('alert').innerText()).includes('saved view')); + await delay(3300); assert.equal(await fs.readFile(filename, 'utf8'), corrupted); + assert.equal(await page.evaluate(async value => {try {await window.riekeDesktop.saveDraft({projectId: 'launcher', value}); return false;} catch {return true;}}, valid), true); + assert.equal((await page.evaluate(() => window.riekeDesktop.quit())).ready, false); + await page.screenshot({path: path.join(output, 'corrupted-view-recovery.png')}); + const exited = new Promise(resolve => application.process().once('exit', resolve)); + await page.getByRole('button', {name: 'Keep saved view and quit', exact: true}).click(); + assert.equal(await exited, 0); application = null; page = null; + assert.equal(await fs.readFile(filename, 'utf8'), corrupted); + await start('Saved view needs recovery'); + await page.getByRole('button', {name: 'Start with a new view', exact: true}).click(); + await page.getByRole('heading', {name: 'Your projects', exact: true}).waitFor(); + const backups = (await fs.readdir(path.dirname(filename))).filter(name => name.startsWith('launcher.corrupt-')); + assert.ok((await Promise.all(backups.map(name => fs.readFile(path.join(path.dirname(filename), name), 'utf8')))).includes(corrupted)); + assert.equal(await page.evaluate(async () => {try {await window.riekeDesktop.resetDraft('launcher'); return false;} catch {return true;}}), true); + return {visible_recovery: true, corrupt_bytes_preserved: true, ordinary_quit_deferred: true, preserved_quit_acknowledged: true, explicit_reset_preserved_backup: true}; + }); + await check('create and open project through actual React interface', async () => { + await page.getByRole('button', {name: /Start a brand new project/}).click(); + const form = page.locator('.onboarding-create-form'); + await form.getByRole('textbox').nth(0).fill(projectName); + const folderBeforeCancel=await form.locator('#new-project-directory').inputValue(); + await application.evaluate(({dialog})=>{dialog.showOpenDialog=async()=>({canceled:true,filePaths:[]});}); + await form.getByRole('button',{name:'Browse: New project folder',exact:true}).click(); + await form.getByRole('button',{name:'Browse: New project folder',exact:true}).waitFor({state:'visible'}); + await page.waitForFunction(()=>!document.querySelector('.folder-path-control button')?.disabled); + assert.equal(await form.locator('#new-project-directory').inputValue(),folderBeforeCancel); + assert.equal(await page.getByRole('dialog',{name:'New project folder',exact:true}).count(),0); + assert.equal(await fs.stat(path.join(fixture.projects,receipt.run_id)).then(()=>true,()=>false),false); + assert.equal(await form.getByRole('button',{name:'Create & open',exact:true}).isDisabled(),true); + await chooseNewProjectFolder(form, receipt.run_id); + await page.getByRole('button', {name: 'Create & open', exact: true}).click(); + await page.getByRole('button', {name: 'Project overview', exact: true}).waitFor({timeout: 90000}); + assert.match(await page.title(), /Electron lifecycle fixture/); + const project = await page.evaluate(() => fetch('/api/projects').then(response => response.json())); + receipt.test_project_uuid = project.current_project_uuid; assert.ok(project.current_project_uuid); + await chooseTestProfile(); + await page.screenshot({path: path.join(output, 'project.png')}); + }); + await check('workspace actual app icon loads at upper right without overlap at normal and narrow native widths', + () => verifyHeaderIcon('.header-app-icon', '.app-header', 'workspace-icon')); + await check('rapid warm project navigation persists the current view before document replacement', async () => { + const secondName = projectName + ' second'; + await page.locator('.sidebar').getByRole('button', {name: /Start a brand new project/}).click(); + const form = page.locator('.onboarding-create-form'); await form.getByRole('textbox').nth(0).fill(secondName); + await chooseNewProjectFolder(form, receipt.run_id + '-second'); + await page.getByRole('button', {name: 'Create & open', exact: true}).click(); + await page.waitForFunction(expected => document.title.startsWith(expected), secondName, {timeout: 90000}); await chooseTestProfile(); + receipt.second_project_uuid = (await page.evaluate(() => fetch('/api/projects').then(response => response.json()))).current_project_uuid; + assert.ok(receipt.second_project_uuid); + await page.getByRole('navigation', {name: 'Research projects'}).getByRole('button', {name: projectName, exact: true}).click(); + await page.waitForFunction(expected => document.title.startsWith(expected) && !document.title.includes(' second'), projectName, {timeout: 30000}); + const navigationStart = Date.now(); + await page.getByRole('button', {name: 'Activity & logs', exact: true}).click(); + await page.getByRole('navigation', {name: 'Research projects'}).getByRole('button', {name: secondName, exact: true}).click(); + await page.waitForFunction(expected => document.title.startsWith(expected), secondName, {timeout: 30000}); + const saved = JSON.parse(await fs.readFile(path.join(fixture.userData, 'drafts', receipt.test_project_uuid + '.json'))); + assert.equal(saved.value.route.page, 'activity'); + await page.getByRole('navigation', {name: 'Research projects'}).getByRole('button', {name: projectName, exact: true}).click(); + await page.waitForFunction(expected => document.title.startsWith(expected) && !document.title.includes(' second'), projectName, {timeout: 30000}); + await page.waitForFunction(() => [...document.querySelectorAll('.nav-item.active')].some(item => item.textContent.includes('Activity & logs'))); + return {warm_document_handoff: true, route_persisted: 'activity', elapsed_ms: Date.now() - navigationStart}; + }); + await check('missing saved view opens normally without corrupt-draft recovery', async () => { + const missing = path.join(fixture.userData, 'drafts', receipt.second_project_uuid + '.json'); + await fs.unlink(missing); + const secondName = projectName + ' second'; + await page.getByRole('navigation', {name: 'Research projects'}).getByRole('button', {name: secondName, exact: true}).click(); + await page.waitForFunction(expected => document.title.startsWith(expected), secondName, {timeout: 30000}); + await page.waitForFunction(() => [...document.querySelectorAll('.nav-item.active')].some(item => item.textContent.includes('Project overview'))); + assert.equal(await page.getByRole('heading', {name: 'Saved view needs recovery', exact: true}).count(), 0); + await page.getByRole('navigation', {name: 'Research projects'}).getByRole('button', {name: projectName, exact: true}).click(); + await page.waitForFunction(expected => document.title.startsWith(expected) && !document.title.includes(' second'), projectName, {timeout: 30000}); + return {missing_draft_treated_as_new_view: true}; + }); + if (process.env.RIEKE_E2E_H5) await check('actual active import defers close without stopping any writer', async () => { + const copied = path.join(fixture.root, 'scientific-fixture.h5'); await fs.copyFile(process.env.RIEKE_E2E_H5, copied); + const job = await page.evaluate(async source_path => { + const response = await fetch('/api/imports', {method: 'POST', headers: {'Content-Type': 'application/json', 'X-Workspace-Request': '1'}, body: JSON.stringify({source_path})}); + const value = await response.json(); if (response.status !== 202) throw new Error(value.error || 'Import was not accepted'); return value; + }, copied); + const before = await ownedControl(fixture, 'health'); + let status; + for (let index = 0; index < 80; index++) { + status = await page.evaluate(async uuid => (await fetch('/api/jobs').then(response => response.json())).jobs.find(job => job.job_uuid === uuid), job.job_uuid); + if (status && !['queued', 'waiting'].includes(status.status)) break; + await delay(250); + } + assert.ok(status && !['complete', 'completed', 'failed', 'cancelled'].includes(status.status)); + const result = await page.evaluate(() => window.riekeDesktop.quit()); assert.equal(result.ready, false); + assert.equal((await ownedControl(fixture, 'health')).pid, before.pid); assert.equal(page.isClosed(), false); + await application.evaluate(({BrowserWindow}) => BrowserWindow.getAllWindows()[0].close()); + await delay(500); + assert.equal(page.isClosed(), false); assert.equal((await ownedControl(fixture, 'health')).pid, before.pid); + for (let index = 0; index < 240; index++) { + status = await page.evaluate(async uuid => (await fetch('/api/jobs').then(response => response.json())).jobs.find(job => job.job_uuid === uuid), job.job_uuid); + if (['complete', 'completed', 'failed', 'cancelled'].includes(status?.status)) break; + await delay(500); + } + assert.ok(['complete', 'completed'].includes(status?.status), 'Import must finish successfully before test shutdown'); + // Completion is observed by the UI on its own polling cycle. Close its + // automatic review explicitly after it appears, rather than sending Escape + // before the dialog has been mounted. + const review=page.getByRole('dialog',{name:'Review imported data',exact:true}); + if(await review.waitFor({state:'visible',timeout:10000}).then(()=>true,()=>false)) { + await review.getByRole('button',{name:'Close import review',exact:true}).click(); + await review.waitFor({state:'hidden'}); + } + await page.keyboard.press('Escape'); + return {real_import: true, bridge_quit_deferred: true, native_window_close_deferred: true, root_pid_preserved: true, completed: true}; + }); + if(process.env.RIEKE_E2E_H5) await check('real protocol inspection uses combined epoch and cell pages with registered metadata and a plotted response',async()=>{ + await page.keyboard.press('Escape'); + const overview=await page.evaluate(()=>fetch('/api/overview').then(response=>response.json())); + const protocol=overview.protocols?.[0];assert.ok(protocol?.protocol_uuid,'Imported protocols must be available'); + let combined=null,inspectedProtocolUuid=null;const pending=[]; + const observe=response=>{ + const url=new URL(response.url()); + if(/^\/api\/protocols\/[^/]+\/epochs$/.test(url.pathname)&&url.searchParams.get('include_cells')==='true'&&response.status()===200) + pending.push(response.json().then(value=>{combined=value;inspectedProtocolUuid=url.pathname.split('/')[3];})); + }; + page.on('response',observe); + try{ + await page.getByRole('button',{name:'Project overview',exact:true}).click(); + await page.locator('.ov-protocol-row:visible').first().click({timeout:90000}); + await page.getByRole('button',{name:'Open inspection',exact:true}).click(); + const tree=page.locator('.inspection-cell-tree');await tree.waitFor({state:'visible',timeout:90000}); + await tree.locator('.cell-tree-date>summary').first().click(); + await tree.locator('.cell-tree-cell>summary').first().click(); + await tree.getByRole('button',{name:/^Inspect .* epoch 1$/}).first().click(); + await page.getByRole('region',{name:'Recorded response viewer',exact:true}).waitFor({timeout:90000}); + await page.waitForFunction(()=>{const canvas=document.querySelector('.tv-base');return canvas?.width>0&&!document.querySelector('.tv-loading')&&!document.querySelector('.tv-error');},undefined,{timeout:90000}); + const details=page.getByRole('button',{name:'Details',exact:true}); + if(await details.getAttribute('aria-pressed')!=='true')await details.click(); + await page.getByRole('heading',{name:'Epoch details',exact:true}).waitFor(); + await page.getByRole('button',{name:'All fields',exact:true}).click(); + assert.ok(await page.locator('.metadata-panel-section').count()>0); + const fields=await page.evaluate(()=>fetch('/api/metadata/fields').then(response=>response.json())); + assert.ok(Array.isArray(fields.fields)&&fields.fields.length>0,'Registered metadata fields must match the bundled frontend'); + await Promise.all(pending);assert.ok(combined?.epochs?.length>0&&combined?.cells?.length>0,'Actual UI must receive combined epochs and cells'); + assert.ok(combined.query_revision);assert.ok(Number.isSafeInteger(combined.expected_binding_version)); + assert.ok(!await page.getByText('Predicate field catalog unavailable.',{exact:false}).count()); + return {real_epoch_inspection:true,trace_canvas_loaded:true,combined_epoch_count:combined.epochs.length,combined_cell_count:combined.cells.length, + metadata_field_count:fields.fields.length,metadata_panel_visible:true,protocol_uuid:inspectedProtocolUuid}; + }finally{page.off('response',observe);} + }); + await check('durable real renderer draft survives orderly close and cold restart', async () => { + await page.getByRole('button', {name: 'Project files', exact: true}).click(); + await gracefulQuit(application, page); application = null; page = null; + const saved = JSON.parse(await fs.readFile(path.join(fixture.userData, 'drafts', receipt.test_project_uuid + '.json'))); + assert.equal(saved.format, 'rieke-renderer-draft'); assert.equal(saved.value.route.page, 'files'); + await start(); await page.getByRole('button', {name: new RegExp('^Open ' + projectName + ',')}).click(); + await page.getByRole('button', {name: 'Project files', exact: true}).waitFor({timeout: 90000}); + await chooseTestProfile(); + await page.waitForFunction(() => [...document.querySelectorAll('.nav-item.active')].some(item => item.textContent.includes('Project files')), undefined, {timeout: 10000}); + }); + await check('project draft identity mismatch requires visible preserved recovery', async () => { + await gracefulQuit(application, page); application = null; page = null; + const filename = path.join(fixture.userData, 'drafts', receipt.test_project_uuid + '.json'); + const saved = JSON.parse(await fs.readFile(filename, 'utf8')); + const corrupted = JSON.stringify({...saved, projectId: 'launcher'}); await fs.writeFile(filename, corrupted); + await start(); await page.getByRole('button', {name: new RegExp('^Open ' + projectName + ',')}).click(); + await page.getByRole('heading', {name: 'Saved view needs recovery', exact: true}).waitFor({timeout: 90000}); + assert.equal((await page.evaluate(() => window.riekeDesktop.quit())).ready, false); + assert.equal(await fs.readFile(filename, 'utf8'), corrupted); + await page.getByRole('button', {name: 'Start with a new view', exact: true}).click(); + await page.getByRole('button', {name: 'Project overview', exact: true}).waitFor({timeout: 30000}); + await chooseTestProfile(); + const backups = (await fs.readdir(path.dirname(filename))).filter(name => name.startsWith(receipt.test_project_uuid + '.corrupt-')); + assert.ok((await Promise.all(backups.map(name => fs.readFile(path.join(path.dirname(filename), name), 'utf8')))).includes(corrupted)); + return {project_identity_validated: true, mismatched_bytes_preserved: true, explicit_reset: true, + preserved_sha256: createHash('sha256').update(corrupted).digest('hex')}; + }); + await check('renderer crash enters recovery, preserves backend and requires recovery before quit', async () => { + const before = await ownedControl(fixture, 'health'); + deliberateCrash = true; + receipt.crash_test_method = 'Actual renderer crash; original stale Playwright target replaced by fresh CDP connection to the same isolated app; real recovery UI, bridge and backend health assertions'; + await application.evaluate(({BrowserWindow}) => {const target = BrowserWindow.getAllWindows()[0]; setTimeout(() => target.webContents.forcefullyCrashRenderer(), 100);}); + await delay(300); + // Attach a fresh software-test session to this isolated app's existing CDP + // endpoint. Pinned Playwright cannot revive its original crashed Page. + const port = Number((await fs.readFile(path.join(fixture.userData, 'DevToolsActivePort'), 'utf8')).split('\n')[0]); + recoveredBrowser = await chromium.connectOverCDP(`http://127.0.0.1:${port}`); + page = recoveredBrowser.contexts()[0].pages()[0]; + page.on('pageerror', error => receipt.failures.push({name: 'recovered-renderer-pageerror', message: error.message})); + await page.getByRole('heading', {name: 'Rieke OS recovery', exact: true}).waitFor({timeout: 15000}); + assert.equal((await ownedControl(fixture, 'health')).pid, before.pid); + const result = await page.evaluate(() => window.riekeDesktop.quit()); assert.equal(result.ready, false); + await page.screenshot({path: path.join(output, 'renderer-recovery.png')}); + await page.getByRole('button', {name: 'Retry startup', exact: true}).click(); + await page.getByRole('heading', {name: 'Your projects', exact: true}).waitFor({timeout: 30000}); + assert.equal((await ownedControl(fixture, 'health')).pid, before.pid); + deliberateCrash = false; + }); + await check('final orderly quit and packaged resource immutability', async () => { + await gracefulQuit(application, page); application = null; page = null; + await assert.rejects(fs.stat(path.join(fixture.userData, 'desktop-service.json')), {code: 'ENOENT'}); + await verifyResources(runtime, manifest.resources); + assert.equal(createHash('sha256').update(await fs.readFile(path.join(runtime, 'runtime-manifest.json'))).digest('hex'), receipt.manifest_sha256); + assert.equal(receipt.failures.length, 0, 'Unexpected renderer errors: ' + receipt.failures.map(item => item.message).join('; ')); + }); + receipt.completed = true; await writeReceipt(); console.log('Packaged UI E2E completed'); +} +main().catch(async error => { + process.exitCode = 1; await writeReceipt(); + if (page) await page.screenshot({path: path.join(output, 'failure.png')}).catch(() => {}); + if (application && page) { try {await gracefulQuit(application, page);} catch {console.error('Isolated app retained because orderly closure was not acknowledged.');} } + console.error(error.message); +}); diff --git a/desktop/e2e/testing-upgrade.e2e.cjs b/desktop/e2e/testing-upgrade.e2e.cjs new file mode 100644 index 0000000..bae0fac --- /dev/null +++ b/desktop/e2e/testing-upgrade.e2e.cjs @@ -0,0 +1,139 @@ +'use strict'; +// Real packaged updater/helper; only GitHub transport and macOS open are mapped +// to owned test boundaries. The source app, distribution and user app are read-only. +const assert=require('node:assert/strict'),fs=require('node:fs/promises'),nativeFs=require('node:fs'),path=require('node:path'),http=require('node:http'); +const {spawn}=require('node:child_process'),{createHash}=require('node:crypto'),asar=require('@electron/asar'); +const {createFixture,launch,gracefulQuit,ownedControl,run}=require('./helpers.cjs'); +const {bundleDigest}=require('../bootstrap.cjs'); +const {verifyResources}=require('../updater-validation.cjs'); +const output=path.resolve(__dirname,'../../docs/dev/desktop-testing-upgrade-e2e.json'); +const receipt={format:'rieke-packaged-testing-native-upgrade-e2e',version:1,production_ready:false,checks:[],failures:[], + seams:['Official GitHub HTTPS transport mapped to owned loopback server serving exact final ZIP/descriptor.', + 'Native helper macOS open boundary recorded instead of OS launch; installed app then starts with real Electron/WSGI in isolated HOME/profile.'], + limits:['Synthetic version-only prior app, not an authentic previously published 0.1.2 desktop release.','Unsigned local host only; no signed update or clean-machine qualification.'],user_app_untouched:true}; +let fixture,server,application;const requests={api:0,descriptor:0,archive:0}; +const delay=ms=>new Promise(resolve=>setTimeout(resolve,ms)); +async function write(){await fs.mkdir(path.dirname(output),{recursive:true});await fs.writeFile(output,JSON.stringify({...receipt,requests},null,2)+'\n');} +async function check(name,fn){const start=Date.now();try{const evidence=await fn();receipt.checks.push({name,passed:true,elapsed_ms:Date.now()-start,evidence});console.log('PASS '+name);}catch(error){receipt.failures.push({name,message:error.message});await write();throw error;}await write();} +const WRAPPER=String.raw` +'use strict'; +const fs=require('node:fs'),path=require('node:path'),{promisify}=require('node:util'); +const realRun=promisify(require('node:child_process').execFile); +const config=JSON.parse(fs.readFileSync(process.argv[2],'utf8')); +const helper=require(path.join(config.bundle,'Contents/Resources/app.asar/testing-install.cjs')); +let opens=0; +helper.applyTestingInstall({receiptPath:process.argv[3],run:async(exe,args,options)=>{ + if(exe!=='/usr/bin/open')return realRun(exe,args,options); + opens++;fs.appendFileSync(config.openLog,JSON.stringify({phase:config.phase,args})+'\n',{mode:0o600}); + if(config.fail_first_open&&opens===1)throw new Error('Owned test simulates macOS refusing the candidate launch'); + return {stdout:'',stderr:''}; +}}).catch(error=>{fs.writeFileSync(process.argv[3]+'.result.json',JSON.stringify({state:'Deferred',error_type:error.name,message:error.message}));process.exitCode=1;}); +`; +const DRIVER=String.raw` +'use strict'; +const fs=require('node:fs'),path=require('node:path'),http=require('node:http'),{spawn}=require('node:child_process'); +const config=JSON.parse(fs.readFileSync(process.argv[2],'utf8')); +const manifest=JSON.parse(fs.readFileSync(path.join(config.bundle,'Contents/Resources/runtime/runtime-manifest.json'),'utf8')); +const packaged=path.join(config.bundle,'Contents/Resources/app.asar'); +const helper=require(path.join(packaged,'testing-install.cjs')); +const {createTestingUpdateCoordinator}=require(path.join(packaged,'testing-updater.cjs')); +const statuses=[];let coordinator,handoff,authorized=false; +const app={isPackaged:true,getPath:name=>name==='exe'?process.execPath:config.userData,quit(){ + coordinator?.stop();setTimeout(()=>{fs.writeFileSync(config.driverResult,JSON.stringify({phase:config.phase,authorized,statuses,handoff}),{mode:0o600});process.exit(0);},50); +}}; +const transport=url=>{ + const route=url==='https://api.github.com/repos/maxwellsdm1867/Rieke-OS/releases?per_page=100&page=1'?'/api': + url===config.descriptorURL?'/descriptor':url===config.archiveURL?'/archive':null; + if(!route)return Promise.reject(new Error('Unexpected official release URL')); + return new Promise((resolve,reject)=>http.get(config.base+route,response=>resolve({statusCode:response.statusCode,headers:response.headers,body:response})).on('error',reject)); +}; +const spawnHelper=(exe,args,options)=>spawn(exe,[config.wrapper,process.argv[2],args[2]],options); +(async()=>{ + const authorizeQuit=()=>{authorized=true;}; + if(config.phase==='restore'){ + handoff=await helper.restoreTestingPriorBundle({app,manifest,prepareQuit:async()=>({ready:true}),authorizeQuit,spawnHelper}); + }else{ + coordinator=createTestingUpdateCoordinator({app,manifest,distribution:require(path.join(packaged,'distribution.json')),transport, + publishStatus:status=>{if(statuses.at(-1)!==status.state)statuses.push(status.state);},prepareQuit:async()=>({ready:true}),authorizeQuit, + installHelper:async options=>{handoff=await helper.launchTestingInstall({...options,spawnHelper});return handoff;}}); + await coordinator.start();if(!['Available','Ready'].includes(coordinator.getStatus().state))throw new Error('Official fixture did not offer update'); + await coordinator.download();if(coordinator.getStatus().state!=='Ready')throw new Error('Real candidate validation did not become Ready'); + const result=await coordinator.installPrepared();if(!result.installing)throw new Error(result.reason||'Native install did not hand off'); + } +})().catch(error=>{coordinator?.stop();fs.writeFileSync(config.driverResult,JSON.stringify({error:error.message,statuses}),{mode:0o600});process.exitCode=1;}); +`; +async function versionPrior(){ + const runtime=path.join(fixture.bundle,'Contents/Resources/runtime'),file=path.join(runtime,'runtime-manifest.json'); + const manifest=JSON.parse(await fs.readFile(file));manifest.application_version='0.1.2'; + for(const name of Object.keys(manifest.resources).filter(name=>name.endsWith('/rieke-release.json'))){ + const target=path.join(runtime,name),release=JSON.parse(await fs.readFile(target));release.version='0.1.2';const data=Buffer.from(JSON.stringify(release,null,2)+'\n');await fs.writeFile(target,data); + manifest.resources[name]={...manifest.resources[name],sha256:createHash('sha256').update(data).digest('hex'),size:data.length}; + } + await fs.writeFile(file,JSON.stringify(manifest,null,2)+'\n'); + const archive=path.join(fixture.bundle,'Contents/Resources/app.asar'),directory=path.join(fixture.root,'prior-asar');asar.extractAll(archive,directory); + const packageFile=path.join(directory,'package.json'),pack=JSON.parse(await fs.readFile(packageFile));pack.version='0.1.2';await fs.writeFile(packageFile,JSON.stringify(pack,null,2)+'\n'); + await asar.createPackage(directory,archive);asar.uncacheAll(); + const plist=path.join(fixture.bundle,'Contents/Info.plist'); + for(const field of ['CFBundleShortVersionString','CFBundleVersion'])await run('/usr/libexec/PlistBuddy',['-c',`Set :${field} 0.1.2`,plist]); + await run('/usr/libexec/PlistBuddy',['-c',`Set :ElectronAsarIntegrity:Resources/app.asar:hash ${createHash('sha256').update(asar.getRawHeader(archive).headerString).digest('hex')}`,plist]); + await run('/usr/bin/codesign',['--force','--sign','-','--entitlements',path.resolve(__dirname,'../entitlements.mac.plist'),fixture.bundle]); + await run('/usr/bin/codesign',['--verify','--deep','--strict',fixture.bundle]);await verifyResources(runtime,manifest.resources); +} +async function phase(phase,config){ + const configFile=path.join(fixture.root,phase+'.json'),driverResult=path.join(fixture.root,phase+'-driver.json'); + await fs.writeFile(configFile,JSON.stringify({...config,phase,driverResult,fail_first_open:phase==='rollback'}),{mode:0o600}); + const log=await fs.open(path.join(fixture.root,phase+'.log'),'w'); + const child=spawn(fixture.executable,[config.driver,configFile],{cwd:fixture.root,env:{HOME:fixture.home,TMPDIR:fixture.root,PATH:'/usr/bin:/bin',LANG:'en_US.UTF-8',ELECTRON_RUN_AS_NODE:'1',PYTHONDONTWRITEBYTECODE:'1'},stdio:['ignore',log.fd,log.fd]}); + const exit=await new Promise((resolve,reject)=>{child.once('error',reject);child.once('exit',resolve);});await log.close(); + const driver=JSON.parse(await fs.readFile(driverResult));assert.equal(exit,0,JSON.stringify(driver));assert.equal(driver.authorized,true);assert.ok(driver.handoff?.resultPath); + let outcome;for(let n=0;n<600;n++){try{outcome=JSON.parse(await fs.readFile(driver.handoff.resultPath));break;}catch{await delay(500);}} + assert.ok(outcome,'Native helper result missing after exact current process exit'); + return {driver,outcome}; +} +async function startup(version){ + const launched=await launch(fixture);application=launched.application; + await launched.page.getByRole('heading',{name:'Your projects',exact:true}).waitFor({timeout:90000}); + const health=await ownedControl(fixture,'health');assert.equal(health.application_version,version); + await gracefulQuit(application,launched.page);application=null; + return{application_version:health.application_version,owned_wsgi_ready:true,real_electron_started:true,isolated_home_and_profile:true,orderly_shutdown:true}; +} +async function main(){ + fixture=await createFixture({reuse:false}); + const published=path.resolve(__dirname,'../dist/mac-arm64/Rieke OS.app'),zip=path.resolve(__dirname,'../dist/Rieke-OS-0.1.3-arm64.zip'); + const sourceManifest=await fs.readFile(path.join(published,'Contents/Resources/runtime/runtime-manifest.json')); + assert.equal(JSON.parse(sourceManifest).application_version,'0.1.3');receipt.runtime_manifest_sha256=createHash('sha256').update(sourceManifest).digest('hex'); + receipt.asar_sha256=createHash('sha256').update(await fs.readFile(path.join(published,'Contents/Resources/app.asar'))).digest('hex'); + const descriptorBytes=await fs.readFile(path.resolve(__dirname,'../dist/desktop-release.json')),descriptor=JSON.parse(descriptorBytes);receipt.archive_sha256=descriptor.archive.sha256; + await versionPrior();const priorDigest=await bundleDigest(fixture.bundle);receipt.prior_fixture_bundle_sha256=priorDigest; + const tag='desktop-test-v0.1.3',baseURL=`https://github.com/maxwellsdm1867/Rieke-OS/releases/download/${tag}/`; + const releases=Buffer.from(JSON.stringify([{draft:false,prerelease:true,tag_name:tag,assets:[{name:'desktop-release.json',size:descriptorBytes.length,browser_download_url:baseURL+'desktop-release.json'},{name:descriptor.archive.filename,size:descriptor.archive.size,browser_download_url:baseURL+descriptor.archive.filename}]}])); + server=http.createServer((request,response)=>{ + const resource=request.url==='/api'?releases:request.url==='/descriptor'?descriptorBytes:null; + if(resource){requests[request.url==='/api'?'api':'descriptor']++;response.writeHead(200,{'content-length':resource.length});response.end(resource);} + else if(request.url==='/archive'){requests.archive++;response.writeHead(200,{'content-length':descriptor.archive.size});nativeFs.createReadStream(zip).pipe(response);} + else{response.writeHead(404);response.end();} + });await new Promise(resolve=>server.listen(0,'127.0.0.1',resolve)); + const driver=path.join(fixture.root,'driver.cjs'),wrapper=path.join(fixture.root,'owned-open-wrapper.cjs'),openLog=path.join(fixture.root,'open.jsonl');await fs.writeFile(driver,DRIVER);await fs.writeFile(wrapper,WRAPPER); + const config={bundle:fixture.bundle,userData:fixture.userData,driver,wrapper,openLog,base:`http://127.0.0.1:${server.address().port}`,descriptorURL:baseURL+'desktop-release.json',archiveURL:baseURL+descriptor.archive.filename}; + await check('real ZIP updater validates and native helper waits current PID exit before complete 0.1.3 installation',async()=>{ + const {driver,outcome}=await phase('update',config);assert.equal(outcome.state,'Installed');assert.equal(outcome.version,'0.1.3'); + assert.equal(await bundleDigest(fixture.bundle),await bundleDigest(published));assert.equal(await bundleDigest(path.join(path.dirname(fixture.bundle),'.Rieke OS.previous.app')),priorDigest); + return{current_process_ready_handshake:true,authorized_only_after_helper_ready:true,exact_current_process_exited:true,complete_target_matches_final_bundle:true,previous_complete_bundle_retained:true,statuses:driver.statuses}; + }); + await check('actual updated Electron and WSGI start in preserved isolated profile and stop cleanly',()=>startup('0.1.3')); + await check('controlled Restore installs only verified retained prior bundle without archive download',async()=>{ + const before=requests.archive,{outcome}=await phase('restore',config);assert.equal(outcome.state,'Restored');assert.equal(outcome.version,'0.1.2');assert.equal(await bundleDigest(fixture.bundle),priorDigest);assert.equal(requests.archive,before); + return{verified_previous_restored:true,archive_download_not_required:true,profile_preserved:true}; + }); + await check('macOS launch refusal triggers complete previous-app rollback with profile unchanged',async()=>{ + const {outcome}=await phase('rollback',config);assert.equal(outcome.state,'Restored');assert.equal(outcome.version,'0.1.2');assert.equal(await bundleDigest(fixture.bundle),priorDigest); + return{candidate_launch_refusal_simulated_at_only_open_boundary:true,exact_previous_restored:true,failed_candidate_retained:true}; + }); + await check('restored Electron and WSGI still start and stop without dependency installation',()=>startup('0.1.2')); + const opens=(await fs.readFile(openLog,'utf8')).trim().split('\n').map(line=>JSON.parse(line)); + assert.ok(opens.every(entry=>entry.args.includes(fixture.bundle)&&entry.args.includes(`--user-data-dir=${fixture.userData}`)));receipt.open_boundary_calls=opens.length;receipt.profile_continuity_verified=true; + assert.equal(createHash('sha256').update(await fs.readFile(path.join(published,'Contents/Resources/runtime/runtime-manifest.json'))).digest('hex'),receipt.runtime_manifest_sha256); + assert.equal(createHash('sha256').update(await fs.readFile(path.join(published,'Contents/Resources/app.asar'))).digest('hex'),receipt.asar_sha256); + receipt.passed=true;await write();await new Promise(resolve=>server.close(resolve));server=null;await fs.rm(fixture.root,{recursive:true,force:true});console.log('Native testing upgrade receipt: '+output); +} +main().catch(async error=>{console.error(error.stack);receipt.failures.push({name:'native-testing-upgrade-suite',message:error.message});receipt.passed=false;await write();server?.close();if(fixture)console.error('Owned diagnostics retained: '+fixture.root);process.exitCode=1;}); diff --git a/desktop/e2e/toolbar-preview.cjs b/desktop/e2e/toolbar-preview.cjs new file mode 100644 index 0000000..7a113b9 --- /dev/null +++ b/desktop/e2e/toolbar-preview.cjs @@ -0,0 +1,50 @@ +'use strict'; +const assert = require('node:assert/strict'); +const fs = require('node:fs/promises'), path = require('node:path'); +const {createHash} = require('node:crypto'); +const {createFixture, launch, gracefulQuit} = require('./helpers.cjs'); +const {verifyResources} = require('../updater-validation.cjs'); +const output = path.resolve(__dirname, '../../docs/dev/desktop-ui-e2e'); +(async () => { + const fixture = await createFixture(); let application, page; + const manifestBytes = await fs.readFile(path.join(fixture.bundle, 'Contents/Resources/runtime/runtime-manifest.json')); + const manifest = JSON.parse(manifestBytes); + try { + ({application,page} = await launch(fixture)); + await page.getByRole('heading', {name:'Your projects', exact:true}).waitFor({timeout:90000}); + const previous = JSON.parse(await fs.readFile(path.join(output, 'before-toolbar-fit-fix.json'))); + await page.getByRole('button', {name:new RegExp('^Open Electron lifecycle fixture ' + previous.run_id + ',')}).click(); + await page.getByRole('button', {name:'Project overview',exact:true}).waitFor({timeout:90000}); + const profile = page.getByRole('dialog', {name:'Tag author',exact:true}); + if(await profile.waitFor({state:'visible',timeout:3000}).then(()=>true).catch(()=>false)) { + await profile.getByRole('button', {name:'Electron E2E',exact:true}).first().click(); await profile.waitFor({state:'hidden'}); + } + const source = await fs.readFile(path.resolve(__dirname,'../../workspace-app/src/styles.css'),'utf8'); + const marker = '/* Keep the app mark visible as the scientific toolbar gets narrower. */'; + assert.ok(source.includes(marker)); const css = source.slice(source.indexOf(marker)); + // The packaged CSP explicitly allows inline styles. This preview leaves + // that policy, the app bundle and all backend resources unchanged. + assert.ok(await page.evaluate(css => {const style=document.createElement('style');style.textContent=css;document.head.append(style);return style.sheet?.cssRules.length>0;},css)); + const measurements = []; + for(const width of [1440,960]) { + await application.evaluate(({BrowserWindow},width)=>BrowserWindow.getAllWindows()[0].setContentSize(width,900),width); + await page.waitForFunction(width=>innerWidth===width,width); + const geometry = await page.evaluate(()=>{ + const icon=document.querySelector('.header-app-icon'),header=document.querySelector('.app-header'); + const rect=node=>{const r=node.getBoundingClientRect();return {left:r.left,right:r.right,top:r.top,bottom:r.bottom};}; + return {width:innerWidth,naturalWidth:icon.naturalWidth,icon:rect(icon),header:rect(header),controls:[...header.children] + .filter(node=>node!==icon&&!node.classList.contains('spacer')&&node.getClientRects().length).map(node=>({className:node.className,...rect(node)}))}; + }); + await page.screenshot({path:path.join(output,`toolbar-preview-${width}.png`)}); + assert.ok(geometry.naturalWidth>0); assert.ok(geometry.icon.right<=geometry.header.right&&geometry.icon.right<=width); + for(const c of geometry.controls) assert.ok(!(c.leftgeometry.icon.left&&c.topgeometry.icon.top)); + measurements.push(geometry); + } + await gracefulQuit(application,page); application=null;page=null; + await verifyResources(path.join(fixture.bundle,'Contents/Resources/runtime'),manifest.resources); + const receipt={format:'rieke-toolbar-css-preview',version:1,passed:true,final_packaged_qualification:false, + method:'Exact prior disposable packaged fixture; DOM-only inline CSS allowed by existing CSP; no bundle or backend mutation', + source_manifest_sha256:createHash('sha256').update(manifestBytes).digest('hex'),preview_css_sha256:createHash('sha256').update(css).digest('hex'),measurements}; + await fs.writeFile(path.join(output,'toolbar-preview.json'),JSON.stringify(receipt,null,2)+'\n');console.log(JSON.stringify(receipt)); + } finally {if(application&&page) await gracefulQuit(application,page);} +})().catch(error=>{console.error(error.message);process.exitCode=1;}); diff --git a/desktop/entitlements.mac.plist b/desktop/entitlements.mac.plist new file mode 100644 index 0000000..bda591d --- /dev/null +++ b/desktop/entitlements.mac.plist @@ -0,0 +1,5 @@ + + + +com.apple.security.cs.allow-jit + diff --git a/desktop/icon.png b/desktop/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6685dbfcbefad0cc70c75020228a3f96b1d6edb7 GIT binary patch literal 1551104 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

p(2l4wgH&Gtz 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

4JwfMxgnoXTZjJXl1U7_!df?y8@lCVPGQL;e3 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

PROJECT RECORD

{kind==='exports'?'Project export log':'Activity & logs'}

{kind==='exports'?'Saved protocol and one-off search exports. Reuse opens the saved query for review; it never exports automatically.':'A persistent record of imports, tags, review decisions and exports.'}

{kind==='exports'&&}{reuseError&&
{reuseError}
}
{kind==='exports'?:}