Skip to content

feat: add assets page and download functionality#1737

Draft
KCarretto wants to merge 23 commits intomainfrom
assets-page-3148273193234440162
Draft

feat: add assets page and download functionality#1737
KCarretto wants to merge 23 commits intomainfrom
assets-page-3148273193234440162

Conversation

@KCarretto
Copy link
Collaborator

This PR introduces a new "Assets" page in the Tavern UI.

  • Users can view a list of assets (name, size, hash, counts).
  • Users can download assets directly.
  • Users can create ephemeral download links for assets.
  • Users can upload new assets or update existing ones.
  • Backend updated to expose /assets/download/ endpoint for authenticated users.

PR created automatically by Jules for task 3148273193234440162 started by @KCarretto

- Add `cdn.NewDownloadHandler` to `tavern/app.go` at `/assets/download/`.
- Create `tavern/internal/www/src/pages/assets` with `Assets.tsx` and components.
- Implement `AssetsTable`, `CreateLinkModal`, `UploadAssetModal`.
- Add `useAssets` hook with GraphQL queries.
- Register `/assets` route in `App.tsx` and navigation.

Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>
@google-labs-jules
Copy link
Contributor

👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@github-actions
Copy link
Contributor

github-actions bot commented Feb 6, 2026

Summary

Tests 📝 Passed ✅ Failed ❌ Skipped ⏭️ Other ❓ Flaky 🍂 Duration ⏱️
2559    ±0 2553    ±0 6    ±0 0    ±0 0    ±0 0    ±0 1ms    ±0

Previous Results

Build 🏗️ Result 🧪 Tests 📝 Passed ✅ Failed ❌ Skipped ⏭️ Other ❓ Flaky 🍂 Duration ⏱️
#886 2559 2553 6 0 0 0 19.1s

Insights

Average Tests per Run Total Flaky Tests Total Failed Slowest Test (p95)
2559 0 6 5.2s

Fail Rate

Fail Rate 0.23%    ±0
Test 📝 Results 📊 Passed ✅ Failed ❌ Fail Rate (%) 📈
src/context/SortContext/tests/SortContext.test.tsx: SortContext > SortsProvider initialization > should provide default sorts on initial load 1 0 1 100.00    ↑100.00
src/context/SortContext/tests/SortContext.test.tsx: SortContext > SortsProvider initialization > should load sorts from sessionStorage if available 1 0 1 100.00    ↑100.00
src/context/SortContext/tests/SortContext.test.tsx: SortContext > Sort validation > should accept valid OrderByField structure 1 0 1 100.00    ↑100.00
src/context/SortContext/tests/SortContext.test.tsx: SortContext > resetSorts > should reset all sorts to default values 1 0 1 100.00    ↑100.00
src/context/SortContext/tests/SortContext.test.tsx: SortContext > resetSorts > should persist default sorts to sessionStorage after reset 1 0 1 100.00    ↑100.00
src/context/SortContext/tests/SortContext.test.tsx: SortContext > storage event listener > should update sorts when storage event is triggered 1 0 1 100.00    ↑100.00

Failed Tests

Failed Tests
❌ src/context/SortContext/__tests__/SortContext.test.tsx: SortContext > SortsProvider initialization > should provide default sorts on initial load
expected { …(4) } to deeply equal { …(3) }

Trace:


AssertionError: expected { …(4) } to deeply equal { …(3) }
- Expected
+ Received
  Object {
+   "Assets": Object {
+     "direction": "DESC",
+     "field": "CREATED_AT",
+   },
    "Hosts": Object {
      "direction": "DESC",
      "field": "CREATED_AT",
    },
    "Quests": Object {
      "direction": "DESC",
      "field": "CREATED_AT",
    },
    "Tasks": Object {
      "direction": "DESC",
      "field": "LAST_MODIFIED_AT",
    },
  }
 ❯ src/context/SortContext/__tests__/SortContext.test.tsx:21:36
            
❌ src/context/SortContext/__tests__/SortContext.test.tsx: SortContext > SortsProvider initialization > should load sorts from sessionStorage if available
expected { …(4) } to deeply equal { …(3) }

Trace:


AssertionError: expected { …(4) } to deeply equal { …(3) }
- Expected
+ Received
  Object {
+   "Assets": Object {
+     "direction": "DESC",
+     "field": "CREATED_AT",
+   },
    "Hosts": Object {
-     "direction": "ASC",
-     "field": "LAST_SEEN_AT",
+     "direction": "DESC",
+     "field": "CREATED_AT",
    },
    "Quests": Object {
-     "direction": "ASC",
-     "field": "NAME",
+     "direction": "DESC",
+     "field": "CREATED_AT",
    },
    "Tasks": Object {
-     "direction": "ASC",
-     "field": "CREATED_AT",
+     "direction": "DESC",
+     "field": "LAST_MODIFIED_AT",
    },
  }
 ❯ src/context/SortContext/__tests__/SortContext.test.tsx:59:36
            
❌ src/context/SortContext/__tests__/SortContext.test.tsx: SortContext > Sort validation > should accept valid OrderByField structure
expected { …(4) } to deeply equal { …(3) }

Trace:


AssertionError: expected { …(4) } to deeply equal { …(3) }
- Expected
+ Received
  Object {
+   "Assets": Object {
+     "direction": "DESC",
+     "field": "CREATED_AT",
+   },
    "Hosts": Object {
-     "direction": "ASC",
-     "field": "LAST_SEEN_AT",
+     "direction": "DESC",
+     "field": "CREATED_AT",
    },
    "Quests": Object {
-     "direction": "ASC",
-     "field": "NAME",
+     "direction": "DESC",
+     "field": "CREATED_AT",
    },
    "Tasks": Object {
-     "direction": "ASC",
-     "field": "CREATED_AT",
+     "direction": "DESC",
+     "field": "LAST_MODIFIED_AT",
    },
  }
 ❯ src/context/SortContext/__tests__/SortContext.test.tsx:159:36
            
❌ src/context/SortContext/__tests__/SortContext.test.tsx: SortContext > resetSorts > should reset all sorts to default values
expected { …(4) } to deeply equal { …(3) }

Trace:


AssertionError: expected { …(4) } to deeply equal { …(3) }
- Expected
+ Received
  Object {
+   "Assets": Object {
+     "direction": "DESC",
+     "field": "CREATED_AT",
+   },
    "Hosts": Object {
      "direction": "DESC",
      "field": "CREATED_AT",
    },
    "Quests": Object {
      "direction": "DESC",
      "field": "CREATED_AT",
    },
    "Tasks": Object {
      "direction": "DESC",
      "field": "LAST_MODIFIED_AT",
    },
  }
 ❯ src/context/SortContext/__tests__/SortContext.test.tsx:255:36
            
❌ src/context/SortContext/__tests__/SortContext.test.tsx: SortContext > resetSorts > should persist default sorts to sessionStorage after reset
expected { …(4) } to deeply equal { …(3) }
Ignored nodes: comments, script, style
[36m<html>[39m
  [36m<head />[39m
  [36m<body>[39m
    [36m<div />[39m
  [36m</body>[39m
[36m</html>[39m

Trace:


AssertionError: expected { …(4) } to deeply equal { …(3) }
Ignored nodes: comments, script, style
<html>
  <head />
  <body>
    <div />
  </body>
</html>
- Expected
+ Received
  Object {
+   "Assets": Object {
+     "direction": "DESC",
+     "field": "CREATED_AT",
+   },
    "Hosts": Object {
      "direction": "DESC",
      "field": "CREATED_AT",
    },
    "Quests": Object {
      "direction": "DESC",
      "field": "CREATED_AT",
    },
    "Tasks": Object {
      "direction": "DESC",
      "field": "LAST_MODIFIED_AT",
    },
  }
 ❯ src/context/SortContext/__tests__/SortContext.test.tsx:293:24
 ❯ runWithExpensiveErrorDiagnosticsDisabled node_modules/@testing-library/dom/dist/config.js:47:12
 ❯ checkCallback node_modules/@testing-library/dom/dist/wait-for.js:127:77
 ❯ Timeout.checkRealTimersCallback node_modules/@testing-library/dom/dist/wait-for.js:121:16
            
❌ src/context/SortContext/__tests__/SortContext.test.tsx: SortContext > storage event listener > should update sorts when storage event is triggered
expected { …(4) } to deeply equal { …(3) }

Trace:


AssertionError: expected { …(4) } to deeply equal { …(3) }
- Expected
+ Received
  Object {
+   "Assets": Object {
+     "direction": "DESC",
+     "field": "CREATED_AT",
+   },
    "Hosts": Object {
-     "direction": "ASC",
-     "field": "LAST_SEEN_AT",
+     "direction": "DESC",
+     "field": "CREATED_AT",
    },
    "Quests": Object {
-     "direction": "ASC",
-     "field": "NAME",
+     "direction": "DESC",
+     "field": "CREATED_AT",
    },
    "Tasks": Object {
-     "direction": "ASC",
-     "field": "CREATED_AT",
+     "direction": "DESC",
+     "field": "LAST_MODIFIED_AT",
    },
  }
 ❯ src/context/SortContext/__tests__/SortContext.test.tsx:340:36
            

Slowest Tests

Test 📝 Results 📊 Duration (avg) ⏱️ Duration (p95) ⏱️
eldritch-libsys: std::dll_inject_impl::tests::test_dll_inject_simple 1 5.2s 5.2s
imix::bin/imix: install::tests::test_install_execution 3 1.2s 3.4s
imix::bin/imix: install::tests::test_install_execution 3 1.2s 3.4s
imix::bin/imix: install::tests::test_install_execution 3 1.2s 3.4s
imix::bin/imix: tests::task_tests::test_task_streaming_error 3 3.0s 3.0s
imix::bin/imix: tests::task_tests::test_task_streaming_error 3 3.0s 3.0s
imix::bin/imix: tests::task_tests::test_task_streaming_error 3 3.0s 3.0s
imix::bin/imix: tests::task_tests::test_task_streaming_output 3 3.0s 3.0s
imix::bin/imix: tests::task_tests::test_task_streaming_output 3 3.0s 3.0s
imix::bin/imix: tests::task_tests::test_task_streaming_output 3 3.0s 3.0s

🍂 No flaky tests in this run.

Github Test Reporter by CTRF 💚

🔄 This comment has been updated

google-labs-jules bot and others added 22 commits February 6, 2026 04:16
… view

- Refactor `AssetsTable` to use `lucide-react` icons.
- Disable client-side header sorting in favor of backend sorting.
- Implement row expansion (`AssetAccordion`) to show links and tomes.
- Update `CreateLinkModal` styling to match other modals.
- Update `SortContext` and `SortingControls` to support Assets sorting.
- Add `Breadcrumbs` to Assets page.
- Update `useAssets` query to fetch nested link and tome details.

Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>
- Fix `AssetNode` interface definition in `interfacesQuery.ts` to include `edges` for `links` and `tomes`.
- Fix duplicate import in `SortContext.tsx`.
- Resolve `TS2339` error in `AssetAccordion.tsx` by ensuring correct types.

Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>
- Refactor `AssetsTable` to use `lucide-react` icons.
- Disable client-side header sorting in favor of backend sorting.
- Implement row expansion (`AssetAccordion`) to show links.
- Update `CreateLinkModal` styling to match other modals.
- Update `SortContext` and `SortingControls` to support Assets sorting.
- Add `Breadcrumbs` to Assets page.
- Update `useAssets` query to fetch nested link and tome details.
- Add random string generation for new links.
- Add "Copy to Clipboard" for hashes and links.

Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>
- Overwrite `tavern/internal/www/src/utils/interfacesQuery.ts` to ensure `AssetNode` interface correctly includes `edges` for `links` and `tomes`.
- Fix duplicate import in `SortContext.tsx`.
- Verify build passes locally.

Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>
* feat: update Assets page with creator info, responsive table, and link controls

- Add `creator` field to `AssetNode` interface and GraphQL query.
- Add "Creator" column to Assets table using `UserImageAndName`.
- Implement responsive column hiding for Assets table (hide Size, Hash, Links, Created on mobile).
- Fix "Tome" icon display and conditional row expansion.
- Add "Limit Downloads" checkbox to Create Link modal.
- Sort asset links by Unexpired > Unlimited > Most Remaining Downloads.
- Update link expiration text to show "Expired" when appropriate.

Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>

* feat: update Assets page with creator info, responsive table, and link controls

- Add `creator` field to `AssetNode` interface and GraphQL query.
- Add "Creator" column to Assets table using `UserImageAndName`.
- Implement responsive column hiding for Assets table (hide Size, Hash, Links, Created on mobile).
- Fix "Tome" icon display and conditional row expansion.
- Add "Limit Downloads" checkbox to Create Link modal.
- Sort asset links by Unexpired > Unlimited > Most Remaining Downloads.
- Update link expiration text to show "Expired" when appropriate.
- Increase spacing for Tome icon and Creator column to prevent overlap.

Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>

* feat: update Assets page with creator info, responsive table, and link controls

- Add `creator` field to `AssetNode` interface and GraphQL query.
- Add "Creator" column to Assets table using `UserImageAndName`.
- Implement responsive column hiding for Assets table (hide Size, Hash, Links, Created on mobile).
- Fix "Tome" icon display and conditional row expansion.
- Add "Limit Downloads" checkbox to Create Link modal.
- Sort asset links by Unexpired > Unlimited > Most Remaining Downloads.
- Update link expiration text to show "Expired" when appropriate.
- Increase spacing for Tome icon and Creator column to prevent overlap.
- Set minimum width for Name and Creator columns.

Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>

* feat: update Assets page with creator info, responsive table, and link controls

- Add `creator` field to `AssetNode` interface and GraphQL query.
- Add "Creator" column to Assets table using `UserImageAndName`.
- Implement responsive column hiding for Assets table with progressive breakpoints to avoid horizontal scroll.
- Fix "Tome" icon display and conditional row expansion.
- Add "Limit Downloads" checkbox to Create Link modal.
- Sort asset links by Unexpired > Unlimited > Most Remaining Downloads.
- Update link expiration text to show "Expired" when appropriate.
- Increase spacing for Tome icon and Creator column to prevent overlap.
- Set minimum width for Name and Creator columns.

Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>

* feat: update Assets page with creator info, responsive table, link controls, and name truncation

- Add `creator` field to `AssetNode` interface and GraphQL query.
- Add "Creator" column to Assets table using `UserImageAndName`.
- Implement responsive column hiding for Assets table with progressive breakpoints.
- Fix "Tome" icon display and conditional row expansion.
- Add "Limit Downloads" checkbox to Create Link modal.
- Sort asset links by Unexpired > Unlimited > Most Remaining Downloads.
- Update link expiration text to show "Expired" when appropriate.
- Increase spacing for Tome icon and Creator column to prevent overlap.
- Set minimum width for Name and Creator columns.
- Implement intelligent asset name truncation (handling paths) and click-to-copy functionality.

Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>

* feat: update Assets page with creator info, responsive table, link controls, name truncation, and refresh logic

- Add `creator` field to `AssetNode` interface and GraphQL query.
- Add "Creator" column to Assets table using `UserImageAndName`.
- Implement responsive column hiding for Assets table with progressive breakpoints.
- Fix "Tome" icon display and conditional row expansion.
- Add "Limit Downloads" checkbox to Create Link modal.
- Sort asset links by Unexpired > Unlimited > Most Remaining Downloads.
- Update link expiration text to show "Expired" when appropriate.
- Increase spacing for Tome icon and Creator column to prevent overlap.
- Set minimum width for Name and Creator columns.
- Implement intelligent asset name truncation (handling paths) and click-to-copy functionality.
- Add "File Plus" icon for assets not referenced by any tomes with tooltip.
- Wire up automatic table refresh after creating a link or uploading an asset.

Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>

---------

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>
…e columns (#1744)

* Update Assets page with Link creator, disable link button, filters, and responsive columns

Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>

* Update Assets page with Link creator, disable link button, filters, and responsive columns

Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>

---------

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>
…Column (#1745)

* Enhance Assets page with bulk upload, link duration shortcuts, and last modified column

- Add `formatRelativeTime` helper for succinct relative timestamps (e.g., "5s ago", "1h 15m ago").
- Update `CreateLinkModal` to use `Tabs` (simulating segmented control) for selecting link duration: "10min", "1hr", or "Custom".
- Add "Last Modified" column to `AssetsTable`, visible on large screens, using `formatRelativeTime`.
- Add info tooltip to "Hash" column header in `AssetsTable`.
- Update `AssetAccordion` to hide the copy-link button for expired or exhausted links.
- Refactor `UploadAssetModal` to support bulk file uploads and recursive folder uploads using `webkitdirectory`.
- Add progress tracking and error reporting to the upload process.

Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>

* Enhance Assets page with bulk upload, link duration shortcuts, and last modified column

- Add `formatRelativeTime` helper for succinct relative timestamps (e.g., "5s ago", "1h 15m ago").
- Update `CreateLinkModal` to use `Tabs` (simulating segmented control) for selecting link duration: "10min", "1hr", or "Custom".
- Add "Last Modified" column to `AssetsTable`, visible on large screens, using `formatRelativeTime`.
- Add info tooltip to "Hash" column header in `AssetsTable`.
- Update `AssetAccordion` to hide the copy-link button for expired or exhausted links.
- Refactor `UploadAssetModal` to support bulk file uploads and recursive folder uploads using `webkitdirectory`.
- Add progress tracking and error reporting to the upload process.
- Update `AlertError` component to support `ReactNode` details and `whitespace-pre-wrap`.

Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>

* Enhance Assets page with bulk upload, link duration shortcuts, and last modified column

- Add `formatRelativeTime` helper for succinct relative timestamps (e.g., "5s ago", "1h 15m ago").
- Update `CreateLinkModal` to use `Tabs` (simulating segmented control) for selecting link duration: "10min", "1hr", or "Custom".
- Add "Last Modified" column to `AssetsTable`, visible on large screens, using `formatRelativeTime`.
- Add info tooltip to "Hash" column header in `AssetsTable`.
- Update `AssetAccordion` to hide the copy-link button for expired or exhausted links.
- Refactor `UploadAssetModal` to support bulk file uploads and recursive folder uploads using `webkitdirectory`.
- Add progress tracking and error reporting to the upload process.
- Update `AlertError` component to support `ReactNode` details and `whitespace-pre-wrap`.

Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>

* Enhance Assets page with bulk upload, link duration shortcuts, and last modified column

- Add `formatRelativeTime` helper for succinct relative timestamps (e.g., "5s ago", "1h 15m ago").
- Update `CreateLinkModal` to use `Tabs` (simulating segmented control) for selecting link duration: "10min", "1hr", or "Custom".
- Add "Last Modified" column to `AssetsTable`, visible on large screens, using `formatRelativeTime`.
- Add info tooltip to "Hash" column header in `AssetsTable`.
- Update `AssetAccordion` to hide the copy-link button for expired or exhausted links.
- Refactor `UploadAssetModal` to support bulk file uploads and recursive folder uploads using `webkitdirectory`.
- Add progress tracking and error reporting to the upload process.
- Update `AlertError` component to support `ReactNode` details and `whitespace-pre-wrap`.

Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>

* Enhance Assets page with bulk upload, link duration shortcuts, and last modified column

- Add `formatRelativeTime` helper for succinct relative timestamps (e.g., "5s ago", "1h 15m ago").
- Update `CreateLinkModal` to use `Tabs` (simulating segmented control) for selecting link duration: "10min", "1hr", or "Custom".
- Add "Last Modified" column to `AssetsTable`, visible on large screens, using `formatRelativeTime`.
- Add info tooltip to "Hash" column header in `AssetsTable`.
- Update `AssetAccordion` to hide the copy-link button for expired or exhausted links.
- Refactor `UploadAssetModal` to support bulk file uploads and recursive folder uploads using `webkitdirectory`.
- Add progress tracking and error reporting to the upload process.
- Allow renaming of assets when uploading a single file.
- Update `AlertError` component to support `ReactNode` details and `whitespace-pre-wrap`.

Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>

* Enhance Assets page with bulk upload, link duration shortcuts, and last modified column

- Add `formatRelativeTime` helper for succinct relative timestamps (e.g., "5s ago", "1h 15m ago").
- Update `CreateLinkModal` to use `Tabs` (simulating segmented control) for selecting link duration: "10min", "1hr", or "Custom".
- Add "Last Modified" column to `AssetsTable`, visible on large screens, using `formatRelativeTime`.
- Add info tooltip to "Hash" column header in `AssetsTable`.
- Update `AssetAccordion` to hide the copy-link button for expired or exhausted links.
- Refactor `UploadAssetModal` to support bulk file uploads and recursive folder uploads using `webkitdirectory`.
- Add progress tracking and error reporting to the upload process.
- Allow renaming of assets when uploading a single file.
- Fix `Button` component to correctly respect the `type` prop (preventing accidental form submissions).
- Update `AlertError` component to support `ReactNode` details and `whitespace-pre-wrap`.

Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>

---------

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>
When navigating backwards in the Assets page, the previous query variables (first/after) were being merged with the new variables (last/before), causing a GraphQL error or invalid query state. This change explicitly clears the unused pagination variables in `useAssets` hook.

Verified with a reproduction unit test that simulated the issue and confirmed the fix.

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>
- Ensure `implants/imix/src/agent.rs` uses `tokio::runtime::Handle` instead of `std::runtime::Handle`, fixing `error[E0433]: failed to resolve: could not find runtime in std`.
- Re-apply frontend fixes for `AssetNode` interface and `SortContext`.

Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>
This reverts commit b756a42.
* Assets page improvements: styling, validation, filtering, and upload flow.

- Standardized font size in AssetsTable.
- Moved "Expire link" button to link header, updated icon and tooltip.
- Enhanced UploadAssetModal with file size limit (100MB), status indicators, and disabled actions during upload.
- Added client-side validation for CreateLinkModal expiry date using Yup.
- Added filtering by Creator in Assets page.
- Replaced formatRelativeTime with moment.js.
- Added moment dependency.

Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>

* Assets page improvements: styling, validation, filtering, and upload flow.

- Standardized font size in AssetsTable.
- Moved "Expire link" button to link header, updated icon and tooltip.
- Enhanced UploadAssetModal with file size limit (100MB), status indicators, and disabled actions during upload.
- Added client-side validation for CreateLinkModal expiry date using Yup.
- Added filtering by Creator in Assets page.
- Replaced formatRelativeTime with moment.js.
- Added moment dependency.

Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>

---------

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>
- Run npm build to generate tavern/internal/www/build/index.html
- Fixes go:embed pattern failure in CI

Co-authored-by: KCarretto <16250309+KCarretto@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant