diff --git a/CHANGELOG.md b/CHANGELOG.md index d2fd05f..dfd2a5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,27 @@ All notable changes to BeatDesign are documented in this file. ## Unreleased +### Added + +- Project settings from project cards and workspace headers: names, short descriptions, explicit image covers, automatic image/video-poster fallback, and the revision-checked `bdesign_project_update` MCP tool (30 tools total). Community contribution: #28. + +### Fixed + +- Create a project directly after choosing Canvas or Studio, preserving entry parameters and retrying in the chosen workspace without duplicate clicks (#22). +- Align Canvas previews and Take selection with the latest usable successful generation, while preserving explicit selections and pinned timeline Assets (#26). +- Preserve timeline clip gains in MCP audio exports and limit overlapping peaks without makeup gain (#24). +- Commit project settings and idempotency receipts atomically; retain edits and show errors when header renames conflict. +- Persist undo/redo back to an intentionally empty Canvas. Extract Windows test portability, Studio empty-state translations, and narrow-screen hero layout improvements from #18 without its branding, Provider, or hosted deployment profile. + +### Security + +- Isolate BeatAPI adapter construction, readiness checks and input validation with TanStack server-only functions so browser model discovery never imports local configuration or SQLite. +- Update TanStack Start/Router, the MCP SDK, Vite, Seroval and source-map-js to patched versions; production dependency audit reports no known vulnerabilities. + +### Documentation + +- Highlight current source updates in English, Chinese and Japanese READMEs, while distinguishing them from the v0.2.4 release and package. Update the MCP catalog and current product status. + ## [0.2.4] - 2026-09-23 ### Added diff --git a/README.ja.md b/README.ja.md index 88d704c..5f87b16 100644 --- a/README.ja.md +++ b/README.ja.md @@ -16,7 +16,7 @@

- ウェブサイト · + ウェブサイト · クイックスタート · MCP · 製品ステータス @@ -30,6 +30,20 @@ BeatDesignは、AI画像・動画制作のための独立したオープンソース、ローカルファーストのワークスペースです。Higgsfieldのような一貫した制作フローを、自分のマシンで実行、確認、拡張したい人に向けて作られています。 +## 最近のソース更新 · 2026年10月 + +以下は`main`の更新です。最新の正式Releaseとnpmパッケージは引き続き **v0.2.4** です。利用するにはソースを更新してください。既存のパッケージへ自動配信されるものではありません。 + +- **Project設定とカバー:** 名前と説明の編集、画像カバーのアップロード・選択、自動カバーへのリセットに対応。手動カバーは後の読み込みや生成で置き換わりません。Projectカードまたはワークスペース上部の設定アイコンから開きます。 +- **生成バージョンの一致:** CanvasのプレビューとTake選択が最新の成功結果を示します。手動選択とTimelineの固定Assetは保持されます。 +- **Projectへ直接移動:** CanvasまたはStudioを選ぶとProjectを作成して直接開きます。再試行と連打防止にも対応します。 +- **音量を保持した書き出し:** MCPのTimeline書き出しで順番に並ぶClipの音量を保持し、重なる音声にはピーク保護を適用します。 +- **30個のMCPツール:** AgentもUIと同じバージョン確認付きコマンドでProject設定を更新できます。空のCanvasへの取り消し・やり直しの保存、Windowsテスト互換性、狭い画面のレイアウトも改善しました。 + +末尾フレームからの続き生成、CanvasからEditorへの移行、画像オーバーレイ、スタイル付きSRT字幕、ブラウザーとMCPによるMP4書き出しも利用できます。ブラウザーの書き出しにはシステムFFmpegは不要です。MCPのフレーム抽出には`ffmpeg`、Timeline書き出しにはさらに`ffprobe`が必要です。 + +[変更履歴](./CHANGELOG.md) · [Project設定](./docs/PROJECT_SETTINGS.md) · [現状とロードマップ](./docs/PRODUCT_PLAN_AND_STATUS.md) + ## 2つの制作モード、1つのProject ### 無限Canvas @@ -88,7 +102,7 @@ pnpm dev ## AgentからBeatDesignを使う -BeatDesignはSkill、Project、Asset、Canvas、生成、Editor操作をカバーする29個のローカルMCPツールを提供し、内蔵Skillの検出と正式なTimelineからのMP4書き出しにも対応します。Agentによる変更は同じProjectサービスを通り、ブラウザーのワークスペースに表示されます。 +BeatDesignはSkill、Project、Asset、Canvas、生成、Editor操作をカバーする30個のローカルMCPツールを提供し、内蔵Skillの検出と正式なTimelineからのMP4書き出しにも対応します。Agentによる変更は同じProjectサービスを通り、ブラウザーのワークスペースに表示されます。 MCP Hostへ接続した後は、次のように依頼できます。 diff --git a/README.md b/README.md index 384317b..3a73004 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@

- Website · + Website · Quick start · MCP · Product status @@ -30,6 +30,20 @@ BeatDesign is an independent, open-source, local-first workspace for AI image and video creation. It is built for people who want the connected creative flow of tools such as Higgsfield, with a workspace they can run, inspect, and extend on their own machine. +## Latest source updates — October 2026 + +Available on `main`; the latest tagged release and npm package remain **v0.2.4**. Pull the source to use these updates; existing packaged installations do not receive them automatically. + +- **Project settings:** edit names and descriptions, upload or select a cover, and reset to an automatic image or local video poster. A manual cover stays selected after later imports and generations. Open the settings icon on a project card or workspace header. +- **Consistent generation versions:** Canvas previews and Take selection agree on the latest successful output; manual selections and concrete timeline Assets are preserved. +- **Faster project entry:** choosing Canvas or Studio creates one project and opens it directly, with retry protection. +- **Reliable audio export:** MCP timeline rendering preserves clip gain across sequential shots, with peak protection for overlapping audio. +- **30 MCP tools:** Agents can update project settings through the same revision-checked command path as the UI. Canvas undo/redo can save an intentionally empty canvas; Windows test portability and narrow-screen layout are improved. + +Already available: tail-frame continuation, Canvas-to-Editor handoff, image overlays, styled SRT captions, browser-native MP4 export, and MCP timeline rendering. Browser export needs no system FFmpeg; MCP frame extraction needs `ffmpeg`, and MCP timeline rendering also needs `ffprobe`. + +[Change details](./CHANGELOG.md) · [Project settings](./docs/PROJECT_SETTINGS.md) · [Current scope and roadmap](./docs/PRODUCT_PLAN_AND_STATUS.md) + ## Two creative modes, one Project ### Infinite Canvas @@ -88,7 +102,7 @@ Add your own [BeatAPI API key](https://beatapi.io/dashboard/apikeys) only when y ## Use BeatDesign with an Agent -BeatDesign exposes 29 local MCP tools for Skills, Projects, Assets, Canvas, generation, and Editor operations, including built-in Skill discovery and authoritative MP4 timeline rendering. Agent changes use the same project services and become visible in the browser workspace. +BeatDesign exposes 30 local MCP tools for Skills, Projects, Assets, Canvas, generation, and Editor operations, including built-in Skill discovery and authoritative MP4 timeline rendering. Agent changes use the same project services and become visible in the browser workspace. After connecting your MCP host, you can ask: diff --git a/README.zh-CN.md b/README.zh-CN.md index e694716..3488500 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -16,7 +16,7 @@

- 网站 · + 网站 · 快速开始 · MCP · 产品状态 @@ -30,6 +30,20 @@ BeatDesign 是一个独立、开源、本地优先的 AI 图片与视频创作工作台。它适合喜欢 Higgsfield 这类连贯创作流程,同时希望在自己的电脑上运行、检查和扩展工作空间的人。 +## 最近更新 · 2026 年 10 月 + +以下更新位于 `main` 源码;最新正式 Release 和 npm 包仍为 **v0.2.4**。拉取源码后即可使用,现有安装包不会自动获得这些更新。 + +- **项目设置与稳定封面:** 修改项目名称和简介,上传或选择封面,或恢复自动封面。手动封面不会被后续导入、生成的素材替换。入口在项目卡片和工作区顶栏的设置图标。 +- **生成版本保持一致:** 画布预览和 Take 选择默认指向最新成功结果,同时保留手动选择和时间线锁定的具体素材。 +- **创建项目一步直达:** 选择画布或创作台后直接进入新项目,支持失败重试和重复点击保护。 +- **修复导出音量:** MCP 时间线导出保留顺序片段的音量,叠加音频增加峰值保护。 +- **30 个 MCP 工具:** Agent 可通过与 UI 相同、带版本校验的命令修改项目设置。同时改进画布撤销/重做到空白状态的保存、Windows 测试兼容性和窄屏布局。 + +此前已支持尾帧续写、画布到剪辑的连续流程、图片叠层、带样式的 SRT 字幕、浏览器 MP4 导出和 MCP 时间线导出。浏览器导出不依赖系统 FFmpeg;MCP 抽帧需要 `ffmpeg`,MCP 时间线导出还需要 `ffprobe`。 + +[更新详情](./CHANGELOG.md) · [项目设置说明](./docs/PROJECT_SETTINGS.md) · [当前能力与后续规划](./docs/PRODUCT_PLAN_AND_STATUS.md) + ## 两种核心创作模式,一个 Project ### 无限 Canvas @@ -88,7 +102,7 @@ pnpm dev ## 让 Agent 操作 BeatDesign -BeatDesign 提供 29 个本地 MCP 工具,覆盖 Skill、Project、Asset、Canvas、生成和 Editor 操作,包括发现内置 Skill 目录以及从权威时间线导出 MP4。Agent 修改会经过同一套项目服务,并显示在浏览器工作空间中。 +BeatDesign 提供 30 个本地 MCP 工具,覆盖 Skill、Project、Asset、Canvas、生成和 Editor 操作,包括发现内置 Skill 目录以及从权威时间线导出 MP4。Agent 修改会经过同一套项目服务,并显示在浏览器工作空间中。 连接 MCP Host 后,可以直接提出这样的要求。 diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 04d6fb0..a6ef648 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -32,7 +32,7 @@ The browser calls local `/api` routes. Server routes validate input and resolve BeatDesign does not implement account concurrency policy. Projects may submit generations independently, and the active Generation Provider is the sole authority for account-level admission. The local submission lock protects SQLite intent/history consistency only; it does not reserve a long-running generation slot or reject a different Project because another task is active. -Provider and optional R2/S3 credentials are encrypted in the local `config` table. Browser components never receive raw credentials. +Provider and optional R2/S3 credentials are encrypted in the local `config` table. Browser components never receive raw credentials. Shared model metadata may read Provider bindings, but Provider adapter construction, configuration checks and input validation are wrapped in TanStack `createServerOnlyFn`; the browser dependency graph must not import local configuration or SQLite. Upload storage is a separate adapter boundary. File selection remains browser-local. A successful generation precheck creates a short-lived, one-time SQLite intent that binds the project, model, exact upload count, uploaded URLs, and final generation submission. Required references are promoted only after that point and immediately before task submission; they become project assets only after the provider accepts the task. The default path uploads supported references to BeatAPI Files. Users may instead configure a public R2/S3-compatible bucket; those credentials remain local and are used only for confirmed generation inputs. diff --git a/docs/MCP.md b/docs/MCP.md index be10fbc..7658fbf 100644 --- a/docs/MCP.md +++ b/docs/MCP.md @@ -104,12 +104,14 @@ installation shapes. ## Tool groups -There are **29** tools: +There are **30** tools: - Skill (2): list the bundled official Skill catalog and read one complete versioned Skill definition. -- Project (5): list, get, create, target the current MCP session, and open a - workspace review surface. +- Project (6): list, get, update settings, create, target the current MCP + session, and open a workspace review surface. `bdesign_project_update` requires + the latest `settingsRevision` from `bdesign_project_get`; settings changes and + idempotency receipts commit atomically. - Asset (4): list, get by project membership, import a local file, and extract a video frame. - Canvas (5): get, browser view/focus, search, incremental apply, and diff --git a/docs/PRODUCT_PLAN_AND_STATUS.md b/docs/PRODUCT_PLAN_AND_STATUS.md index 367f27c..63e2ff2 100644 --- a/docs/PRODUCT_PLAN_AND_STATUS.md +++ b/docs/PRODUCT_PLAN_AND_STATUS.md @@ -2,10 +2,17 @@ - 文档用途:给新加入的开发者、Codex、Claude Code 和其他 AI Agent 提供统一产品上下文 - 当前基线:BeatDesign v0.2 Phase 1 本地实现 -- 最后核对:2026-09-23 +- 最后核对:2026-10-22 - 事实边界:只有代码、测试和本文“已完成”栏目共同证明的能力才算完成;规划项不等于已发布 - 发布状态:GitHub 最新正式 Release 为 [v0.2.4](https://github.com/BeatAPI/BeatDesign/releases/tag/v0.2.4);npm 最新版本为 `@beatapi/beatdesign-workbuddy@0.2.4`(2026-09-23 核验)。WorkBuddy 开放平台中,原有连接器 `oc_321d021032343aea` 的 v0.2.3 已发布,v0.2.4 已提交更新并显示“审核中”;新版通过审核和公开市场可检索性均未核验。 +### 2026-10 主分支更新(尚未发布新版本) + +- 整合社区 PR #22、#24、#26、#28:直接创建项目、MCP 导出音量修复、最新成功生成版本统一选择、项目设置与手动/自动封面。 +- `bdesign_project_update` 将 MCP 目录扩展为 30 个工具;项目设置更新与幂等回执在同一 SQLite 事务提交,回执失败时回滚设置,保留旧项目封面。 +- 从 PR #18 提取 Windows 测试兼容、Studio 首屏翻译、空画布撤销/重做保存及窄屏布局修复;第三方品牌、Provider 和托管部署配置未纳入上游。 +- README 分开标注源码更新与 v0.2.4 安装包。官方 Skill 目录仍为空,Issue #29 的持久分组、素材文件夹和复用模板仍待实现。 + ### v0.2.4 已发布改进 - 中文或日文浏览器首次打开无语言前缀的本地工作台链接时,自动进入对应语言;显式语言链接和已保存的语言偏好优先。中文首屏与项目创建入口使用“创作台、画布、素材库”等常用名称。 @@ -94,9 +101,18 @@ Codex / Claude Code / Other Agent ## 5. 已完成并有代码支撑的能力 +### 项目设置(2026-10-18) + +- Projects 卡片和工作空间顶部提供项目设置,可修改名称、140 字简介、手动封面或恢复自动封面;展示只读 ID、创建日期和本地存储信息,项目链接保持稳定。 +- 手动封面不会被后续上传或生成覆盖;自动封面按首张导入/生成图片、首个本地视频缩略图、占位图回退。旧项目已有封面在升级时保留为手动选择。 +- UI 和 `bdesign_project_update` MCP 使用相同 `project.update` 命令、项目素材归属检查和独立设置版本;旧版本写入返回冲突。详见 `docs/PROJECT_SETTINGS.md`。 + + ### Project / Local-first - 项目创建、打开、重命名和本地 SQLite 持久化。 +- 项目列表中选择 Studio 或 Canvas 后直接创建并进入对应视图,创建期间防止重复点击,失败重试保留原选择。 +- 直接访问 `/studio` 或 `/canvas` 时只提供对应视图的创建按钮,访问本身不创建项目;创建后保留语言、模型和提示词入口参数。 - 界面支持英语、中文和日语,并可在主页、项目列表及工作区顶栏切换;英文使用无前缀路径,中文和日语分别使用 `/zh` 与 `/ja`。 - Canvas Snapshot 自动保存、页面隐藏时刷新和版本冲突保护。 - 本地上传图片、视频、音频后立即复制到项目目录。 @@ -156,7 +172,7 @@ Codex / Claude Code / Other Agent - `AssetFirstGenerationRequest` v2 不保存通用首帧或尾帧角色;大多数模型仍由明确的 `@ImageN` Prompt 指令表达首尾帧语义。MiniMax H3 Max / Max Turbo 按其公开契约使用专用双槽位,并将附件顺序映射为首帧、尾帧。Adapter 负责翻译 Provider 字段和校验模型硬限制。 - UI 命令入口不再接受客户端 `origin`;服务端固定写入 `ui`,MCP 入口在内核边界固定写入 `mcp`。 - Provider Contract 已将逻辑模型目录与 BeatAPI effectId、上传路径和上游模型名拆开;当前同步 GPT Image 2.5 Flare/Sunburst、Wan 3.0/Prime、HappyHorse 1.0/1.1、MiniMax H3 Max/Max Turbo 的请求契约和 SVG 品牌标志。BeatAPI 是默认实现,Fork 可在源码扩展点注册其他 Provider。 -- 本地 stdio MCP Server 提供 29 个工具(Skill / Project / Asset / Canvas / Generation / Editor),模型和参数通过 capability discovery 暴露;Canvas / Editor 增量操作使用完整 JSON Schema,Agent 可直接发现操作类型和参数。MCP 生成直接调用当前 Provider,本地产品不重复实现 API Key、余额、计费或限流策略,只透传 Provider 的结果与错误。`bdesign_skill_list` / `bdesign_skill_get` 是不显示 MCP Resources 的宿主兼容入口;`bdesign_project_target` 绑定当前会话项目,Project/Canvas/Editor view 工具返回 Codex Browser handoff;`bdesign_asset_import` 把本地文件导入项目 Asset 库;`bdesign_asset_extract_frame` 与 `bdesign_canvas_continue_from_tail` 负责抽帧续写;Editor MCP 可导入 SRT、放置和替换任意项目图片 Overlay、调整叠层与单条字幕参数,并通过 `bdesign_editor_render` 将权威时间线导出为项目内 MP4 Asset。 +- 本地 stdio MCP Server 提供 30 个工具(Skill / Project / Asset / Canvas / Generation / Editor),模型和参数通过 capability discovery 暴露;Canvas / Editor 增量操作使用完整 JSON Schema,Agent 可直接发现操作类型和参数。MCP 生成直接调用当前 Provider,本地产品不重复实现 API Key、余额、计费或限流策略,只透传 Provider 的结果与错误。`bdesign_skill_list` / `bdesign_skill_get` 是不显示 MCP Resources 的宿主兼容入口;`bdesign_project_target` 绑定当前会话项目,Project/Canvas/Editor view 工具返回 Codex Browser handoff;`bdesign_asset_import` 把本地文件导入项目 Asset 库;`bdesign_asset_extract_frame` 与 `bdesign_canvas_continue_from_tail` 负责抽帧续写;Editor MCP 可导入 SRT、放置和替换任意项目图片 Overlay、调整叠层与单条字幕参数,并通过 `bdesign_editor_render` 将权威时间线导出为项目内 MP4 Asset。 - Codex、Claude Code 与 WorkBuddy 接入包内含 `beatdesign-workspace` Skill,负责项目选择、字幕/续写工具编排、付费生成停点和可视化复核;三者共用同一 MCP 与本地 Project 数据,其中 Claude Code 和 WorkBuddy 使用本机 HTTP MCP。 ## 6. v0.2 Phase 1 本地已实现 @@ -171,7 +187,7 @@ Codex / Claude Code / Other Agent - Canvas -> Timeline Node -> Editor 连续工作流。 - Editor 自动保存接入命令入口,并补齐冲突三方合并、重复操作保护和稳定播放头时间。 - 图片 Clip、时间线拖拽调整持续时间与图片/视频统一视觉轨。 -- 本地 MCP Server 提供 29 个 Skill、Project、Asset、Canvas、Generation、Editor 工具;支持内置 Skill 目录发现、会话项目绑定、Canvas/Editor 可视化交接、从绝对路径导入本地素材、抽取尾帧续写、导入和精调 SRT 字幕、放置/替换/调整图片 Overlay,以及权威时间线 MP4 导出。 +- 本地 MCP Server 提供 30 个 Skill、Project、Asset、Canvas、Generation、Editor 工具;支持内置 Skill 目录发现、会话项目绑定、Canvas/Editor 可视化交接、从绝对路径导入本地素材、抽取尾帧续写、导入和精调 SRT 字幕、放置/替换/调整图片 Overlay,以及权威时间线 MP4 导出。 - 已加入只读 `beatdesign://skills` MCP Resource、单 Skill Resource Template、schema v1 清单校验和宿主兼容工具;当前官方创作 Skill 目录有意保持为空,待具体 Skill 完成提示词评测和可见工作流联调后再加入,并在那时开放 Showcase 入口。 - MCP 增量 Canvas/Editor 命令在短暂 revision 竞争时会基于最新权威文档限次自动重放;持续冲突返回最新 revision 和明确重试提示。 - Canvas 与 Editor 每 2 秒并在页面重新聚焦时检查 MCP 写入的新 revision。 @@ -206,7 +222,7 @@ Codex / Claude Code / Other Agent 当前可以称为“已支持本地 MCP 基础版”,但不能称为完整 Agent 编辑环境:像素级 Snapshot、独立后台媒体 Worker、实时 UI 事件和永久审计仍未实现。本地文件导入桥和 MCP 权威时间线 MP4 导出已完成;UI 当前使用 2 秒 revision 轮询和聚焦检查,而不是实时事件推送。 -Canvas 的拖拽、缩放、视口和完整布局仍使用 revision-checked Snapshot 自动保存;Canvas/Timeline 业务 operation 已有 Command 合同,Timeline Node 回写也已接入 `/commands`。后续做 MCP parity 时,应继续把可语义化的 Canvas UI 动作迁移为 `canvas.apply`,不能让外部 Agent 调用完整 Snapshot 覆盖。 +Canvas UI 已通过 `canvas.apply` 持久化卡片、布局、视口和工作流增量变化;Snapshot 端点仅为兼容例外。Editor 可表达的变化使用 `editor.apply`,其他 UI 编辑保留带 revision 校验的替换路径;外部 Agent 始终只能使用增量命令。 ### 桌面端 diff --git a/docs/PROJECT_SETTINGS.md b/docs/PROJECT_SETTINGS.md new file mode 100644 index 0000000..cb1abf4 --- /dev/null +++ b/docs/PROJECT_SETTINGS.md @@ -0,0 +1,62 @@ +# Project settings + +Project settings are available from the gear on each Projects card and the +workspace header in Studio, Canvas, Editor and Assets. They edit the same local +project: name (1–240 characters), description (up to 140 characters), and cover. +Project ID, creation date and local storage information are read-only. Project +URLs keep their stable IDs. This does not introduce accounts, sharing or publishing. +Image tiles in the project Asset library also offer **Set as cover**. + +## Covers + +- A manual cover must be an image Asset belonging to this project. Later imports, + generations and re-linking assets never replace it. +- Upload cover uses the existing local project Asset import endpoint. Uploads stay + in the Asset library even when the settings dialog is cancelled. +- Automatic cover selects the earliest uploaded/generated image by Asset creation + timestamp, then stable Asset ID. Reference-only images are excluded. If there is + no eligible image, it uses the first local video poster. No usable media or a + failed poster shows a placeholder; the original video is never loaded by a card. +- Missing/deleted manual cover Assets fall back automatically. Removing the cover + choice never deletes an Asset. Project cards and the settings preview use 16:9. +- Existing covers are preserved as manual during additive SQLite startup upgrades. + The schema default also preserves legacy covers when applying `db:push` first; + new projects explicitly start in automatic mode. Upgrade tests use isolated data. + +Video fallback uses the optional server `ffmpeg` decoder from `PATH` or +`BEATDESIGN_FFMPEG`. A membership-checked endpoint caches bounded 512px JPEG +posters under the data directory, with at most two concurrent decodes. Missing +decoders or failed decoding return a placeholder; they do not prevent ordinary +browser playback or require downloading the original video in Projects. + +## Shared UI/MCP command + +`GET /api/app/projects/:id` returns `{ settings }`, including effective cover, +automatic fallback, and `settingsRevision`. + +`PATCH /api/app/projects/:id` accepts: + +```json +{ + "expectedRevision": 1, + "commandId": "unique-command-id", + "patch": { + "name": "My film", + "description": "A short film", + "cover": { "mode": "manual", "assetId": "project-image-id" } + } +} +``` + +Use `cover: { "mode": "auto" }` to reset the choice. The route, generic command +endpoint and `bdesign_project_update` MCP tool use the same `project.update` +Command Kernel path. `bdesign_project_get` returns `settings`. Unknown fields, +external URLs, non-image covers and foreign-project Assets are rejected. Settings +have a separate revision from Canvas/Editor. A stale update returns +`REVISION_CONFLICT` (HTTP 409); the dialog retains edits and asks the user to +reopen before saving. It never automatically overwrites a newer change. + +The command commits the revision-checked settings update and its idempotency +receipt in one SQLite transaction. Receipt failures roll back the settings too. Reuse both command ID and +idempotency key for retries. List/header queries refresh every five seconds while +visible; opening settings always loads the current record. diff --git a/docs/PROVIDERS.md b/docs/PROVIDERS.md index a391516..befa502 100644 --- a/docs/PROVIDERS.md +++ b/docs/PROVIDERS.md @@ -33,7 +33,7 @@ Video Analysis is exposed as a stable BeatAPI workflow with Standard and Deep de An API with a different request or polling contract needs its own adapter. Forks can register one in `src/config/generation-providers.ts`, bind only the logical models they support, and change `ACTIVE_GENERATION_PROVIDER_ID` in the same file. BeatAPI remains the upstream default; an unknown configured id fails explicitly so it cannot accidentally submit a task to another provider. This repository does not ship placeholder KIE, Vidu, Evolink, Gemini, Fal, Replicate, or payment-provider integrations. -A custom provider definition owns adapter construction, readiness checks, parameter validation, model bindings, upstream model names, and upload paths. Provider credentials must stay server-side. Switching providers does not change Canvas nodes, Editor clips, Asset IDs, or MCP requests; each submitted task also records its provider/model identity so polling does not silently follow a later default-provider change. +A custom provider definition owns adapter construction, readiness checks, parameter validation, model bindings, upstream model names, and upload paths. Keep the binding metadata browser-safe and wrap server implementations in TanStack `createServerOnlyFn`, as the BeatAPI provider does, so model discovery cannot import the database or credentials into the browser. Provider credentials must stay server-side. Switching providers does not change Canvas nodes, Editor clips, Asset IDs, or MCP requests; each submitted task also records its provider/model identity so polling does not silently follow a later default-provider change. ## Storage diff --git a/integrations/codex/beatdesign/README.md b/integrations/codex/beatdesign/README.md index 0dbd0d0..cdd8f41 100644 --- a/integrations/codex/beatdesign/README.md +++ b/integrations/codex/beatdesign/README.md @@ -8,7 +8,7 @@ Canvas or Editor URL to Codex's in-app Browser for visible review. ```text Browser: pnpm dev → http://127.0.0.1:3020 (Canvas/Editor review surface) -Agent: MCP stdio → pnpm mcp (Agent calls 29 tools) +Agent: MCP stdio → pnpm mcp (Agent calls 30 tools) Both processes share the same local SQLite + project files. ``` diff --git a/messages/en.json b/messages/en.json index 3ca8c74..835da92 100644 --- a/messages/en.json +++ b/messages/en.json @@ -330,8 +330,8 @@ "status": { "queued": "Queued", "generating": "Generating", - "ready": "Success", - "success": "Success", + "ready": "Success", + "success": "Success", "failed": "Failed" }, "fromCanvas": "From canvas", @@ -413,6 +413,18 @@ }, "textNote": { "template": "Text note\n\nCapture composition ideas, shot notes, or production reminders here." + }, + "startHere": { + "ideasLabel": "Starting ideas", + "title": "Create Here", + "description": "Imagine the scene. Shape the mood. Bring it to life.", + "selectIdea": "Select {title}", + "ideas": { + "cinematicLandscape": "Cinematic landscape", + "editorialCharacter": "Editorial character", + "materialStudy": "Material study", + "surrealFashionFilm": "Surreal fashion film" + } } }, "editor": { @@ -745,7 +757,9 @@ "retry": "Try again", "backToHistory": "Back to history", "startTitle": "Start a new project", - "startDescription": "Choose Studio or Canvas to create this project.", + "startDescription": "Create your project here. You can switch between Studio and Canvas at any time.", + "createStudio": "Create in Studio", + "createCanvas": "Create in Canvas", "startStudio": "Studio", "startCanvas": "Canvas", "defaultName": "Untitled project" @@ -753,5 +767,37 @@ }, "Common": { "loading": "Loading" + }, + "ProjectSettings": { + "title": "Project settings", + "subtitle": "Manage the details and cover shown in your project list.", + "details": "Details", + "name": "Project name", + "description": "Description", + "descriptionHint": "A short summary shown on project cards.", + "descriptionPlaceholder": "Describe your project", + "cover": "Cover image", + "coverHint": "Choose a project image or upload a cover. 16:9 works best. Uploads stay in the asset library.", + "automatic": "Automatic · first image, then a video thumbnail", + "manual": "Custom cover · stays fixed when new assets arrive", + "upload": "Upload cover", + "reset": "Use automatic cover", + "choose": "Choose from project images", + "info": "Project info", + "id": "Project ID", + "created": "Created date", + "storage": "Storage", + "local": "Local workspace", + "cancel": "Cancel", + "save": "Save changes", + "saving": "Saving…", + "loading": "Loading settings…", + "loadError": "Unable to load settings.", + "saveError": "Unable to save settings.", + "imageOnly": "Choose a PNG, JPEG, WebP or GIF image.", + "closeReload": "Close and reopen to reload", + "setAsCover": "Set as cover", + "coverSaved": "Project cover updated", + "conflict": "Project settings changed elsewhere. Close and reopen settings before saving." } } diff --git a/messages/ja.json b/messages/ja.json index 6a05122..f805638 100644 --- a/messages/ja.json +++ b/messages/ja.json @@ -330,8 +330,8 @@ "status": { "queued": "キュー待ち", "generating": "生成中", - "ready": "成功", - "success": "成功", + "ready": "成功", + "success": "成功", "failed": "失敗" }, "fromCanvas": "Canvasから", @@ -413,6 +413,18 @@ }, "textNote": { "template": "テキストメモ\n\n構図のアイデア、ショットメモ、制作上の注意点をここに記録します。" + }, + "startHere": { + "ideasLabel": "制作アイデア", + "title": "ここから制作", + "description": "シーンを思い描き、ムードを整え、アイデアを形にしましょう。", + "selectIdea": "{title}を選択", + "ideas": { + "cinematicLandscape": "映画のような風景", + "editorialCharacter": "エディトリアルポートレート", + "materialStudy": "素材のスタディ", + "surrealFashionFilm": "シュールなファッション映像" + } } }, "editor": { @@ -745,7 +757,9 @@ "retry": "もう一度試す", "backToHistory": "履歴に戻る", "startTitle": "新しいプロジェクトを始める", - "startDescription": "StudioまたはCanvasを選択してプロジェクトを作成します。", + "startDescription": "ここでプロジェクトを作成します。StudioとCanvasはいつでも切り替えられます。", + "createStudio": "Studioで作成", + "createCanvas": "Canvasで作成", "startStudio": "Studio", "startCanvas": "Canvas", "defaultName": "無題のプロジェクト" @@ -753,5 +767,37 @@ }, "Common": { "loading": "読み込み中" + }, + "ProjectSettings": { + "title": "プロジェクト設定", + "subtitle": "一覧に表示する情報とカバーを管理します。", + "details": "基本情報", + "name": "プロジェクト名", + "description": "説明", + "descriptionHint": "プロジェクトカードに表示する短い説明。", + "descriptionPlaceholder": "プロジェクトの説明", + "cover": "カバー画像", + "coverHint": "画像を選択するかアップロードします。16:9を推奨。画像は素材に保存されます。", + "automatic": "自動 · 最初の画像、次に動画サムネイル", + "manual": "カスタム · 新しい素材で上書きされません", + "upload": "カバーをアップロード", + "reset": "自動カバーに戻す", + "choose": "プロジェクトの画像から選択", + "info": "プロジェクト情報", + "id": "プロジェクト ID", + "created": "作成日", + "storage": "保存先", + "local": "ローカルワークスペース", + "cancel": "キャンセル", + "save": "変更を保存", + "saving": "保存中…", + "loading": "設定を読み込み中…", + "loadError": "設定を読み込めません。", + "saveError": "設定を保存できません。", + "imageOnly": "PNG、JPEG、WebP、GIFを選択してください。", + "closeReload": "閉じて再度開くと更新されます", + "setAsCover": "カバーに設定", + "coverSaved": "カバーを更新しました", + "conflict": "設定が別の場所で更新されました。閉じて再度開いてから保存してください。" } } diff --git a/messages/zh.json b/messages/zh.json index 1ae6210..6f7b2e5 100644 --- a/messages/zh.json +++ b/messages/zh.json @@ -413,6 +413,18 @@ }, "textNote": { "template": "文本备注\n\n在这里记录构图想法、镜头说明或制作备注。" + }, + "startHere": { + "ideasLabel": "创作灵感", + "title": "从这里开始创作", + "description": "想象画面,塑造氛围,让灵感成为作品。", + "selectIdea": "选择{title}", + "ideas": { + "cinematicLandscape": "电影感风景", + "editorialCharacter": "杂志人像", + "materialStudy": "材质探索", + "surrealFashionFilm": "超现实时尚短片" + } } }, "editor": { @@ -745,7 +757,9 @@ "retry": "重试", "backToHistory": "返回历史", "startTitle": "开始新项目", - "startDescription": "选择创作台或画布来创建这个项目。", + "startDescription": "创建项目后即可开始,创作台和画布可随时切换。", + "createStudio": "创建并进入创作台", + "createCanvas": "创建并进入画布", "startStudio": "创作台", "startCanvas": "画布", "defaultName": "未命名项目" @@ -753,5 +767,37 @@ }, "Common": { "loading": "加载中" + }, + "ProjectSettings": { + "title": "项目设置", + "subtitle": "管理项目列表中的基本信息和封面。", + "details": "基本信息", + "name": "项目名称", + "description": "简介", + "descriptionHint": "显示在项目卡片上的简短说明。", + "descriptionPlaceholder": "描述这个项目", + "cover": "封面图片", + "coverHint": "选择项目图片或上传封面,推荐 16:9。上传的图片会保留在素材库。", + "automatic": "自动选择 · 优先首张图片,其次视频缩略图", + "manual": "自定义封面 · 后续新增素材不会覆盖", + "upload": "上传封面", + "reset": "恢复自动封面", + "choose": "从项目图片中选择", + "info": "项目信息", + "id": "项目 ID", + "created": "创建日期", + "storage": "存储位置", + "local": "本地工作空间", + "cancel": "取消", + "save": "保存更改", + "saving": "保存中…", + "loading": "正在加载设置…", + "loadError": "无法加载设置。", + "saveError": "无法保存设置。", + "imageOnly": "请选择 PNG、JPEG、WebP 或 GIF 图片。", + "closeReload": "关闭后重新打开以刷新", + "setAsCover": "设为项目封面", + "coverSaved": "项目封面已更新", + "conflict": "项目设置已在其他位置更新。请关闭后重新打开,再保存更改。" } } diff --git a/package.json b/package.json index 14d108e..8fc4d5c 100644 --- a/package.json +++ b/package.json @@ -52,10 +52,10 @@ "@fontsource-variable/space-grotesk": "^5.3.0", "@libsql/client": "^0.14.0", "@mdx-js/react": "^3.1.1", - "@modelcontextprotocol/server": "^2.0.0", + "@modelcontextprotocol/server": "^2.3.0", "@tanstack/react-query": "^5.101.0", - "@tanstack/react-router": "1.170.11", - "@tanstack/react-start": "1.168.19", + "@tanstack/react-router": "1.170.41", + "@tanstack/react-start": "1.168.60", "@types/mdx": "^2.0.13", "@xyflow/react": "12.11.2", "class-variance-authority": "^0.7.1", @@ -94,7 +94,7 @@ "tailwindcss": "^4.1.0", "tsx": "^4.21.0", "typescript": "^5.9.0", - "vite": "^8.0.16" + "vite": "^8.1.6" }, "pnpm": { "overrides": { @@ -108,7 +108,9 @@ "postcss": "8.5.25", "qs": "6.15.3", "uuid": "13.0.1", - "ws": "8.21.2" + "ws": "8.21.2", + "seroval": "1.7.0", + "source-map-js": "1.2.2" } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b052982..63a014b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,6 +16,8 @@ overrides: qs: 6.15.3 uuid: 13.0.1 ws: 8.21.2 + seroval: 1.7.0 + source-map-js: 1.2.2 importers: @@ -46,17 +48,17 @@ importers: specifier: ^3.1.1 version: 3.1.1(@types/react@19.2.14)(react@19.2.5) '@modelcontextprotocol/server': - specifier: ^2.0.0 - version: 2.0.0 + specifier: ^2.3.0 + version: 2.3.1 '@tanstack/react-query': specifier: ^5.101.0 version: 5.101.0(react@19.2.5) '@tanstack/react-router': - specifier: 1.170.11 - version: 1.170.11(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + specifier: 1.170.41 + version: 1.170.41(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@tanstack/react-start': - specifier: 1.168.19 - version: 1.168.19(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@8.0.16(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0)) + specifier: 1.168.60 + version: 1.168.60(crossws@0.4.5(srvx@0.11.22))(esbuild@0.28.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(rolldown@1.2.15)(rollup@4.62.4)(vite@8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0)) '@types/mdx': specifier: ^2.0.13 version: 2.0.13 @@ -126,7 +128,7 @@ importers: version: 1.63.0 '@tailwindcss/vite': specifier: ^4.3.0 - version: 4.3.0(vite@8.0.16(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0)) + version: 4.3.0(vite@8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0)) '@tanstack/react-query-devtools': specifier: ^5.101.0 version: 5.101.0(@tanstack/react-query@5.101.0(react@19.2.5))(react@19.2.5) @@ -141,7 +143,7 @@ importers: version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': specifier: ^6.0.2 - version: 6.0.2(vite@8.0.16(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0)) + version: 6.0.2(vite@8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0)) drizzle-kit: specifier: ^0.31.4 version: 0.31.10 @@ -150,7 +152,7 @@ importers: version: 0.28.1 nitro: specifier: 3.0.260603-beta - version: 3.0.260603-beta(@libsql/client@0.14.0)(chokidar@5.0.0)(dotenv@17.4.1)(drizzle-orm@0.45.2(@libsql/client@0.14.0)(kysely@0.28.17))(jiti@2.7.0)(rollup@4.62.4)(vite@8.0.16(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0)) + version: 3.0.260603-beta(@libsql/client@0.14.0)(chokidar@5.0.0)(dotenv@17.4.1)(drizzle-orm@0.45.2(@libsql/client@0.14.0)(kysely@0.28.17))(jiti@2.7.0)(rollup@4.62.4)(vite@8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0)) rollup: specifier: 4.62.4 version: 4.62.4 @@ -167,8 +169,8 @@ importers: specifier: ^5.9.0 version: 5.9.3 vite: - specifier: ^8.0.16 - version: 8.0.16(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0) + specifier: ^8.1.6 + version: 8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0) packages: @@ -279,14 +281,14 @@ packages: resolution: {integrity: sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==} engines: {node: '>=18.0.0'} - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} - engines: {node: '>=6.9.0'} - '@babel/code-frame@7.29.0': resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.29.0': resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} engines: {node: '>=6.9.0'} @@ -425,6 +427,10 @@ packages: resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.29.0': resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} @@ -778,8 +784,8 @@ packages: peerDependencies: rollup: '>=2' - '@modelcontextprotocol/core@2.0.0': - resolution: {integrity: sha512-pJCEwGG7Lfr/+PQp9ZTwKXNeO5wzbfKL7H3MYpCorM4oFBoQrdjnBgEoqG+RjhsvS1FKrDbKux+M1HhlnGWqcA==} + '@modelcontextprotocol/core@2.3.1': + resolution: {integrity: sha512-laVmIhPGpWi7rG9q+0UigblRN0Hws/Yjlb6qLFtVqryXVLkc4h+yN8z731POD2LnAGQlFe7/tXhUm7Bi0YB91g==} engines: {node: '>=20'} '@modelcontextprotocol/sdk@1.29.0': @@ -792,8 +798,8 @@ packages: '@cfworker/json-schema': optional: true - '@modelcontextprotocol/server@2.0.0': - resolution: {integrity: sha512-YhHWdHfpFMQfd0prsEnxKeS3Qz3ytIGmsS0sth4KDjnacIT7hxk6hXHkJ9KysxlkvTM+WZAtQbbcUhdoP4Hvtw==} + '@modelcontextprotocol/server@2.3.1': + resolution: {integrity: sha512-e59MfWuSssj6DoQ96JCTqdW1AXT5/XtnTl0WWd6MU1Ka434fFUGGosCLJbGNySDhHGvxQWoRWK137FXYFkYNWw==} engines: {node: '>=20'} '@napi-rs/lzma-linux-x64-gnu@1.5.1': @@ -858,41 +864,80 @@ packages: '@oxc-project/types@0.133.0': resolution: {integrity: sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==} + '@oxc-project/types@0.155.0': + resolution: {integrity: sha512-SeE8JPwW1xs1tHeNycjUtUBdhorRa8o4jlvjwk49R7/Z291i+4DQa7JJIgOm/TaYQZx+QrPQbVJ/9c8dMIZN8Q==} + '@playwright/test@1.63.0': resolution: {integrity: sha512-oxMK4vllB9RK5NQ2l1pq1IfOf2AvnEuj/vYGDj0H2nMtmtZpKtCwt/l00GEO6xjGfpBNAvjovvYdCm50dRQkpQ==} engines: {node: '>=20'} hasBin: true + '@rolldown/binding-android-arm-eabi@1.2.15': + resolution: {integrity: sha512-aLcgK9gIJ3YRvrrtfSBbRa27F5WrpiTaPulnFpsHPxpUHgFlSgnU4854MHwoRGEBhfRJDWCS2WQ7lIjskE9Olw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + '@rolldown/binding-android-arm64@1.0.3': resolution: {integrity: sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] + '@rolldown/binding-android-arm64@1.2.15': + resolution: {integrity: sha512-xD7DdZCrbThKuxNg7ooQmvp07ys4J/pnSEMTG3/OdOWl6daC67m/Q4fL78sRHMxTH/N4fGUbYhcPM0MF5WFHkg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@rolldown/binding-darwin-arm64@1.0.3': resolution: {integrity: sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] + '@rolldown/binding-darwin-arm64@1.2.15': + resolution: {integrity: sha512-m2WuQ6r0B4OTYxyPpNLtXaMRbRDUbG8YQV2Q3KTdSSK8Th6KHCnC8jVCJt8bvYeSB5WivkkNbc85mKadaSdOxA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@rolldown/binding-darwin-x64@1.0.3': resolution: {integrity: sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] + '@rolldown/binding-darwin-x64@1.2.15': + resolution: {integrity: sha512-5RtnsHM36nodM9WbMy+zip0LGS/G+y5wro5RHrpOlr4ac24+1zSi9kiV2MP1myZeZ/ifEHfulQcWjnAXzc2C2A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@rolldown/binding-freebsd-x64@1.0.3': resolution: {integrity: sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] + '@rolldown/binding-freebsd-x64@1.2.15': + resolution: {integrity: sha512-g3l09pyFqhu+135JKkbkwiKGQmwU5hUMUPJ4VdBADvuqR8d33L6H578rh8m7rtxbdp+VmX/+nzI7nvhSZlzpUQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + '@rolldown/binding-linux-arm-gnueabihf@1.0.3': resolution: {integrity: sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] + '@rolldown/binding-linux-arm-gnueabihf@1.2.15': + resolution: {integrity: sha512-nIe3VugI97nGQtspPxDqA4sXMUpeiocKIP/CqpY/u/vgbT+alX+cVxu1C/oVBPKg4feNTmYovE91v4DgXvXNwQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.0.3': resolution: {integrity: sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -900,6 +945,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-arm64-gnu@1.2.15': + resolution: {integrity: sha512-iTBjXx+B5QSvgI89lJfmqh4wTh8NabR1YZIIN3hNx4zSG0EVfVqkOvLulNpG4251pbd6/IAmZ/LefVk1Y4rPhw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-arm64-musl@1.0.3': resolution: {integrity: sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==} engines: {node: ^20.19.0 || >=22.12.0} @@ -907,6 +959,13 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-arm64-musl@1.2.15': + resolution: {integrity: sha512-uN26XOnVR7rqQupG3V9oAG2EGGatWjcJHOeDOHUFCh4TBWmP2tHTFoVN13aYbwfm0aHqJAEmcwhAu6sooIjfqQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + '@rolldown/binding-linux-ppc64-gnu@1.0.3': resolution: {integrity: sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -914,6 +973,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-ppc64-gnu@1.2.15': + resolution: {integrity: sha512-9nWkcdd+H+XhaA3fQIwpHnKIrfx/PQ6rO0pivr78Og07tXlUlctBBJoEYLPfhTmCR/QxEVdn6uPjHV5SymPhdw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-s390x-gnu@1.0.3': resolution: {integrity: sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -921,6 +987,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-s390x-gnu@1.2.15': + resolution: {integrity: sha512-Ggh0ciFjLwIusLSLz7LZYEaGdxOAUJXI+Qu5JCbhPJJHEt8vP+IjRATTJheiJsdzzTYgUiHUiw3X1Ea3ZpMBdA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.0.3': resolution: {integrity: sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -928,6 +1001,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.2.15': + resolution: {integrity: sha512-FHg60rS6DBePAYZ9X9F67x+JObFdmgn6tupA1C/a3B+CufFmTD4mX+e8M75tCiAO3foR/6xwVBI0KQiI7sn/rw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-x64-musl@1.0.3': resolution: {integrity: sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==} engines: {node: ^20.19.0 || >=22.12.0} @@ -935,12 +1015,25 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-x64-musl@1.2.15': + resolution: {integrity: sha512-/cvV/7v5VGz/moiz0XKRj2dE8DzsKyhIu1KpOvJGPjRywg3yscON889UGvAe8zfiJLHup7VLjBduoGWi3HusWQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + '@rolldown/binding-openharmony-arm64@1.0.3': resolution: {integrity: sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] + '@rolldown/binding-openharmony-arm64@1.2.15': + resolution: {integrity: sha512-MyzC5Hrv/sm+Z7TSGKP/j8001RO2xQm1zOpCNVL4j0cY/VhBZviludA2YFQ7i4lH6ZAXxQm0lcMdBzM+99mE7w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + '@rolldown/binding-wasm32-wasi@1.0.3': resolution: {integrity: sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -952,12 +1045,24 @@ packages: cpu: [arm64] os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.2.15': + resolution: {integrity: sha512-+PgYiS+AH5omy6L45ZLxybasauJaj3M8buoT83D+nzPmCayXlxUV9hydhciCKVyIg0B/v0BtXPDE1uGqNwCPpg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.3': resolution: {integrity: sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] + '@rolldown/binding-win32-x64-msvc@1.2.15': + resolution: {integrity: sha512-HFZd2QNQYn1JbIi+Hpd7H+r/lkWxcfIu28nirZ6eCn2LafuvmExMlb/P96Sfx5tf7pPArw39IdhmCF8vmV+NhQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} @@ -1252,8 +1357,8 @@ packages: peerDependencies: vite: ^5.2.0 || ^6 || ^7 || ^8 - '@tanstack/history@1.162.0': - resolution: {integrity: sha512-79pf/RkhteYZTRgcR4F9kbk84P2N8rugQJswxfIqovlbRiT3yI7eBE+5QorIrZaOKktsgzRlXh1l/du/xpl4iA==} + '@tanstack/history@1.162.4': + resolution: {integrity: sha512-utTS5L2OkeYUzXGohL1Z8sefu1GLNOJcxe8Hd6iIdc/Xo1K1nDB2JEp4iSFhvYh33xKC9V91TxrS8qfrpoKobQ==} engines: {node: '>=20.19'} '@tanstack/query-core@5.101.0': @@ -1273,26 +1378,26 @@ packages: peerDependencies: react: ^18 || ^19 - '@tanstack/react-router@1.170.11': - resolution: {integrity: sha512-gP2vzdyaI8Ow/Uz/MRPfK2wN09YwRI0Y/oF74Wuy9R3KmjbfJv2tLrkM+Onu1xWklSn3ugZarMPJXRE0kzrJTA==} + '@tanstack/react-router@1.170.41': + resolution: {integrity: sha512-Mpvw8Wm5MGDbTqI8Yc9flLKxbOHwoWocv0H2aGKcgw2a017oK5nZWqa954P+DrUx/8fI98YNywnHP5XcD3tQ9w==} engines: {node: '>=20.19'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-client@1.168.8': - resolution: {integrity: sha512-CW2P0riDN+IQCuXx33R1H0ONEW3NespMfb2t6qSesOyuoPjnh4earDKaZsWYEVvewzx8465BOhOmh+nxEJRjJg==} + '@tanstack/react-start-client@1.168.39': + resolution: {integrity: sha512-Uby0uo37JlQgUKHU0snDwH9nYiEeAjm9+7pUOFgycU/UszEILC2SO2DSCoNnCMuHKj9z+4URKzBYIP2exT9+wg==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-rsc@0.1.18': - resolution: {integrity: sha512-pfekO3dvSLacSUW2kUJGnhfdNTo6rgQE6QjQzPaDsjUaNXT4zVWgbaqM0R6kXhwkGA69L1ZbBqtIXBwTQCrJzg==} + '@tanstack/react-start-rsc@0.1.59': + resolution: {integrity: sha512-M2Lqxkk5C1zQncQs5paqX+/OLdOht51pg6D84YfLMrNsjhU/nzb6wd92MIja0mi5i23+L+fxLLjQYR2DObjBlw==} engines: {node: '>=22.12.0'} peerDependencies: '@rspack/core': '>=2.0.0-0' - '@vitejs/plugin-rsc': '>=0.5.20' + '@vitejs/plugin-rsc': '>=0.5.30' react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' react-server-dom-rspack: '>=0.0.2' @@ -1304,15 +1409,15 @@ packages: react-server-dom-rspack: optional: true - '@tanstack/react-start-server@1.167.14': - resolution: {integrity: sha512-Cma1M0ofxPxpmax1aQp6NM38N62MCgfEmto6RqfptZHd5UOlMp1dFf5zsnEukJq6vDVxg4lQyUgE2+qJuo2PmA==} + '@tanstack/react-start-server@1.167.46': + resolution: {integrity: sha512-K7z8xBOEdp8u5CZCxWrbS0tFtk5XZGMdhssLeZlRZKlLDbX7BKLdMtJ7th5sR6QVt9MTUAg3LcoqvJMPSFF+lg==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start@1.168.19': - resolution: {integrity: sha512-UGguzD22ZdxZmz/Rcw2My/L40il/S51adm1zARclr7zkhoQfV7WlgBxjskPi5ngiOYAPlI7847Ptz8we5TSM3Q==} + '@tanstack/react-start@1.168.60': + resolution: {integrity: sha512-WMOM0Xlh2lPbVlbjYM6uOxOpiaWRPvODm/dwkLsGKq5tjyHOHZmKckJgwlrZl7OQUqFlOZHYj8bKUTgoeg8cUQ==} engines: {node: '>=22.12.0'} peerDependencies: '@rsbuild/core': ^2.0.0 @@ -1328,26 +1433,26 @@ packages: vite: optional: true - '@tanstack/react-store@0.9.3': - resolution: {integrity: sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg==} + '@tanstack/react-store@0.11.2': + resolution: {integrity: sha512-oj5O5DmiMWE+ih+SioX2ayC1kbK7d3fpLx0B75fPJr9nY3zU+hoW010yr64qXsY/9fyiLVE2bn5mGNV3owm8RQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/router-core@1.171.9': - resolution: {integrity: sha512-QM5ZwLT9c5ZcTJW0QQZRRIBC4qjImUyUCXCVyuYVOF9xr76XLsJSX4F2dOxr9VptAv+W+TkWNOYdX8VaO9kdgA==} + '@tanstack/router-core@1.171.34': + resolution: {integrity: sha512-X+19pGuuLVPvvAvPYw9v/+ktRk5cCll8AtfpBpOhDRmVgUMrfqze0467xtq8YRVVs/mmo5rVtWn/7Tp32RDBKw==} engines: {node: '>=20.19'} - '@tanstack/router-generator@1.167.13': - resolution: {integrity: sha512-DldbCjA8S/CXQBuoyQqr76xqZe9k+H1ymV+ugj2IBHFi4yRzx4z4f2nSsPYlLdpXD2Cf/MEjLncaG7ceY5H5ig==} + '@tanstack/router-generator@1.167.40': + resolution: {integrity: sha512-WkEueqEvsBBudzO0fx1nWfOmRNW8OAvBoVABTGls9bAWzjdC+KDGHvjCNrvn88ofs1F6gqL8aWnzKCbxW3dCyQ==} engines: {node: '>=20.19'} - '@tanstack/router-plugin@1.168.14': - resolution: {integrity: sha512-z+3vYJ7ouNnMzBIC1hsNWsxaQFu9Gf0WSdE3jBHWa326ipnONqDD5KeCqWGczq0HMdZY4UsDjyfvjucxXhrb0A==} + '@tanstack/router-plugin@1.168.42': + resolution: {integrity: sha512-vAR5WXJh/ErseEWQftDhsJcr2c++ucRQ6FbqN3ygMO44+ZxxRfW3sIpZmddHROVSmBk8jc6MrwjTPNjVhd62Vw==} engines: {node: '>=20.19'} peerDependencies: '@rsbuild/core': '>=1.0.2 || ^2.0.0' - '@tanstack/react-router': ^1.170.11 + '@tanstack/react-router': ^1.170.41 vite: '>=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0' vite-plugin-solid: ^2.11.10 || ^3.0.0-0 webpack: '>=5.92.0' @@ -1363,20 +1468,20 @@ packages: webpack: optional: true - '@tanstack/router-utils@1.162.1': - resolution: {integrity: sha512-62layyTGmclHDQS/eidwKRfN1hhCKwViG7iEBcVmL0MXgcAB3OOucWCEcDDGd9Cu11H6b4QQ5oOo47MWIqwz0A==} + '@tanstack/router-utils@1.162.3': + resolution: {integrity: sha512-Icb0xGuG1+54IV0WMLRcc3ErTx2HeJWyPG661FkQ8UT6guoBq1FJjFRqlG/JS0xi4mFFkBhvwO7tbLa32f3yxA==} engines: {node: '>=20.19'} - '@tanstack/start-client-core@1.170.7': - resolution: {integrity: sha512-LKNHeK3n8DZ2ub1KpidWCISvJNq7wGuErrd2oSyoUDHSo90ldl7JJcG4OpbDS7GQjqIZ79M47eklajwgKXBxrQ==} + '@tanstack/start-client-core@1.170.34': + resolution: {integrity: sha512-LfwZSbau2MLLZ/uPAoO+NC9fK3J66c0wLhnNQqIa+Goqw7bXPjkHwlsjY7evlUz1AnyhhQ1Qab95v+VmP0TZ9A==} engines: {node: '>=22.12.0'} '@tanstack/start-fn-stubs@1.162.0': resolution: {integrity: sha512-QWfUZ3Yo923tdQn38LyKMU8rcTw69zc+T4dAvgTWV4O56SqFRsGfS0lSWIMhJRwXIx/bvdi7nTUBDdZtTHtpTQ==} engines: {node: '>=22.12.0'} - '@tanstack/start-plugin-core@1.171.11': - resolution: {integrity: sha512-f6z9W8lYveloSLFocMGfUrS4UL2sc0qrJiB0cuhs885W/bRE1iG0Vm9cNhM/khWxrLmWNeN5eelcnfB77QjLJg==} + '@tanstack/start-plugin-core@1.171.49': + resolution: {integrity: sha512-HPOb7LnMc71k38cd5uvMybPPUU/Q/56KvSqQzSWz7cps1ZDFXaxUM6EFaFHLCdgTWqGexNGDdRE+sUVPVBM4Xg==} engines: {node: '>=22.12.0'} peerDependencies: '@rsbuild/core': ^2.0.0 @@ -1387,16 +1492,16 @@ packages: vite: optional: true - '@tanstack/start-server-core@1.169.9': - resolution: {integrity: sha512-i2OXl+svinZI+7tE2FTQSc9vLIMp0/3nQAI47zg7cZ/0btmC2g2wVrEUa7pF4bmS2TrKEfmOancbURWfB2YrkA==} + '@tanstack/start-server-core@1.169.39': + resolution: {integrity: sha512-pqqkxhXY46nuFSYt6TsMGyABiplUzHFHndKAlRRGC0fWDrJCH1koWxVMoxySa51ZETV79f/z73b5UZ1jfIkXwQ==} engines: {node: '>=22.12.0'} - '@tanstack/start-storage-context@1.167.11': - resolution: {integrity: sha512-19wywJH3jiamctg4BxXme0G9iH+P5qHSILxBbyksTK727shDEZPb6V/NzO2dz4cKFAoB6TdBcKBj/guADClOfQ==} + '@tanstack/start-storage-context@1.167.36': + resolution: {integrity: sha512-x+xCXK2GtFzY6NbXqAg8YpU6cwAjDfMeYSNzxfGzntpjbwBRHHrXeC/kYUnBBQCV7wK4kJ8vBBQGP0OyYTasUg==} engines: {node: '>=22.12.0'} - '@tanstack/store@0.9.3': - resolution: {integrity: sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==} + '@tanstack/store@0.11.2': + resolution: {integrity: sha512-sJ4mjol8uQsHV0gOJzzjwXfh2Fwm+Sz0+8deqiTm4jGbMdjzNSW+xZCFm0kUa870uhd8yi+DpKnZb5Kc4apa0Q==} '@tanstack/virtual-file-routes@1.162.0': resolution: {integrity: sha512-uhOeFyxLcU41HzvrxsGpiWdcMbScY1EDgbZ5K7DVRMYInbLYWAC0EA/kx9wXAoSM8q82bUG2hRl8+EAjE6XAbA==} @@ -2113,6 +2218,9 @@ packages: exsolve@1.0.8: resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + exsolve@1.1.3: + resolution: {integrity: sha512-kuzL9zherLQoqDeQaS55AiiIg1kb4KYXaSusTtgZTPlvKP2gGCI82LNmBNh5RjDVUXIcmgx+/Mx7vPwRzBbhJA==} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -2490,30 +2598,60 @@ packages: cpu: [arm64] os: [android] + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + lightningcss-darwin-arm64@1.32.0: resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + lightningcss-darwin-x64@1.32.0: resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + lightningcss-freebsd-x64@1.32.0: resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + lightningcss-linux-arm-gnueabihf@1.32.0: resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + lightningcss-linux-arm64-gnu@1.32.0: resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} engines: {node: '>= 12.0.0'} @@ -2521,6 +2659,13 @@ packages: os: [linux] libc: [glibc] + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + lightningcss-linux-arm64-musl@1.32.0: resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} @@ -2528,6 +2673,13 @@ packages: os: [linux] libc: [musl] + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + lightningcss-linux-x64-gnu@1.32.0: resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} @@ -2535,6 +2687,13 @@ packages: os: [linux] libc: [glibc] + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + lightningcss-linux-x64-musl@1.32.0: resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} @@ -2542,22 +2701,45 @@ packages: os: [linux] libc: [musl] + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + lightningcss-win32-arm64-msvc@1.32.0: resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + lightningcss-win32-x64-msvc@1.32.0: resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + lightningcss@1.32.0: resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} + engines: {node: '>= 12.0.0'} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -2914,6 +3096,10 @@ packages: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + pkce-challenge@5.0.1: resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} engines: {node: '>=16.20.0'} @@ -2940,8 +3126,8 @@ packages: resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} engines: {node: '>=20'} - prettier@3.8.2: - resolution: {integrity: sha512-8c3mgTe0ASwWAJK+78dpviD+A8EqhndQPUBpNUIPt6+xWlIigCwfN01lWr9MAede4uqXGTEKeQWTvzb3vjia0Q==} + prettier@3.9.10: + resolution: {integrity: sha512-skGHTH1Yb9QvaTC4hWnRTzEYtCpApF0UMBPz+t/0ZPzP8ihefo/btKd+QA7pUE0fEwA1SbS/NmhyEcstdXOIdA==} engines: {node: '>=14'} hasBin: true @@ -3054,6 +3240,11 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + rolldown@1.2.15: + resolution: {integrity: sha512-6odND+fel5zVw3I4Yc2e69gvguDnX0CAAGiNDZSq4ik5WUcaLrkD2GLuog0XcODbor31hZ5ayEMgVDno+KPV5g==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup@4.62.4: resolution: {integrity: sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -3094,15 +3285,15 @@ packages: resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} engines: {node: '>= 18'} - seroval-plugins@1.5.4: - resolution: {integrity: sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw==} + seroval-plugins@1.6.12: + resolution: {integrity: sha512-+reiwp/lYxiyctSrdvX7OQ1YLrcbWYgBiZrhSFL+V43b0/DGRLNVSDyZINbQe+tWplPOI2fw2dPrdv6hcc09kQ==} engines: {node: '>=10'} peerDependencies: - seroval: ^1.0 + seroval: 1.7.0 - seroval@1.5.4: - resolution: {integrity: sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw==} - engines: {node: '>=10'} + seroval@1.7.0: + resolution: {integrity: sha512-FU+LUkmDzWNsJ6oubZFN3dGPKny53DRhPJG6nftEaXDL8MIn19+kEE1Gvc+63Go+qPOwVUlKIdKhsu2HN6tksw==} + engines: {node: '>=20'} serve-static@2.2.1: resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} @@ -3162,8 +3353,8 @@ packages: react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + source-map-js@1.2.2: + resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} engines: {node: '>=0.10.0'} source-map-support@0.5.21: @@ -3190,6 +3381,11 @@ packages: engines: {node: '>=20.16.0'} hasBin: true + srvx@0.11.22: + resolution: {integrity: sha512-LqZxxBDMKuMAZzFzJnDCkFOrs9MZQZr0LvHiO/SuSZVdQaXD7xQ5UWTUxheJrQPve1qk9MG2B/yttUvJxw8egQ==} + engines: {node: '>=20.16.0'} + hasBin: true + statuses@2.0.2: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} @@ -3351,9 +3547,41 @@ packages: resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} engines: {node: '>=18.12.0'} - unplugin@3.0.0: - resolution: {integrity: sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==} + unplugin@3.4.0: + resolution: {integrity: sha512-9skdIFlCsPdFV7wUfZxNsFInlW+7nJmGu2gkTu0OUhF56aXGsHab9x52/QhdJ4lC7ZDPWTxbiC4ANqVlsuaW3w==} engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@farmfe/core': '*' + '@rsbuild/core': '*' + '@rspack/core': '*' + bun-types-no-globals: '*' + esbuild: 0.28.1 + rolldown: '*' + rollup: '*' + unloader: '*' + vite: '*' + webpack: '*' + peerDependenciesMeta: + '@farmfe/core': + optional: true + '@rsbuild/core': + optional: true + '@rspack/core': + optional: true + bun-types-no-globals: + optional: true + esbuild: + optional: true + rolldown: + optional: true + rollup: + optional: true + unloader: + optional: true + vite: + optional: true + webpack: + optional: true unstorage@2.0.0-alpha.7: resolution: {integrity: sha512-ELPztchk2zgFJnakyodVY3vJWGW9jy//keJ32IOJVGUMyaPydwcA1FtVvWqT0TNRch9H+cMNEGllfVFfScImog==} @@ -3464,13 +3692,13 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@8.0.16: - resolution: {integrity: sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==} + vite@8.3.5: + resolution: {integrity: sha512-z1YpjieJ9g0ebTmQpLBv/oq9E3F9EIlOe+7LahW8SrE3LTiG3udBRUXQOlYXP9b+IC2q2phHeVxj9xGlw34OEQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.1.18 + '@vitejs/devtools': ^0.7.1 || ^0.8.0 esbuild: 0.28.1 jiti: '>=1.21.0' less: ^4.0.0 @@ -3584,6 +3812,9 @@ packages: zod@4.4.3: resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zod@4.6.7: + resolution: {integrity: sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==} + zustand@4.5.7: resolution: {integrity: sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==} engines: {node: '>=12.7.0'} @@ -3843,15 +4074,15 @@ snapshots: '@aws/lambda-invoke-store@0.2.4': {} - '@babel/code-frame@7.27.1': + '@babel/code-frame@7.29.0': dependencies: - '@babel/helper-validator-identifier': 7.29.7 + '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/code-frame@7.29.0': + '@babel/code-frame@7.29.7': dependencies: - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-validator-identifier': 7.29.7 js-tokens: 4.0.0 picocolors: 1.1.1 @@ -4036,6 +4267,12 @@ snapshots: '@babel/parser': 7.29.2 '@babel/types': 7.29.0 + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + '@babel/traverse@7.29.0': dependencies: '@babel/code-frame': 7.29.0 @@ -4395,7 +4632,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@modelcontextprotocol/core@2.0.0': + '@modelcontextprotocol/core@2.3.1': dependencies: zod: 4.4.3 @@ -4421,9 +4658,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@modelcontextprotocol/server@2.0.0': + '@modelcontextprotocol/server@2.3.1': dependencies: - '@modelcontextprotocol/core': 2.0.0 + '@modelcontextprotocol/core': 2.3.1 zod: 4.4.3 '@napi-rs/lzma-linux-x64-gnu@1.5.1': @@ -4479,46 +4716,87 @@ snapshots: '@oxc-project/types@0.133.0': {} + '@oxc-project/types@0.155.0': {} + '@playwright/test@1.63.0': dependencies: playwright: 1.63.0 + '@rolldown/binding-android-arm-eabi@1.2.15': + optional: true + '@rolldown/binding-android-arm64@1.0.3': optional: true + '@rolldown/binding-android-arm64@1.2.15': + optional: true + '@rolldown/binding-darwin-arm64@1.0.3': optional: true + '@rolldown/binding-darwin-arm64@1.2.15': + optional: true + '@rolldown/binding-darwin-x64@1.0.3': optional: true + '@rolldown/binding-darwin-x64@1.2.15': + optional: true + '@rolldown/binding-freebsd-x64@1.0.3': optional: true + '@rolldown/binding-freebsd-x64@1.2.15': + optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.3': optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.2.15': + optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.3': optional: true + '@rolldown/binding-linux-arm64-gnu@1.2.15': + optional: true + '@rolldown/binding-linux-arm64-musl@1.0.3': optional: true + '@rolldown/binding-linux-arm64-musl@1.2.15': + optional: true + '@rolldown/binding-linux-ppc64-gnu@1.0.3': optional: true + '@rolldown/binding-linux-ppc64-gnu@1.2.15': + optional: true + '@rolldown/binding-linux-s390x-gnu@1.0.3': optional: true + '@rolldown/binding-linux-s390x-gnu@1.2.15': + optional: true + '@rolldown/binding-linux-x64-gnu@1.0.3': optional: true + '@rolldown/binding-linux-x64-gnu@1.2.15': + optional: true + '@rolldown/binding-linux-x64-musl@1.0.3': optional: true + '@rolldown/binding-linux-x64-musl@1.2.15': + optional: true + '@rolldown/binding-openharmony-arm64@1.0.3': optional: true + '@rolldown/binding-openharmony-arm64@1.2.15': + optional: true + '@rolldown/binding-wasm32-wasi@1.0.3': dependencies: '@emnapi/core': 1.10.0 @@ -4529,9 +4807,15 @@ snapshots: '@rolldown/binding-win32-arm64-msvc@1.0.3': optional: true + '@rolldown/binding-win32-arm64-msvc@1.2.15': + optional: true + '@rolldown/binding-win32-x64-msvc@1.0.3': optional: true + '@rolldown/binding-win32-x64-msvc@1.2.15': + optional: true + '@rolldown/pluginutils@1.0.1': {} '@rollup/pluginutils@5.4.0(rollup@4.62.4)': @@ -4680,7 +4964,7 @@ snapshots: jiti: 2.7.0 lightningcss: 1.32.0 magic-string: 0.30.21 - source-map-js: 1.2.1 + source-map-js: 1.2.2 tailwindcss: 4.3.0 '@tailwindcss/oxide-android-arm64@4.3.0': @@ -4734,14 +5018,14 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.3.0 '@tailwindcss/oxide-win32-x64-msvc': 4.3.0 - '@tailwindcss/vite@4.3.0(vite@8.0.16(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0))': + '@tailwindcss/vite@4.3.0(vite@8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0))': dependencies: '@tailwindcss/node': 4.3.0 '@tailwindcss/oxide': 4.3.0 tailwindcss: 4.3.0 - vite: 8.0.16(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0) + vite: 8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0) - '@tanstack/history@1.162.0': {} + '@tanstack/history@1.162.4': {} '@tanstack/query-core@5.101.0': {} @@ -4758,131 +5042,141 @@ snapshots: '@tanstack/query-core': 5.101.0 react: 19.2.5 - '@tanstack/react-router@1.170.11(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@tanstack/react-router@1.170.41(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: - '@tanstack/history': 1.162.0 - '@tanstack/react-store': 0.9.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@tanstack/router-core': 1.171.9 + '@tanstack/history': 1.162.4 + '@tanstack/react-store': 0.11.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@tanstack/router-core': 1.171.34 isbot: 5.1.40 react: 19.2.5 react-dom: 19.2.5(react@19.2.5) - '@tanstack/react-start-client@1.168.8(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@tanstack/react-start-client@1.168.39(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: - '@tanstack/react-router': 1.170.11(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@tanstack/router-core': 1.171.9 - '@tanstack/start-client-core': 1.170.7 + '@tanstack/react-router': 1.170.41(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@tanstack/router-core': 1.171.34 + '@tanstack/start-client-core': 1.170.34 react: 19.2.5 react-dom: 19.2.5(react@19.2.5) - '@tanstack/react-start-rsc@0.1.18(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@8.0.16(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0))': + '@tanstack/react-start-rsc@0.1.59(crossws@0.4.5(srvx@0.11.22))(esbuild@0.28.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(rolldown@1.2.15)(rollup@4.62.4)(vite@8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0))': dependencies: - '@tanstack/react-router': 1.170.11(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@tanstack/react-start-server': 1.167.14(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@tanstack/router-core': 1.171.9 - '@tanstack/router-utils': 1.162.1 - '@tanstack/start-client-core': 1.170.7 + '@tanstack/react-router': 1.170.41(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@tanstack/router-core': 1.171.34 + '@tanstack/router-utils': 1.162.3 + '@tanstack/start-client-core': 1.170.34 '@tanstack/start-fn-stubs': 1.162.0 - '@tanstack/start-plugin-core': 1.171.11(@tanstack/react-router@1.170.11(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(crossws@0.4.5(srvx@0.11.16))(vite@8.0.16(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0)) - '@tanstack/start-server-core': 1.169.9(crossws@0.4.5(srvx@0.11.16)) - '@tanstack/start-storage-context': 1.167.11 + '@tanstack/start-plugin-core': 1.171.49(@tanstack/react-router@1.170.41(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(crossws@0.4.5(srvx@0.11.22))(esbuild@0.28.1)(rolldown@1.2.15)(rollup@4.62.4)(vite@8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0)) + '@tanstack/start-storage-context': 1.167.36 pathe: 2.0.3 react: 19.2.5 react-dom: 19.2.5(react@19.2.5) transitivePeerDependencies: + - '@farmfe/core' - '@rsbuild/core' + - bun-types-no-globals - crossws + - esbuild + - rolldown + - rollup - supports-color + - unloader - vite - vite-plugin-solid - webpack - '@tanstack/react-start-server@1.167.14(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@tanstack/react-start-server@1.167.46(crossws@0.4.5(srvx@0.11.22))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: - '@tanstack/history': 1.162.0 - '@tanstack/react-router': 1.170.11(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@tanstack/router-core': 1.171.9 - '@tanstack/start-client-core': 1.170.7 - '@tanstack/start-server-core': 1.169.9(crossws@0.4.5(srvx@0.11.16)) + '@tanstack/react-router': 1.170.41(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@tanstack/router-core': 1.171.34 + '@tanstack/start-server-core': 1.169.39(crossws@0.4.5(srvx@0.11.22)) react: 19.2.5 react-dom: 19.2.5(react@19.2.5) transitivePeerDependencies: - crossws - '@tanstack/react-start@1.168.19(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@8.0.16(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0))': + '@tanstack/react-start@1.168.60(crossws@0.4.5(srvx@0.11.22))(esbuild@0.28.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(rolldown@1.2.15)(rollup@4.62.4)(vite@8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0))': dependencies: - '@tanstack/react-router': 1.170.11(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@tanstack/react-start-client': 1.168.8(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@tanstack/react-start-rsc': 0.1.18(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vite@8.0.16(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0)) - '@tanstack/react-start-server': 1.167.14(crossws@0.4.5(srvx@0.11.16))(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@tanstack/router-utils': 1.162.1 - '@tanstack/start-client-core': 1.170.7 - '@tanstack/start-plugin-core': 1.171.11(@tanstack/react-router@1.170.11(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(crossws@0.4.5(srvx@0.11.16))(vite@8.0.16(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0)) - '@tanstack/start-server-core': 1.169.9(crossws@0.4.5(srvx@0.11.16)) + '@tanstack/react-router': 1.170.41(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@tanstack/react-start-client': 1.168.39(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@tanstack/react-start-rsc': 0.1.59(crossws@0.4.5(srvx@0.11.22))(esbuild@0.28.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(rolldown@1.2.15)(rollup@4.62.4)(vite@8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0)) + '@tanstack/react-start-server': 1.167.46(crossws@0.4.5(srvx@0.11.22))(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@tanstack/router-utils': 1.162.3 + '@tanstack/start-client-core': 1.170.34 + '@tanstack/start-plugin-core': 1.171.49(@tanstack/react-router@1.170.41(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(crossws@0.4.5(srvx@0.11.22))(esbuild@0.28.1)(rolldown@1.2.15)(rollup@4.62.4)(vite@8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0)) + '@tanstack/start-server-core': 1.169.39(crossws@0.4.5(srvx@0.11.22)) pathe: 2.0.3 react: 19.2.5 react-dom: 19.2.5(react@19.2.5) optionalDependencies: - vite: 8.0.16(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0) + vite: 8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0) transitivePeerDependencies: + - '@farmfe/core' - '@rspack/core' + - bun-types-no-globals - crossws + - esbuild - react-server-dom-rspack + - rolldown + - rollup - supports-color + - unloader - vite-plugin-solid - webpack - '@tanstack/react-store@0.9.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@tanstack/react-store@0.11.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: - '@tanstack/store': 0.9.3 + '@tanstack/store': 0.11.2 react: 19.2.5 react-dom: 19.2.5(react@19.2.5) use-sync-external-store: 1.6.0(react@19.2.5) - '@tanstack/router-core@1.171.9': + '@tanstack/router-core@1.171.34': dependencies: - '@tanstack/history': 1.162.0 + '@tanstack/history': 1.162.4 cookie-es: 3.1.1 - seroval: 1.5.4 - seroval-plugins: 1.5.4(seroval@1.5.4) + seroval: 1.7.0 + seroval-plugins: 1.6.12(seroval@1.7.0) - '@tanstack/router-generator@1.167.13': + '@tanstack/router-generator@1.167.40': dependencies: '@babel/types': 7.29.8 - '@tanstack/router-core': 1.171.9 - '@tanstack/router-utils': 1.162.1 + '@tanstack/router-core': 1.171.34 + '@tanstack/router-utils': 1.162.3 '@tanstack/virtual-file-routes': 1.162.0 jiti: 2.7.0 magic-string: 0.30.21 - prettier: 3.8.2 - zod: 4.4.3 + prettier: 3.9.10 + zod: 4.6.7 transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.168.14(@tanstack/react-router@1.170.11(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.16(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0))': + '@tanstack/router-plugin@1.168.42(@tanstack/react-router@1.170.41(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(esbuild@0.28.1)(rolldown@1.2.15)(rollup@4.62.4)(vite@8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0))': dependencies: '@babel/core': 7.29.6 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.6) - '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.6) - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/template': 7.29.7 '@babel/types': 7.29.8 - '@tanstack/router-core': 1.171.9 - '@tanstack/router-generator': 1.167.13 - '@tanstack/router-utils': 1.162.1 - '@tanstack/virtual-file-routes': 1.162.0 + '@tanstack/router-core': 1.171.34 + '@tanstack/router-generator': 1.167.40 + '@tanstack/router-utils': 1.162.3 chokidar: 5.0.0 - unplugin: 3.0.0 - zod: 4.4.3 + unplugin: 3.4.0(esbuild@0.28.1)(rolldown@1.2.15)(rollup@4.62.4)(vite@8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0)) + zod: 4.6.7 optionalDependencies: - '@tanstack/react-router': 1.170.11(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - vite: 8.0.16(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0) + '@tanstack/react-router': 1.170.41(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + vite: 8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0) transitivePeerDependencies: + - '@farmfe/core' + - '@rspack/core' + - bun-types-no-globals + - esbuild + - rolldown + - rollup - supports-color + - unloader - '@tanstack/router-utils@1.162.1': + '@tanstack/router-utils@1.162.3': dependencies: - '@babel/core': 7.29.6 '@babel/generator': 7.29.8 '@babel/parser': 7.29.8 '@babel/types': 7.29.8 @@ -4894,65 +5188,71 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/start-client-core@1.170.7': + '@tanstack/start-client-core@1.170.34': dependencies: - '@tanstack/router-core': 1.171.9 + '@tanstack/router-core': 1.171.34 '@tanstack/start-fn-stubs': 1.162.0 - '@tanstack/start-storage-context': 1.167.11 - seroval: 1.5.4 + '@tanstack/start-storage-context': 1.167.36 + seroval: 1.7.0 '@tanstack/start-fn-stubs@1.162.0': {} - '@tanstack/start-plugin-core@1.171.11(@tanstack/react-router@1.170.11(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(crossws@0.4.5(srvx@0.11.16))(vite@8.0.16(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0))': + '@tanstack/start-plugin-core@1.171.49(@tanstack/react-router@1.170.41(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(crossws@0.4.5(srvx@0.11.22))(esbuild@0.28.1)(rolldown@1.2.15)(rollup@4.62.4)(vite@8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0))': dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.7 '@babel/core': 7.29.6 '@babel/types': 7.29.8 - '@rolldown/pluginutils': 1.0.1 - '@tanstack/router-core': 1.171.9 - '@tanstack/router-generator': 1.167.13 - '@tanstack/router-plugin': 1.168.14(@tanstack/react-router@1.170.11(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.16(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0)) - '@tanstack/router-utils': 1.162.1 - '@tanstack/start-client-core': 1.170.7 - '@tanstack/start-server-core': 1.169.9(crossws@0.4.5(srvx@0.11.16)) - exsolve: 1.0.8 - lightningcss: 1.32.0 + '@jridgewell/remapping': 2.3.5 + '@tanstack/router-core': 1.171.34 + '@tanstack/router-generator': 1.167.40 + '@tanstack/router-plugin': 1.168.42(@tanstack/react-router@1.170.41(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(esbuild@0.28.1)(rolldown@1.2.15)(rollup@4.62.4)(vite@8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0)) + '@tanstack/router-utils': 1.162.3 + '@tanstack/start-server-core': 1.169.39(crossws@0.4.5(srvx@0.11.22)) + exsolve: 1.1.3 + lightningcss: 1.33.0 pathe: 2.0.3 - picomatch: 4.0.4 - seroval: 1.5.4 + picomatch: 4.0.7 + seroval: 1.7.0 source-map: 0.7.6 - srvx: 0.11.16 + srvx: 0.11.22 tinyglobby: 0.2.17 ufo: 1.6.4 - vitefu: 1.1.3(vite@8.0.16(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0)) + vitefu: 1.1.3(vite@8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0)) xmlbuilder2: 4.0.3 - zod: 4.4.3 + zod: 4.6.7 optionalDependencies: - vite: 8.0.16(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0) + vite: 8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0) transitivePeerDependencies: + - '@farmfe/core' + - '@rspack/core' - '@tanstack/react-router' + - bun-types-no-globals - crossws + - esbuild + - rolldown + - rollup - supports-color + - unloader - vite-plugin-solid - webpack - '@tanstack/start-server-core@1.169.9(crossws@0.4.5(srvx@0.11.16))': + '@tanstack/start-server-core@1.169.39(crossws@0.4.5(srvx@0.11.22))': dependencies: - '@tanstack/history': 1.162.0 - '@tanstack/router-core': 1.171.9 - '@tanstack/start-client-core': 1.170.7 - '@tanstack/start-storage-context': 1.167.11 + '@tanstack/history': 1.162.4 + '@tanstack/router-core': 1.171.34 + '@tanstack/start-client-core': 1.170.34 + '@tanstack/start-storage-context': 1.167.36 fetchdts: 0.1.7 - h3-v2: h3@2.0.1-rc.20(crossws@0.4.5(srvx@0.11.16)) - seroval: 1.5.4 + h3-v2: h3@2.0.1-rc.20(crossws@0.4.5(srvx@0.11.22)) + seroval: 1.7.0 transitivePeerDependencies: - crossws - '@tanstack/start-storage-context@1.167.11': + '@tanstack/start-storage-context@1.167.36': dependencies: - '@tanstack/router-core': 1.171.9 + '@tanstack/router-core': 1.171.34 - '@tanstack/store@0.9.3': {} + '@tanstack/store@0.11.2': {} '@tanstack/virtual-file-routes@1.162.0': {} @@ -5040,10 +5340,10 @@ snapshots: '@ungap/structured-clone@1.3.1': {} - '@vitejs/plugin-react@6.0.2(vite@8.0.16(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0))': + '@vitejs/plugin-react@6.0.2(vite@8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.0.16(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0) + vite: 8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0) '@xyflow/react@12.11.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: @@ -5264,6 +5564,11 @@ snapshots: optionalDependencies: srvx: 0.11.16 + crossws@0.4.5(srvx@0.11.22): + optionalDependencies: + srvx: 0.11.22 + optional: true + cssesc@3.0.0: {} csstype@3.2.3: {} @@ -5568,6 +5873,8 @@ snapshots: exsolve@1.0.8: {} + exsolve@1.1.3: {} + extend@3.0.2: {} fast-deep-equal@3.1.3: {} @@ -5602,6 +5909,10 @@ snapshots: optionalDependencies: picomatch: 4.0.4 + fdir@6.5.0(picomatch@4.0.7): + optionalDependencies: + picomatch: 4.0.7 + fetch-blob@3.2.0: dependencies: node-domexception: 1.0.0 @@ -5692,19 +6003,19 @@ snapshots: graceful-fs@4.2.11: {} - h3@2.0.1-rc.20(crossws@0.4.5(srvx@0.11.16)): + h3@2.0.1-rc.20(crossws@0.4.5(srvx@0.11.22)): dependencies: rou3: 0.8.1 - srvx: 0.11.16 + srvx: 0.11.22 optionalDependencies: - crossws: 0.4.5(srvx@0.11.16) + crossws: 0.4.5(srvx@0.11.22) - h3@2.0.1-rc.22(crossws@0.4.5(srvx@0.11.16)): + h3@2.0.1-rc.22(crossws@0.4.5(srvx@0.11.22)): dependencies: rou3: 0.8.1 srvx: 0.11.16 optionalDependencies: - crossws: 0.4.5(srvx@0.11.16) + crossws: 0.4.5(srvx@0.11.22) has-symbols@1.1.0: {} @@ -5920,36 +6231,69 @@ snapshots: lightningcss-android-arm64@1.32.0: optional: true + lightningcss-android-arm64@1.33.0: + optional: true + lightningcss-darwin-arm64@1.32.0: optional: true + lightningcss-darwin-arm64@1.33.0: + optional: true + lightningcss-darwin-x64@1.32.0: optional: true + lightningcss-darwin-x64@1.33.0: + optional: true + lightningcss-freebsd-x64@1.32.0: optional: true + lightningcss-freebsd-x64@1.33.0: + optional: true + lightningcss-linux-arm-gnueabihf@1.32.0: optional: true + lightningcss-linux-arm-gnueabihf@1.33.0: + optional: true + lightningcss-linux-arm64-gnu@1.32.0: optional: true + lightningcss-linux-arm64-gnu@1.33.0: + optional: true + lightningcss-linux-arm64-musl@1.32.0: optional: true + lightningcss-linux-arm64-musl@1.33.0: + optional: true + lightningcss-linux-x64-gnu@1.32.0: optional: true + lightningcss-linux-x64-gnu@1.33.0: + optional: true + lightningcss-linux-x64-musl@1.32.0: optional: true + lightningcss-linux-x64-musl@1.33.0: + optional: true + lightningcss-win32-arm64-msvc@1.32.0: optional: true + lightningcss-win32-arm64-msvc@1.33.0: + optional: true + lightningcss-win32-x64-msvc@1.32.0: optional: true + lightningcss-win32-x64-msvc@1.33.0: + optional: true + lightningcss@1.32.0: dependencies: detect-libc: 2.1.2 @@ -5966,6 +6310,22 @@ snapshots: lightningcss-win32-arm64-msvc: 1.32.0 lightningcss-win32-x64-msvc: 1.32.0 + lightningcss@1.33.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 + lines-and-columns@1.2.4: {} log-symbols@6.0.0: @@ -6343,13 +6703,13 @@ snapshots: nf3@0.3.17: {} - nitro@3.0.260603-beta(@libsql/client@0.14.0)(chokidar@5.0.0)(dotenv@17.4.1)(drizzle-orm@0.45.2(@libsql/client@0.14.0)(kysely@0.28.17))(jiti@2.7.0)(rollup@4.62.4)(vite@8.0.16(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0)): + nitro@3.0.260603-beta(@libsql/client@0.14.0)(chokidar@5.0.0)(dotenv@17.4.1)(drizzle-orm@0.45.2(@libsql/client@0.14.0)(kysely@0.28.17))(jiti@2.7.0)(rollup@4.62.4)(vite@8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0)): dependencies: consola: 3.4.2 crossws: 0.4.5(srvx@0.11.16) db0: 0.3.4(@libsql/client@0.14.0)(drizzle-orm@0.45.2(@libsql/client@0.14.0)(kysely@0.28.17)) env-runner: 0.1.9 - h3: 2.0.1-rc.22(crossws@0.4.5(srvx@0.11.16)) + h3: 2.0.1-rc.22(crossws@0.4.5(srvx@0.11.22)) hookable: 6.1.1 nf3: 0.3.17 ocache: 0.1.4 @@ -6363,7 +6723,7 @@ snapshots: dotenv: 17.4.1 jiti: 2.7.0 rollup: 4.62.4 - vite: 8.0.16(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0) + vite: 8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -6510,6 +6870,8 @@ snapshots: picomatch@4.0.4: {} + picomatch@4.0.7: {} + pkce-challenge@5.0.1: {} playwright-core@1.63.0: {} @@ -6527,11 +6889,11 @@ snapshots: dependencies: nanoid: 3.3.18 picocolors: 1.1.1 - source-map-js: 1.2.1 + source-map-js: 1.2.2 powershell-utils@0.1.0: {} - prettier@3.8.2: {} + prettier@3.9.10: {} pretty-ms@9.3.0: dependencies: @@ -6693,6 +7055,27 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.3 '@rolldown/binding-win32-x64-msvc': 1.0.3 + rolldown@1.2.15: + dependencies: + '@oxc-project/types': 0.155.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm-eabi': 1.2.15 + '@rolldown/binding-android-arm64': 1.2.15 + '@rolldown/binding-darwin-arm64': 1.2.15 + '@rolldown/binding-darwin-x64': 1.2.15 + '@rolldown/binding-freebsd-x64': 1.2.15 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.15 + '@rolldown/binding-linux-arm64-gnu': 1.2.15 + '@rolldown/binding-linux-arm64-musl': 1.2.15 + '@rolldown/binding-linux-ppc64-gnu': 1.2.15 + '@rolldown/binding-linux-s390x-gnu': 1.2.15 + '@rolldown/binding-linux-x64-gnu': 1.2.15 + '@rolldown/binding-linux-x64-musl': 1.2.15 + '@rolldown/binding-openharmony-arm64': 1.2.15 + '@rolldown/binding-win32-arm64-msvc': 1.2.15 + '@rolldown/binding-win32-x64-msvc': 1.2.15 + rollup@4.62.4: dependencies: '@types/estree': 1.0.9 @@ -6769,11 +7152,11 @@ snapshots: transitivePeerDependencies: - supports-color - seroval-plugins@1.5.4(seroval@1.5.4): + seroval-plugins@1.6.12(seroval@1.7.0): dependencies: - seroval: 1.5.4 + seroval: 1.7.0 - seroval@1.5.4: {} + seroval@1.7.0: {} serve-static@2.2.1: dependencies: @@ -6875,7 +7258,7 @@ snapshots: react: 19.2.5 react-dom: 19.2.5(react@19.2.5) - source-map-js@1.2.1: {} + source-map-js@1.2.2: {} source-map-support@0.5.21: dependencies: @@ -6895,6 +7278,8 @@ snapshots: srvx@0.11.16: {} + srvx@0.11.22: {} + statuses@2.0.2: {} stdin-discarder@0.2.2: {} @@ -6956,8 +7341,8 @@ snapshots: tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 to-regex-range@5.0.1: dependencies: @@ -7059,11 +7444,16 @@ snapshots: picomatch: 4.0.4 webpack-virtual-modules: 0.6.2 - unplugin@3.0.0: + unplugin@3.4.0(esbuild@0.28.1)(rolldown@1.2.15)(rollup@4.62.4)(vite@8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0)): dependencies: '@jridgewell/remapping': 2.3.5 - picomatch: 4.0.4 + picomatch: 4.0.7 webpack-virtual-modules: 0.6.2 + optionalDependencies: + esbuild: 0.28.1 + rolldown: 1.2.15 + rollup: 4.62.4 + vite: 8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0) unstorage@2.0.0-alpha.7(chokidar@5.0.0)(db0@0.3.4(@libsql/client@0.14.0)(drizzle-orm@0.45.2(@libsql/client@0.14.0)(kysely@0.28.17)))(ofetch@2.0.0-alpha.3): optionalDependencies: @@ -7101,12 +7491,12 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@8.0.16(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0): + vite@8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0): dependencies: - lightningcss: 1.32.0 - picomatch: 4.0.4 + lightningcss: 1.33.0 + picomatch: 4.0.7 postcss: 8.5.25 - rolldown: 1.0.3 + rolldown: 1.2.15 tinyglobby: 0.2.17 optionalDependencies: '@types/node': 22.19.17 @@ -7115,9 +7505,9 @@ snapshots: jiti: 2.7.0 tsx: 4.21.0 - vitefu@1.1.3(vite@8.0.16(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0)): + vitefu@1.1.3(vite@8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0)): optionalDependencies: - vite: 8.0.16(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0) + vite: 8.3.5(@types/node@22.19.17)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.21.0) web-streams-polyfill@3.3.3: {} @@ -7167,6 +7557,8 @@ snapshots: zod@4.4.3: {} + zod@4.6.7: {} + zustand@4.5.7(@types/react@19.2.14)(react@19.2.5): dependencies: use-sync-external-store: 1.6.0(react@19.2.5) diff --git a/scripts/run-tests.mjs b/scripts/run-tests.mjs index 215a24a..6f9c69f 100644 --- a/scripts/run-tests.mjs +++ b/scripts/run-tests.mjs @@ -4,6 +4,9 @@ import { dirname, join } from 'node:path'; import { fileURLToPath } from 'node:url'; const root = join(dirname(fileURLToPath(import.meta.url)), '..'); +const configuredConcurrency = process.env.BEATDESIGN_TEST_CONCURRENCY?.trim(); +const testConcurrency = configuredConcurrency || + (process.platform === 'win32' ? '1' : undefined); const files = [ ...globSync('src/**/*.test.ts', { cwd: root }), ...globSync('src/**/*.test.tsx', { cwd: root }), @@ -18,7 +21,13 @@ if (files.length === 0) { const result = spawnSync( process.execPath, - ['--import', 'tsx', '--test', ...files], + [ + '--import', + 'tsx', + '--test', + ...(testConcurrency ? [`--test-concurrency=${testConcurrency}`] : []), + ...files, + ], { cwd: root, stdio: 'inherit', diff --git a/src/components/app/create-project-route-page.test.ts b/src/components/app/create-project-route-page.test.ts index 94bf924..060e54c 100644 --- a/src/components/app/create-project-route-page.test.ts +++ b/src/components/app/create-project-route-page.test.ts @@ -1,6 +1,9 @@ import assert from 'node:assert/strict'; import { readFileSync } from 'node:fs'; import test from 'node:test'; +import { createElement } from 'react'; +import { renderToStaticMarkup } from 'react-dom/server'; +import { CreateProjectRoutePage } from './create-project-route-page'; const source = readFileSync( new URL('./create-project-route-page.tsx', import.meta.url), @@ -9,10 +12,41 @@ const source = readFileSync( test('visiting Studio or Canvas does not create a project automatically', () => { assert.doesNotMatch(source, /useEffect/); - assert.match(source, /createProject\('studio'\)/); - assert.match(source, /createProject\('canvas'\)/); + assert.match( + source, + /onClick=\{\(\) => void createProject\(workspaceMode\)\}/ + ); assert.match(source, /appConfig\.app_logo/); - assert.match(source, /'\/api\/app\/projects'/); +}); + +test('direct entry only offers the workspace selected by its route', () => { + for (const workspaceMode of ['studio', 'canvas'] as const) { + const html = renderToStaticMarkup( + createElement(CreateProjectRoutePage, { + data: { + locale: 'en', + target: null, + model: null, + prompt: null, + projectName: 'Entry test', + workspaceMode, + }, + }) + ); + assert.equal((html.match(/]*disabled=""/); + assert.ok( + html.includes( + workspaceMode === 'canvas' ? 'Create in Canvas' : 'Create in Studio' + ) + ); + assert.ok( + !html.includes( + workspaceMode === 'canvas' ? 'Create in Studio' : 'Create in Canvas' + ) + ); + assert.ok(!html.includes('Choose Studio or Canvas')); + } }); test('the first-run screen covers the full viewport', () => { diff --git a/src/components/app/create-project-route-page.tsx b/src/components/app/create-project-route-page.tsx index a03c53d..28bd36c 100644 --- a/src/components/app/create-project-route-page.tsx +++ b/src/components/app/create-project-route-page.tsx @@ -1,20 +1,12 @@ -import { useState } from 'react'; import { AlertCircleIcon, Loader2Icon } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { appConfig } from '@/config'; import { normalizeLocale } from '@/config/locale'; import type { WorkspaceMode } from '@/config/workspace-modes'; -import { buildPostCreateProjectDetailPath } from '@/core/projects/project-entry'; -import { apiJsonPost } from '@/lib/api-client'; +import { useCreateProject } from '@/core/workspace-hooks/use-create-project'; import { m } from '@/paraglide/messages.js'; -type CreateProjectResponse = { - id?: string; - name?: string; - error?: string; -}; - export type CreateProjectRouteData = { locale: string; target: string | null; @@ -42,11 +34,11 @@ function getCopy(locale: string) { {}, { locale: messageLocale } ), - startStudio: m['BeatAPI.project.startStudio']( + startStudio: m['BeatAPI.project.createStudio']( {}, { locale: messageLocale } ), - startCanvas: m['BeatAPI.project.startCanvas']( + startCanvas: m['BeatAPI.project.createCanvas']( {}, { locale: messageLocale } ), @@ -58,43 +50,17 @@ export function CreateProjectRoutePage({ }: { data: CreateProjectRouteData; }) { - const { locale, target, model, prompt, projectName } = data; + const { locale, target, model, prompt, projectName, workspaceMode } = data; const copy = getCopy(locale); - const [creating, setCreating] = useState(false); - const [error, setError] = useState(null); - - async function createProject(workspaceMode: WorkspaceMode) { - if (creating) return; - setCreating(true); - setError(null); - - try { - const payload = await apiJsonPost( - '/api/app/projects', - { name: projectName, workspaceMode } - ); - - if (!payload?.id) { - throw new Error(payload?.error || copy.errorTitle); - } - - window.location.replace( - buildPostCreateProjectDetailPath({ - locale, - projectId: payload.id, - target: target ?? undefined, - model: model ?? undefined, - prompt: prompt ?? undefined, - mode: workspaceMode, - }) - ); - } catch (createError) { - setError( - createError instanceof Error ? createError.message : copy.errorTitle - ); - setCreating(false); - } - } + const { ready, creating, error, createProject, retryProject } = useCreateProject({ + locale, + projectName, + errorMessage: copy.errorTitle, + replace: true, + target: target ?? undefined, + model: model ?? undefined, + prompt: prompt ?? undefined, + }); return (

@@ -128,28 +94,21 @@ export function CreateProjectRoutePage({ ) : ( - <> - - - + )} ) : null} diff --git a/src/components/app/product-page-shell.tsx b/src/components/app/product-page-shell.tsx index 48f1e11..76ca9d7 100644 --- a/src/components/app/product-page-shell.tsx +++ b/src/components/app/product-page-shell.tsx @@ -3,11 +3,15 @@ import { useCallback, useEffect, useRef, useState } from 'react'; import { Images, LayoutPanelTop, Scissors, Workflow } from 'lucide-react'; import { WorkspaceApiConfigDialog } from '@/components/app/workspace-api-config-dialog'; +import { ProjectSettingsDialog } from './project-settings-dialog'; +import { fetchProjectSettings, saveProjectSettings } from '@/core/workspace-lib/app/project-settings-client'; +import { useQuery } from '@tanstack/react-query'; +import { toast } from 'sonner'; import { LanguageSwitcher } from '@/components/app/language-switcher'; import { GitHubIcon } from '@/components/icons/github'; import { Link } from '@/core/i18n/navigation'; import { useTranslations } from '@/core/workspace-lib/shims/next-intl'; -import { apiJsonPatch, apiJsonPost } from '@/lib/api-client'; +import { ApiError, apiJsonPost } from '@/lib/api-client'; import { appConfig } from '@/config'; import { ACTIVE_GENERATION_PROVIDER_ID } from '@/config/generation-providers'; import type { WorkspaceMode } from '@/config/workspace-modes'; @@ -24,6 +28,7 @@ export function ProductPageShell({ workspaceMode?: WorkspaceMode; }) { const t = useTranslations('AppShell'); + const settingsCopy = useTranslations('ProjectSettings'); const untitledWorkspaceName = t('header.untitledCanvas'); const getDisplayWorkspaceName = useCallback( (name: string | null | undefined) => { @@ -40,6 +45,16 @@ export function ProductPageShell({ const [draftWorkspaceName, setDraftWorkspaceName] = useState(defaultWorkspaceName); const lastPersistedWorkspaceNameRef = useRef(defaultWorkspaceName); + const projectSettings = useQuery({ queryKey: ['project-settings', projectId], queryFn: () => fetchProjectSettings(projectId!), enabled: Boolean(projectId), refetchInterval: 5000, refetchIntervalInBackground: false }); + + useEffect(() => { + const name = projectSettings.data?.name; + if (!name) return; + // React may defer the updater until after this effect mutates the ref. + const previousName = lastPersistedWorkspaceNameRef.current; + setDraftWorkspaceName((draft) => draft === previousName ? name : draft); + lastPersistedWorkspaceNameRef.current = name; + }, [projectSettings.data?.name]); useEffect(() => { const nextName = getDisplayWorkspaceName(workspaceName); @@ -72,11 +87,16 @@ export function ProductPageShell({ } try { - await apiJsonPatch(`/api/app/projects/${projectId}`, { name: nextName }); + const current = projectSettings.data ?? await fetchProjectSettings(projectId); + await saveProjectSettings(projectId, current.settingsRevision, { name: nextName }); + void projectSettings.refetch(); lastPersistedWorkspaceNameRef.current = nextName; } catch (error) { - console.error('rename project failed:', error); - setDraftWorkspaceName(lastPersistedWorkspaceNameRef.current); + toast.error(error instanceof ApiError && error.code === 409 + ? settingsCopy('conflict') + : error instanceof Error ? error.message : settingsCopy('saveError')); + // Preserve the user's edit and refresh the revision for an explicit retry. + void projectSettings.refetch(); } }; @@ -180,6 +200,11 @@ export function ProductPageShell({ ) : null} + {projectId && { + setDraftWorkspaceName(settings.name); + lastPersistedWorkspaceNameRef.current = settings.name; + void projectSettings.refetch(); + }} />} diff --git a/src/components/app/project-assets-dialog.tsx b/src/components/app/project-assets-dialog.tsx index d1b3bfc..84cb0b3 100644 --- a/src/components/app/project-assets-dialog.tsx +++ b/src/components/app/project-assets-dialog.tsx @@ -1,4 +1,6 @@ -import { useQuery } from '@tanstack/react-query'; +import { useQuery, useQueryClient } from '@tanstack/react-query'; +import { fetchProjectSettings, saveProjectSettings } from '@/core/workspace-lib/app/project-settings-client'; +import { invalidateWorkspaceAfterProjectMutation } from '@/core/workspace-lib/app/workspace-query-invalidation'; import { AudioLines, ExternalLink, @@ -63,6 +65,21 @@ function AssetTile({ openLabel: string; }) { const [isAddingToTimeline, setIsAddingToTimeline] = useState(false); + const [isSettingCover, setIsSettingCover] = useState(false); + const settingsCopy = useTranslations('ProjectSettings'); + const queryClient = useQueryClient(); + const setAsCover = async () => { + if (isSettingCover) return; + setIsSettingCover(true); + try { + const settings = await fetchProjectSettings(projectId); + await saveProjectSettings(projectId, settings.settingsRevision, { cover: { mode: 'manual', assetId: asset.id } }); + await invalidateWorkspaceAfterProjectMutation(queryClient); + await queryClient.invalidateQueries({ queryKey: ['project-settings', projectId] }); + toast.success(settingsCopy('coverSaved')); + } catch (error) { toast.error(error instanceof Error ? error.message : settingsCopy('saveError')); } + finally { setIsSettingCover(false); } + }; const transfer: ProjectAssetTransfer = { ...asset, projectId, @@ -147,6 +164,7 @@ function AssetTile({ {canAddToCanvas || mediaType === 'image' || mediaType === 'video' || mediaType === 'audio' ? (
+ {mediaType === 'image' && } {canAddToCanvas ? ( +
+ )} + {!loaded ? ( +

{t('loading')}

+ ) : ( +
{ + event.preventDefault(); + void save(); + }} + className="space-y-6" + > +
+

+ {t('details')} +

+
+ + setName(e.target.value)} + maxLength={240} + required + /> +
+
+ +
+