specrails-desktop 2.60.0 → 2.62.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/dist/assets/ActivityFeedPage-C_pqc281.js +1 -0
- package/client/dist/assets/{AgentBrowserCapture-D4a3wYM1.js → AgentBrowserCapture-vz6rbDtu.js} +1 -1
- package/client/dist/assets/AgentModeAnalyticsPane-BHCcUahS.js +2 -0
- package/client/dist/assets/AgentModeCodePane-DhmxgG3W.js +2 -0
- package/client/dist/assets/{AgentModeJobsPane-25tQlLpF.js → AgentModeJobsPane-99fBBLri.js} +1 -1
- package/client/dist/assets/{AgentsPage-CUDp_sfw.js → AgentsPage-CTwm_6T8.js} +3 -3
- package/client/dist/assets/{AnalyticsPage-DXWMGn8b.js → AnalyticsPage-YD8MLoPa.js} +1 -1
- package/client/dist/assets/CodePage-CLJn2F2e.js +3 -0
- package/client/dist/assets/{DesktopAnalyticsPage-BkFBq0E6.js → DesktopAnalyticsPage-MWGQVbwp.js} +1 -1
- package/client/dist/assets/{DocsDialog-BL7uSbIJ.js → DocsDialog-XUCYKoq0.js} +1 -1
- package/client/dist/assets/{DocsPage-CsDLbmZX.js → DocsPage-dOLC8bXA.js} +1 -1
- package/client/dist/assets/{ExportDropdown-B4Olg1Fk.js → ExportDropdown-BvKQgwM9.js} +1 -1
- package/client/dist/assets/InteractiveJobComposer-DxOvwmBF.js +19 -0
- package/client/dist/assets/{JobDetailModal-DS_Owxs6.js → JobDetailModal-CkiubrkZ.js} +1 -1
- package/client/dist/assets/JobDetailPage-CNe4Wn7l.js +1 -0
- package/client/dist/assets/JobsPage-DSts_L_d.js +1 -0
- package/client/dist/assets/LoopBuilderPage-C9D9eer5.js +1 -0
- package/client/dist/assets/{LoopPreviewModal-CH1r-KhU.js → LoopPreviewModal-Dv3dxHr_.js} +1 -1
- package/client/dist/assets/{LoopWindowSurface-CiZdI6aw.js → LoopWindowSurface-DN2lbSnL.js} +1 -1
- package/client/dist/assets/{LoopsPage-BwFujdGi.js → LoopsPage-DHgIreEW.js} +2 -2
- package/client/dist/assets/MinimizedChatsContext-Ds2-R6qJ.js +1 -0
- package/client/dist/assets/PluginsPage-D1EJ9oja.js +2 -0
- package/client/dist/assets/ProjectSettingsDialog-DKpa1wKk.js +1 -0
- package/client/dist/assets/{RepositoryDeliveries-NNorcGzT.js → RepositoryDeliveries-CW4eKG3x.js} +1 -1
- package/client/dist/assets/{RepositoryScopeSelector-D-jb4bI_.js → RepositoryScopeSelector-DrtPqvc_.js} +1 -1
- package/client/dist/assets/ReviewPacketPage-BtjPI0Cc.js +4 -0
- package/client/dist/assets/{TemplatePreviewModal-5CZdAZ0G.js → TemplatePreviewModal-DcFlhUxy.js} +1 -1
- package/client/dist/assets/TicketDetailModalContext-Dea22CI-.js +16 -0
- package/client/dist/assets/{Trans-wmTUDVyC.js → Trans-CAY2Rd2f.js} +1 -1
- package/client/dist/assets/agent-5bSixVzz.js +1 -0
- package/client/dist/assets/agent-BR4EHfhq.js +1 -0
- package/client/dist/assets/agent-C0IKkJP8.js +1 -0
- package/client/dist/assets/agent-C7li9ayC.js +1 -0
- package/client/dist/assets/agent-D0dRmEen.js +1 -0
- package/client/dist/assets/{agent-BjttZLIl.js → agent-DZVGHm7H.js} +1 -1
- package/client/dist/assets/agent-Dip4h2YE.js +1 -0
- package/client/dist/assets/agent-Pp-P-n1p.js +1 -0
- package/client/dist/assets/agentRuntime-B-myNBUP.js +1 -0
- package/client/dist/assets/agentRuntime-Bjt7Ij6_.js +1 -0
- package/client/dist/assets/agentRuntime-C_yLPKDy.js +1 -0
- package/client/dist/assets/agentRuntime-D2kYQqNO.js +1 -0
- package/client/dist/assets/agentRuntime-DvhEe1um.js +1 -0
- package/client/dist/assets/agentRuntime-DxC6-9rN.js +1 -0
- package/client/dist/assets/agentRuntime-TKQyg137.js +1 -0
- package/client/dist/assets/agentRuntime-WSv8G0pW.js +1 -0
- package/client/dist/assets/ban-E4EaZe3a.js +1 -0
- package/client/dist/assets/chevron-up-CwGUHd6D.js +1 -0
- package/client/dist/assets/dist-Bq10nS2m.js +1 -0
- package/client/dist/assets/{formatDistanceToNow-Dax4zqPF.js → formatDistanceToNow-DlQY1Lm_.js} +1 -1
- package/client/dist/assets/{getTimezoneOffsetInMilliseconds-dpIo42JZ.js → getTimezoneOffsetInMilliseconds-COUeq65G.js} +1 -1
- package/client/dist/assets/index-BacrO_ub.css +2 -0
- package/client/dist/assets/index-CONHvEJw.js +83 -0
- package/client/dist/assets/{jira-api-CLrIvXFm.js → jira-api-C94VNHNY.js} +1 -1
- package/client/dist/assets/layers-eDMjG41I.js +1 -0
- package/client/dist/assets/{loops-Cm55CXJ4.js → loops-B2PhQLKR.js} +1 -1
- package/client/dist/assets/{loops-3IutojWt.js → loops-BqbF46st.js} +1 -1
- package/client/dist/assets/{loops-BAosWtXE.js → loops-CINnHbfI.js} +1 -1
- package/client/dist/assets/{loops-kIJJkaxf.js → loops-D-3XhH04.js} +1 -1
- package/client/dist/assets/{loops-DHQtnfze.js → loops-DKkEEjZ_.js} +1 -1
- package/client/dist/assets/{loops-D7tL_Saw.js → loops-DzWR5-v6.js} +1 -1
- package/client/dist/assets/{loops--KWr0X-w.js → loops-WyWDkhok.js} +1 -1
- package/client/dist/assets/{loops-BISDssL5.js → loops-scD5fIBf.js} +1 -1
- package/client/dist/assets/{narration-DvLQBW9U.js → narration-BEKMVxGm.js} +1 -1
- package/client/dist/assets/{narration-CHI06czm.js → narration-CjLwGKap.js} +1 -1
- package/client/dist/assets/{narration-DjKB3pQZ.js → narration-DANWuGsW.js} +1 -1
- package/client/dist/assets/{narration-eSx3gR0W.js → narration-DGeEDWiT.js} +1 -1
- package/client/dist/assets/{narration-DtCYvRLM.js → narration-DJgpGwIP.js} +1 -1
- package/client/dist/assets/{narration-n3hOA7LY.js → narration-DbHnz0qV.js} +1 -1
- package/client/dist/assets/{narration-thJOeT2-.js → narration-bZSsTZG8.js} +1 -1
- package/client/dist/assets/{narration--hUhjM5v.js → narration-i6aKJKEc.js} +1 -1
- package/client/dist/assets/{project-repositories-BkyT8AjU.js → project-repositories-Cc3oNv8X.js} +1 -1
- package/client/dist/assets/save-B6wGWwBR.js +1 -0
- package/client/dist/assets/{settings-Dn-pXukr.js → settings-BKJZ2KEM.js} +1 -1
- package/client/dist/assets/{settings-BBj_kZaD.js → settings-BV3jocIx.js} +1 -1
- package/client/dist/assets/{settings-COlH_P33.js → settings-BjM2Dw8_.js} +1 -1
- package/client/dist/assets/settings-CKu0LTib.js +1 -0
- package/client/dist/assets/{settings-D77mC_Lb.js → settings-DA77M48m.js} +1 -1
- package/client/dist/assets/{settings-ByVE7jdZ.js → settings-LfFnl1UH.js} +1 -1
- package/client/dist/assets/{settings-DZKy7MqN.js → settings-P1IQvhnL.js} +1 -1
- package/client/dist/assets/{settings-B5Hy_Kol.js → settings-eIMJjyK_.js} +1 -1
- package/client/dist/assets/{spending-Oov7p52A.js → spending-DemeFfrH.js} +1 -1
- package/client/dist/assets/{useDesktop-DpiS8Uov.js → useDesktop-9Lwoel_8.js} +1 -1
- package/client/dist/assets/{useRuntimeRuns-DBm1mul0.js → useRuntimeRuns-DL0xYoZ2.js} +1 -1
- package/client/dist/assets/{useSharedWebSocket-BZxKaVNT.js → useSharedWebSocket-BEHPeU1Y.js} +2 -2
- package/client/dist/assets/zap-CHo3aCD1.js +1 -0
- package/client/dist/index.html +26 -22
- package/docs/guide/de/integrations/6-agent-chat.md +11 -0
- package/docs/guide/en/integrations/6-agent-chat.md +11 -0
- package/docs/guide/es/integrations/6-agent-chat.md +11 -0
- package/docs/guide/fr/integrations/6-agent-chat.md +11 -0
- package/docs/guide/it/integrations/6-agent-chat.md +11 -0
- package/docs/guide/ja/integrations/6-agent-chat.md +11 -0
- package/docs/guide/pt/integrations/6-agent-chat.md +11 -0
- package/docs/guide/zh/integrations/6-agent-chat.md +11 -0
- package/docs/internals/README.md +1 -0
- package/docs/internals/agent-sessions.md +157 -0
- package/docs/internals/api-reference.md +33 -4
- package/docs/internals/configuration.md +36 -0
- package/docs/internals/core-runtime-updates.md +10 -3
- package/docs/internals/operations-runbook.md +11 -0
- package/docs/internals/programmatic-agent-runtime.md +2 -0
- package/docs/internals/source-map.md +40 -1
- package/mcp-bridge/dist/specrails-mcp.js +82 -15
- package/package.json +1 -1
- package/server/dist/agent-mcp-config.js +41 -0
- package/server/dist/core-compat.js +2 -0
- package/server/dist/desktop-db.js +101 -4
- package/server/dist/desktop-router.js +31 -2
- package/server/dist/index.js +58 -0
- package/server/dist/mcp/tools/app-settings.js +11 -0
- package/server/dist/mcp/tools/mission.js +45 -2
- package/server/dist/mcp/tools/specs.js +2 -2
- package/server/dist/modules/accounting/runtime/result-event.js +9 -1
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-bridge.js +12 -0
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-controls.js +25 -0
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-effective-config.js +2 -0
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-settings-router.js +6 -2
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-settings.js +18 -6
- package/server/dist/modules/agent-sessions/adapters/host-process.js +73 -0
- package/server/dist/modules/agent-sessions/adapters/http.js +31 -0
- package/server/dist/modules/agent-sessions/adapters/rpc-client.js +147 -0
- package/server/dist/modules/agent-sessions/application/session-event-pump.js +99 -0
- package/server/dist/modules/agent-sessions/domain/availability.js +25 -0
- package/server/dist/modules/agent-sessions/domain/errors.js +23 -0
- package/server/dist/modules/agent-sessions/domain/host-state.js +80 -0
- package/server/dist/modules/agent-sessions/domain/projection.js +147 -0
- package/server/dist/modules/agent-sessions/domain/protocol.js +59 -0
- package/server/dist/modules/agent-sessions/domain/subagent-policy.js +34 -0
- package/server/dist/modules/agent-sessions/index.js +31 -0
- package/server/dist/modules/agent-sessions/ports.js +2 -0
- package/server/dist/modules/agent-sessions/runtime/core-sessions-availability.js +43 -0
- package/server/dist/modules/agent-sessions/runtime/session-host-registry.js +226 -0
- package/server/dist/modules/agents/runtime/agent-store.js +3 -1
- package/server/dist/modules/loops/runtime/loop-core-factory.js +2 -2
- package/server/dist/modules/loops/runtime/loop-definition.js +1 -0
- package/server/dist/modules/loops/runtime/loop-factory.js +1 -1
- package/server/dist/modules/loops/runtime/loop-graph.js +8 -1
- package/server/dist/modules/loops/runtime/loop-implement-recipe.js +41 -11
- package/server/dist/modules/loops/runtime/loop-run-manager.js +4 -0
- package/server/dist/modules/loops/runtime/loop-templates.js +3 -3
- package/server/dist/modules/missions/runtime/agent-chat-manager.js +137 -40
- package/server/dist/modules/missions/runtime/agent-chat-router.js +68 -0
- package/server/dist/modules/missions/runtime/agent-operator-prompt.js +8 -9
- package/server/dist/modules/missions/runtime/agent-session-store.js +133 -0
- package/server/dist/modules/missions/runtime/core-session-runner.js +204 -0
- package/server/dist/modules/missions/runtime/mission-core-sessions.js +286 -0
- package/server/dist/modules/missions/runtime/mission-session-projector.js +168 -0
- package/server/dist/modules/project-settings/adapters/http.js +14 -2
- package/server/dist/modules/project-settings/adapters/sqlite.js +30 -2
- package/server/dist/modules/project-settings/domain.js +24 -0
- package/server/dist/modules/project-settings/index.js +2 -1
- package/server/dist/modules/specs/runtime/spec-models.js +1 -1
- package/server/dist/plugins/codex-spawn.js +15 -7
- package/server/dist/project-registry.js +32 -0
- package/server/dist/project-router-settings.js +7 -1
- package/server/dist/providers/claude-adapter.js +6 -1
- package/server/dist/schemas/agent-runtime.schema.json +9 -7
- package/client/dist/assets/ActivityFeedPage-3J7fR8yB.js +0 -1
- package/client/dist/assets/AgentModeAnalyticsPane-Dps30tk9.js +0 -2
- package/client/dist/assets/AgentModeCodePane-CvLimey8.js +0 -2
- package/client/dist/assets/CodePage-D981zRHy.js +0 -3
- package/client/dist/assets/InteractiveJobComposer-Z6fl4791.js +0 -19
- package/client/dist/assets/JobDetailPage-1TUQ9vlE.js +0 -1
- package/client/dist/assets/JobsPage-BSrl8P7u.js +0 -1
- package/client/dist/assets/LoopBuilderPage-Dh5uk2Qy.js +0 -1
- package/client/dist/assets/MinimizedChatsContext-BD2bsRBe.js +0 -1
- package/client/dist/assets/PluginsPage-B8f49Mvn.js +0 -2
- package/client/dist/assets/ProjectSettingsDialog-D7q-O6h3.js +0 -1
- package/client/dist/assets/ReviewPacketPage-DpZSzF-Q.js +0 -4
- package/client/dist/assets/TicketDetailModalContext-BHmtj1As.js +0 -16
- package/client/dist/assets/agent--8QAfoXL.js +0 -1
- package/client/dist/assets/agent-3HxXkIWX.js +0 -1
- package/client/dist/assets/agent-CpFCz32T.js +0 -1
- package/client/dist/assets/agent-DVnw6ybO.js +0 -1
- package/client/dist/assets/agent-Z5s_GTP0.js +0 -1
- package/client/dist/assets/agent-hv57-zyG.js +0 -1
- package/client/dist/assets/agent-xGrZ_aN1.js +0 -1
- package/client/dist/assets/agentRuntime-7Ydcvr6P.js +0 -1
- package/client/dist/assets/agentRuntime-BHVw9orA.js +0 -1
- package/client/dist/assets/agentRuntime-DCPDaQcV.js +0 -1
- package/client/dist/assets/agentRuntime-DKTw4Ajg.js +0 -1
- package/client/dist/assets/agentRuntime-DVhij_i_.js +0 -1
- package/client/dist/assets/agentRuntime-Doss-T8o.js +0 -1
- package/client/dist/assets/agentRuntime-eZSMUlkM.js +0 -1
- package/client/dist/assets/agentRuntime-qSSU7fQk.js +0 -1
- package/client/dist/assets/index-Bfunvi6w.css +0 -2
- package/client/dist/assets/index-g8S62tpS.js +0 -83
- package/client/dist/assets/save-OsUqVn99.js +0 -1
- package/client/dist/assets/settings-Dbyd6gmj.js +0 -1
- package/client/dist/assets/zap-CUOlvtT1.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
var e={title:`语言`,description:`Desktop 全局界面语言。即时生效,无需重启。`,selectLabel:`界面语言`,updateFailed:`无法保存语言偏好`},t={title:`项目设置`},n={saveFailed:`保存失败:{{message}}`},r={title:`流水线遥测`,description:`采集 token 用量、阶段耗时和子 Agent 活动以供诊断导出。默认开启。`,toggleLabel:`启用流水线遥测`,toggleDescription:`开启后,流水线任务的 OTEL 数据将在本地采集。在任意任务卡片上使用<mono>导出诊断</mono>按钮即可下载。`,enabled:`已启用流水线遥测`,disabled:`已禁用流水线遥测`,saveFailed:`保存遥测设置失败`},i={title:`Rail 前置提示词`,description:`追加到 implement rail 任务中的项目专属附加指令,位于工单上下文之后、开始执行之前。`,label:`前置提示词`,placeholder:`示例:优先采用增量修改,保持迁移向后兼容,并为每次 rail 变更添加测试。`,helper:`用于应随每次 rail 实现运行附带的稳定项目指引。`,saveButton:`保存前置提示词`,cleared:`前置提示词已清除`,saved:`前置提示词已保存`,saveFailed:`保存前置提示词失败`},a={title:`Freestyle 前置提示词`,description:`在 Freestyle 模式下发送给所选提供方的指令。Freestyle 跳过 OpenSpec 流水线——直接把该前置提示词加上 spec 文本交给提供方,让其自主实现。留空则使用内置默认值。`,label:`Freestyle 前置提示词`,placeholder:`留空以使用默认的 Freestyle 指令。`,helper:`spec 文本会自动追加在该前置提示词之后。留空 = 使用默认值。`,saveButton:`保存 Freestyle 前置提示词`,resetToDefault:`Freestyle 前置提示词已重置为默认值`,saved:`Freestyle 前置提示词已保存`,saveFailed:`保存 Freestyle 前置提示词失败`},o={title:`预算`,description:`为此项目设置每日支出上限。达到上限时队列自动暂停。`,dailyLabel:`每日预算(USD)`,dailyHelper:`留空表示禁用。支出按最近 24 小时计算。`,dailyPlaceholder:`如 5.00`,perJobLabel:`单任务成本告警(USD)`,perJobHelper:`当此项目中的单个任务超过此金额时告警。`,perJobPlaceholder:`如 0.50`,invalidNumber:`请输入正数,或留空以禁用`,dailyRemoved:`已移除每日预算`,dailySet:"每日预算已设为 ${{amount}}",perJobAlertDisabled:`已禁用单任务成本告警`,alertSet:"已设置任务超过 ${{amount}} 时告警",saveBudgetFailed:`保存预算失败`,saveThresholdFailed:`保存阈值失败`},s={nav:{appearance:`外观`,specrailsAgents:`AI 提供商`,code:`代码`,terminal:`终端`,updates:`更新`,mobile:`移动端`,mcp:`MCP`,projects:`项目`,advanced:`高级`,webhooks:`Webhooks`,about:`关于`,effects:`效果`,subscriptionUsage:`订阅用量`},title:`Desktop 设置`,description:`管理已注册的项目并查看 Desktop 信息。`,registeredProjects:`已注册项目`,noProjects:`尚未注册任何项目`,techUrlDescription:`specrails-tech API 的基础 URL(默认:http://localhost:3000)`,techUrlSaved:`specrails-tech URL 已保存`,techUrlSaveFailed:`保存 URL 失败`,budgetAlertsHeading:`预算与告警`,dailyBudgetLabel:`Desktop 每日预算(USD)`,dailyBudgetHelper:`所有项目的全局每日支出上限。超出后队列自动暂停。`,dailyBudgetPlaceholder:`如 10.00`,perJobHelper:`当单个任务超过此金额时告警。留空表示禁用。`,costAlertsDisabled:`已禁用成本告警`,dailyBudgetRemoved:`已移除 Desktop 每日预算`,dailyBudgetSet:"Desktop 每日预算已设为 ${{amount}}",dailyBudgetSaveFailed:`保存 Desktop 每日预算失败`,projectRemoved:`项目已移除`,projectRemoveFailed:`移除项目失败`,onboardingHeading:`新手引导`,platformTour:`平台导览`,platformTourDescription:`重播欢迎向导,回顾核心功能。`,replayTour:`重播导览`,terminalPanelHeading:`终端面板`,infoHeading:`Desktop 信息`,infoPort:`端口`,infoProjects:`项目`,infoDb:`Desktop 数据库`},c={heading:`系统通知`,description:`任务完成或失败时显示原生桌面通知。仅在标签页未聚焦时显示通知。`,enableLabel:`启用系统通知`,notifyOn:`通知时机:`,filterAll:`全部(完成与失败)`,filterCompleted:`仅完成`,filterFailed:`仅失败`,enabledToast:`已启用系统通知`,disabledToast:`已禁用系统通知`},l={heading:`出站 Webhook`,description:`在 Desktop 事件发生时通知外部工具(Slack、Zapier、CI/CD)。设置密钥后,请求会通过 <code>X-Specrails-Signature</code> 进行签名。`,eventJobCompleted:`任务完成`,eventJobFailed:`任务失败`,eventDailyBudgetExceeded:`超出每日预算`,statusOn:`开`,statusOff:`关`,disable:`禁用`,enable:`启用`,sendTestPing:`发送测试 ping`,addHeading:`添加 Webhook`,secretPlaceholder:`签名密钥(可选)`,addButton:`添加 Webhook`,urlRequired:`URL 为必填项`,selectEvent:`请至少选择一个事件`,added:`Webhook 已添加`,addFailed:`添加 Webhook 失败`,updateFailed:`更新 Webhook 失败`,removed:`Webhook 已移除`,removeFailed:`移除 Webhook 失败`,testPingSent:`测试 ping 已发送`,testPingFailed:`发送测试 ping 失败`},u={title:`终端面板`,desktopDescription:`Desktop 全局默认值,应用于所有项目,除非设置了项目级覆盖。`,projectDescription:`终端面板的项目级覆盖。保持字段不变即继承 Desktop 默认值。`,fontFamily:`字体`,fontSize:`字号({{min}}–{{max}})`,renderMode:`渲染模式`,copyOnSelect:`选中即复制`,shellIntegration:`Shell 集成(OSC 133 标记)`,notifyLongRunning:`长耗时命令通知`,longCommandThreshold:`长命令阈值(ms)`,imageRendering:`内联图片渲染(Sixel + iTerm2)`,browserShortcutUrl:`浏览器快捷方式 URL`,quickScript:`快捷脚本(粘贴到活动终端——需手动按 Enter)`,reset:`重置`,unsavedChanges:`有未保存的更改`,clearOverride:`清除覆盖`,clear:`清除`,inheritingDefault:`正在继承 Desktop 默认值`,nothingToSave:`没有可保存的内容`,saved:`终端设置已保存`},d={heading:`代码板块`,summaryLanguage:`摘要语言`,monthlyBudget:`每月预算(USD)`,budgetHelper:"每个自然月 `surface=file-summary` 支出的上限。用户手动发起的重新生成可超出此限制。"},f={taglines:{dracula:`经典原版 — 紫色调暗色主题,霓虹色点缀鲜明`,"aurora-light":`高级浅色 — 受 Linear 启发的靛蓝配暖白底色`,"obsidian-dark":`高级深色 — 近黑蓝调配电光色点缀`,specrails:`品牌主题 — 深海军靛蓝配饱和青色点缀`,"code-rain":`磷光终端 — 绿黑底色上的柔和薄荷绿`,galaxy:`深空蓝配上发光的光刃轨迹`},heading:`外观`,themeGroupLabel:`主题`,currentlyActive:`当前使用中`,updateFailed:`更新主题失败`},p={heading:`移动伴侣`,description:`通过手机上的 SpecRails Companion 应用控制 Specrails,完全经由本地网络。默认关闭。`,accessOn:`移动访问已开启`,accessOff:`移动访问已关闭`,listeningOnPort:`正在监听端口 {{port}}`,notListening:`未在监听`,turnOn:`开启`,turnOff:`关闭`,pairWebDevice:`配对网页伴侣`,reset:`重置`,resetConfirm:`确定要重置移动身份吗?所有已配对设备都将被吊销,必须重新配对。`,identityReset:`移动身份已重置`,enableFailed:`无法启用移动访问:{{message}}`,disableFailed:`无法禁用移动访问:{{message}}`,windowsFirewall:`首次启用时,Windows 防火墙会询问是否允许 SpecRails 服务器——请选择“允许在专用网络上”。`,pairedDevices:`已配对设备`,noDevices:`尚无已配对设备。`,revokeDevice:`吊销 {{name}}`},m={title:`配对网页伴侣`,description:`在手机上打开 specrails.dev/companion-app,然后用它扫描此二维码。`,startFailed:`无法开始配对:{{error}}`,showThenScan:`手机扫描此码后,点按“扫描手机的二维码”,并将摄像头对准手机。`,scanAnswer:`扫描手机的二维码`,scanning:`请将摄像头对准手机上的二维码…`,cameraFailed:`摄像头不可用:{{message}}`,notAnswer:`该二维码不是配对应答。`,connecting:`正在连接…`,paired:`✓ 已配对`,pairedToast:`网页伴侣已配对`,answerRejected:`桌面端拒绝了该码。请重新生成一个并重试。`,copyCode:`复制配对码`,codeCopied:`配对码已复制`,cancel:`取消`},h={heading:`Specrails Core`,installed:`已安装:`,updateAvailable:`有可用更新:{{version}}`,upToDate:`已是最新`,neverChecked:`尚未检查`,check:`检查更新`,checking:`检查中…`,update:`更新到 {{version}}`,downloading:`下载中…`,materializing:`安装中…`,affectsAll:`适用于所有项目 — 无需重启。`,unavailable:`此版本不支持核心更新。`,toastDone:`Specrails Core 已更新到 {{version}}`,toastError:`核心更新失败:{{message}}`,toastUpToDate:`Specrails Core 已是最新`,toastCheckFailed:`检查更新失败:{{message}}`,loadFailed:`无法刷新 Core 状态。重试`,runtime:`运行时:{{version}}`,bundled:`Desktop 内置:{{version}}`,sources:{override:`显式指定`,managed:`由 Desktop 管理`,bundled:`Desktop 内置`,local:`本地软件包`,global:`外部 CLI`},repair:`完成 {{version}} 更新`},g={heading:`Specrails Desktop`,installed:`已安装:`,check:`检查更新`,checking:`检查中…`,upToDate:`已是最新版本`,updateAvailable:`有可用更新: {{version}}`,autoHint:`启动时及每 6 小时自动检查。`,unavailable:`更新仅在桌面应用中可用。`,toastUpToDate:`Specrails Desktop 已是最新`,toastCheckFailed:`检查更新失败: {{message}}`},_={title:`{{name}} — 设置`,description:`项目级配置:提示词、分支、环境、预算、遥测和终端。`,nav:{general:`常规`,branch:`分支`,environment:`环境`,budget:`预算`,telemetry:`遥测`,terminal:`终端`,agentRuntime
|
|
1
|
+
var e={title:`语言`,description:`Desktop 全局界面语言。即时生效,无需重启。`,selectLabel:`界面语言`,updateFailed:`无法保存语言偏好`},t={title:`项目设置`},n={saveFailed:`保存失败:{{message}}`},r={title:`流水线遥测`,description:`采集 token 用量、阶段耗时和子 Agent 活动以供诊断导出。默认开启。`,toggleLabel:`启用流水线遥测`,toggleDescription:`开启后,流水线任务的 OTEL 数据将在本地采集。在任意任务卡片上使用<mono>导出诊断</mono>按钮即可下载。`,enabled:`已启用流水线遥测`,disabled:`已禁用流水线遥测`,saveFailed:`保存遥测设置失败`},i={title:`Rail 前置提示词`,description:`追加到 implement rail 任务中的项目专属附加指令,位于工单上下文之后、开始执行之前。`,label:`前置提示词`,placeholder:`示例:优先采用增量修改,保持迁移向后兼容,并为每次 rail 变更添加测试。`,helper:`用于应随每次 rail 实现运行附带的稳定项目指引。`,saveButton:`保存前置提示词`,cleared:`前置提示词已清除`,saved:`前置提示词已保存`,saveFailed:`保存前置提示词失败`},a={title:`Freestyle 前置提示词`,description:`在 Freestyle 模式下发送给所选提供方的指令。Freestyle 跳过 OpenSpec 流水线——直接把该前置提示词加上 spec 文本交给提供方,让其自主实现。留空则使用内置默认值。`,label:`Freestyle 前置提示词`,placeholder:`留空以使用默认的 Freestyle 指令。`,helper:`spec 文本会自动追加在该前置提示词之后。留空 = 使用默认值。`,saveButton:`保存 Freestyle 前置提示词`,resetToDefault:`Freestyle 前置提示词已重置为默认值`,saved:`Freestyle 前置提示词已保存`,saveFailed:`保存 Freestyle 前置提示词失败`},o={title:`预算`,description:`为此项目设置每日支出上限。达到上限时队列自动暂停。`,dailyLabel:`每日预算(USD)`,dailyHelper:`留空表示禁用。支出按最近 24 小时计算。`,dailyPlaceholder:`如 5.00`,perJobLabel:`单任务成本告警(USD)`,perJobHelper:`当此项目中的单个任务超过此金额时告警。`,perJobPlaceholder:`如 0.50`,invalidNumber:`请输入正数,或留空以禁用`,dailyRemoved:`已移除每日预算`,dailySet:"每日预算已设为 ${{amount}}",perJobAlertDisabled:`已禁用单任务成本告警`,alertSet:"已设置任务超过 ${{amount}} 时告警",saveBudgetFailed:`保存预算失败`,saveThresholdFailed:`保存阈值失败`},s={nav:{appearance:`外观`,specrailsAgents:`AI 提供商`,code:`代码`,terminal:`终端`,updates:`更新`,mobile:`移动端`,mcp:`MCP`,projects:`项目`,advanced:`高级`,webhooks:`Webhooks`,about:`关于`,effects:`效果`,subscriptionUsage:`订阅用量`},title:`Desktop 设置`,description:`管理已注册的项目并查看 Desktop 信息。`,registeredProjects:`已注册项目`,noProjects:`尚未注册任何项目`,techUrlDescription:`specrails-tech API 的基础 URL(默认:http://localhost:3000)`,techUrlSaved:`specrails-tech URL 已保存`,techUrlSaveFailed:`保存 URL 失败`,budgetAlertsHeading:`预算与告警`,dailyBudgetLabel:`Desktop 每日预算(USD)`,dailyBudgetHelper:`所有项目的全局每日支出上限。超出后队列自动暂停。`,dailyBudgetPlaceholder:`如 10.00`,perJobHelper:`当单个任务超过此金额时告警。留空表示禁用。`,costAlertsDisabled:`已禁用成本告警`,dailyBudgetRemoved:`已移除 Desktop 每日预算`,dailyBudgetSet:"Desktop 每日预算已设为 ${{amount}}",dailyBudgetSaveFailed:`保存 Desktop 每日预算失败`,projectRemoved:`项目已移除`,projectRemoveFailed:`移除项目失败`,onboardingHeading:`新手引导`,platformTour:`平台导览`,platformTourDescription:`重播欢迎向导,回顾核心功能。`,replayTour:`重播导览`,terminalPanelHeading:`终端面板`,infoHeading:`Desktop 信息`,infoPort:`端口`,infoProjects:`项目`,infoDb:`Desktop 数据库`},c={heading:`系统通知`,description:`任务完成或失败时显示原生桌面通知。仅在标签页未聚焦时显示通知。`,enableLabel:`启用系统通知`,notifyOn:`通知时机:`,filterAll:`全部(完成与失败)`,filterCompleted:`仅完成`,filterFailed:`仅失败`,enabledToast:`已启用系统通知`,disabledToast:`已禁用系统通知`},l={heading:`出站 Webhook`,description:`在 Desktop 事件发生时通知外部工具(Slack、Zapier、CI/CD)。设置密钥后,请求会通过 <code>X-Specrails-Signature</code> 进行签名。`,eventJobCompleted:`任务完成`,eventJobFailed:`任务失败`,eventDailyBudgetExceeded:`超出每日预算`,statusOn:`开`,statusOff:`关`,disable:`禁用`,enable:`启用`,sendTestPing:`发送测试 ping`,addHeading:`添加 Webhook`,secretPlaceholder:`签名密钥(可选)`,addButton:`添加 Webhook`,urlRequired:`URL 为必填项`,selectEvent:`请至少选择一个事件`,added:`Webhook 已添加`,addFailed:`添加 Webhook 失败`,updateFailed:`更新 Webhook 失败`,removed:`Webhook 已移除`,removeFailed:`移除 Webhook 失败`,testPingSent:`测试 ping 已发送`,testPingFailed:`发送测试 ping 失败`},u={title:`终端面板`,desktopDescription:`Desktop 全局默认值,应用于所有项目,除非设置了项目级覆盖。`,projectDescription:`终端面板的项目级覆盖。保持字段不变即继承 Desktop 默认值。`,fontFamily:`字体`,fontSize:`字号({{min}}–{{max}})`,renderMode:`渲染模式`,copyOnSelect:`选中即复制`,shellIntegration:`Shell 集成(OSC 133 标记)`,notifyLongRunning:`长耗时命令通知`,longCommandThreshold:`长命令阈值(ms)`,imageRendering:`内联图片渲染(Sixel + iTerm2)`,browserShortcutUrl:`浏览器快捷方式 URL`,quickScript:`快捷脚本(粘贴到活动终端——需手动按 Enter)`,reset:`重置`,unsavedChanges:`有未保存的更改`,clearOverride:`清除覆盖`,clear:`清除`,inheritingDefault:`正在继承 Desktop 默认值`,nothingToSave:`没有可保存的内容`,saved:`终端设置已保存`},d={heading:`代码板块`,summaryLanguage:`摘要语言`,monthlyBudget:`每月预算(USD)`,budgetHelper:"每个自然月 `surface=file-summary` 支出的上限。用户手动发起的重新生成可超出此限制。"},f={taglines:{dracula:`经典原版 — 紫色调暗色主题,霓虹色点缀鲜明`,"aurora-light":`高级浅色 — 受 Linear 启发的靛蓝配暖白底色`,"obsidian-dark":`高级深色 — 近黑蓝调配电光色点缀`,specrails:`品牌主题 — 深海军靛蓝配饱和青色点缀`,"code-rain":`磷光终端 — 绿黑底色上的柔和薄荷绿`,galaxy:`深空蓝配上发光的光刃轨迹`},heading:`外观`,themeGroupLabel:`主题`,currentlyActive:`当前使用中`,updateFailed:`更新主题失败`},p={heading:`移动伴侣`,description:`通过手机上的 SpecRails Companion 应用控制 Specrails,完全经由本地网络。默认关闭。`,accessOn:`移动访问已开启`,accessOff:`移动访问已关闭`,listeningOnPort:`正在监听端口 {{port}}`,notListening:`未在监听`,turnOn:`开启`,turnOff:`关闭`,pairWebDevice:`配对网页伴侣`,reset:`重置`,resetConfirm:`确定要重置移动身份吗?所有已配对设备都将被吊销,必须重新配对。`,identityReset:`移动身份已重置`,enableFailed:`无法启用移动访问:{{message}}`,disableFailed:`无法禁用移动访问:{{message}}`,windowsFirewall:`首次启用时,Windows 防火墙会询问是否允许 SpecRails 服务器——请选择“允许在专用网络上”。`,pairedDevices:`已配对设备`,noDevices:`尚无已配对设备。`,revokeDevice:`吊销 {{name}}`},m={title:`配对网页伴侣`,description:`在手机上打开 specrails.dev/companion-app,然后用它扫描此二维码。`,startFailed:`无法开始配对:{{error}}`,showThenScan:`手机扫描此码后,点按“扫描手机的二维码”,并将摄像头对准手机。`,scanAnswer:`扫描手机的二维码`,scanning:`请将摄像头对准手机上的二维码…`,cameraFailed:`摄像头不可用:{{message}}`,notAnswer:`该二维码不是配对应答。`,connecting:`正在连接…`,paired:`✓ 已配对`,pairedToast:`网页伴侣已配对`,answerRejected:`桌面端拒绝了该码。请重新生成一个并重试。`,copyCode:`复制配对码`,codeCopied:`配对码已复制`,cancel:`取消`},h={heading:`Specrails Core`,installed:`已安装:`,updateAvailable:`有可用更新:{{version}}`,upToDate:`已是最新`,neverChecked:`尚未检查`,check:`检查更新`,checking:`检查中…`,update:`更新到 {{version}}`,downloading:`下载中…`,materializing:`安装中…`,affectsAll:`适用于所有项目 — 无需重启。`,unavailable:`此版本不支持核心更新。`,toastDone:`Specrails Core 已更新到 {{version}}`,toastError:`核心更新失败:{{message}}`,toastUpToDate:`Specrails Core 已是最新`,toastCheckFailed:`检查更新失败:{{message}}`,loadFailed:`无法刷新 Core 状态。重试`,runtime:`运行时:{{version}}`,bundled:`Desktop 内置:{{version}}`,sources:{override:`显式指定`,managed:`由 Desktop 管理`,bundled:`Desktop 内置`,local:`本地软件包`,global:`外部 CLI`},repair:`完成 {{version}} 更新`},g={heading:`Specrails Desktop`,installed:`已安装:`,check:`检查更新`,checking:`检查中…`,upToDate:`已是最新版本`,updateAvailable:`有可用更新: {{version}}`,autoHint:`启动时及每 6 小时自动检查。`,unavailable:`更新仅在桌面应用中可用。`,toastUpToDate:`Specrails Desktop 已是最新`,toastCheckFailed:`检查更新失败: {{message}}`},_={title:`{{name}} — 设置`,description:`项目级配置:提示词、分支、环境、预算、遥测和终端。`,nav:{general:`常规`,branch:`分支`,environment:`环境`,budget:`预算`,telemetry:`遥测`,terminal:`终端`,agentRuntime:`验证命令`,subagents:`子代理`}},v={title:`集成分支`,description:`并行 rail 从此分支创建,其草稿 PR 也以此为目标。留空则自动解析为仓库的默认分支。`,placeholder:`自动(仓库默认分支)`,resolved:`Rail 从 <mono>{{branch}}</mono> 创建分支`,save:`保存分支`,saved:`集成分支已保存`,saveFailed:`无法保存集成分支`},y={title:`Worktree 环境`,description:`选择此项目传递给 rail job 和隔离 loop worktree 的环境变量名称。只保存名称;值会在运行开始时读取,如果 Desktop 进程中缺失,会尝试从 login shell 恢复。`,label:`环境变量`,placeholder:`NODE_AUTH_TOKEN`,helper:`按 Enter 或添加。可以粘贴多个用逗号或空格分隔的名称。`,add:`添加`,empty:`尚未为此项目配置专用变量。`,remove:`移除 {{name}}`,save:`保存环境`,saved:`Worktree 环境已保存`,saveFailed:`无法保存 Worktree 环境`,invalidName:`{{name}} 不是有效的环境变量名`,noValues:`这里只添加变量名,不要添加 KEY=value 形式的密钥。`},b={heading:`效果`,description:`应用中的视觉点缀,每一项都可以在这里关闭。`,thinkingHalo:{label:`代理输入框的思考光环`,description:`代理思考或书写时,构建器的环绕光环会围绕输入框发光:回合开始时淡入,回复结束时淡出。`},reducedMotion:`遵循系统的减少动态效果设置:光环将保持为静态光晕。`,preview:`预览`,previewThinking:`思考中…`},x={title:`子代理`,stateOn:`代理可以启动子代理。`,stateOff:`代理独自工作,不使用子代理。`,explainParallel:`子代理让代理把工作交给并行运行的助手,它们在代理回复后继续工作,完成后汇报结果。`,explainCost:`每个子代理都会消耗自己的 token,因此一次请求的成本可能明显增加。`,enabled:`已允许子代理`,disabled:`已关闭子代理`,saveFailed:`无法保存子代理设置`,project:{description:`允许此项目的任务、探索和细化代理使用子代理。默认关闭。`,toggleLabel:`在此项目中允许子代理`,explainScope:`不影响 Implement 流水线。正在运行子代理的任务会在子代理完成后应用更改。`},global:{description:`允许不属于任何项目的任务使用子代理。默认关闭。`,toggleLabel:`在无项目的任务中允许子代理`,explainScope:`每个项目在其项目设置中有独立的设置。正在运行子代理的任务会在子代理完成后应用更改。`},runtime:{label:`子代理运行方式`,same:`与任务代理相同`,sameHint:`子代理使用任务代理的提供方、模型和推理强度,由其自身 CLI 原生启动。`,chosenHint:`使用 {{provider}} 的任务会以此模型启动自己的子代理。使用其他提供方时,由 Specrails 在 {{provider}} 上启动它们。`,providerLabel:`子代理提供方`,modelLabel:`子代理模型`,effortLabel:`子代理推理强度`,claudeEffortHint:`Claude 自身的子代理会忽略推理强度;由 Specrails 启动时才会生效。`,saved:`子代理现在使用 {{provider}} 运行`,reset:`子代理重新跟随任务代理`,confirm:{title:`使用 {{provider}} 运行子代理?`,body:`在使用其他提供方的任务中,子代理不再是原生的:Specrails 会将每个子代理作为独立的 {{provider}} 会话启动,而不是由任务的 CLI 启动。`,cost:`更慢,可能更贵:每个子代理都冷启动,无法共享与任务代理的提示缓存。`,control:`更多控制和灵活性:混用提供方、选择模型和推理强度、查看每个子代理的真实成本,并在任务回复后继续工作。`,native:`已经使用 {{provider}} 的任务会保留原生子代理,并使用此模型和推理强度。`,cancel:`保持与任务相同`,accept:`使用 {{provider}}`}}},S={language:e,page:t,errors:n,telemetry:r,prePrompt:i,freestylePrePrompt:a,budget:o,desktop:s,notifications:c,webhooks:l,terminal:u,codeSection:d,appearance:f,mobile:p,pairWeb:m,coreUpdate:h,appUpdate:g,projectDialog:_,integrationBranch:v,worktreeEnv:y,effects:b,subagents:x};export{g as appUpdate,f as appearance,o as budget,d as codeSection,h as coreUpdate,S as default,s as desktop,b as effects,n as errors,a as freestylePrePrompt,v as integrationBranch,e as language,p as mobile,c as notifications,t as page,m as pairWeb,i as prePrompt,_ as projectDialog,x as subagents,r as telemetry,u as terminal,l as webhooks,y as worktreeEnv};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var e={title:`Idioma`,description:`Idioma de la UI para todo Desktop. Se aplica al instante — no hace falta reiniciar.`,selectLabel:`Idioma de la interfaz`,updateFailed:`No se pudo guardar la preferencia de idioma`},t={title:`Ajustes del proyecto`},n={saveFailed:`Error al guardar: {{message}}`},r={title:`Telemetría del pipeline`,description:`Captura el uso de tokens, la duración de las fases y la actividad de los subagentes para exportar diagnósticos. Activada por defecto.`,toggleLabel:`Activar telemetría del pipeline`,toggleDescription:`Cuando está activa, los datos OTEL de los jobs del pipeline se capturan en local. Usa el botón <mono>Exportar diagnóstico</mono> en cualquier tarjeta de job para descargarlos.`,enabled:`Telemetría del pipeline activada`,disabled:`Telemetría del pipeline desactivada`,saveFailed:`No se pudo guardar el ajuste de telemetría`},i={title:`Pre-prompt de rail`,description:`Instrucciones extra específicas del proyecto que se añaden a los jobs de rail implement, después del contexto del ticket y antes de la ejecución.`,label:`Pre-prompt`,placeholder:`Ejemplo: Prefiere cambios incrementales, mantén las migraciones retrocompatibles y añade tests para cada cambio de rail.`,helper:`Úsalo para directrices estables del proyecto que deban acompañar cada ejecución de implementación en rail.`,saveButton:`Guardar pre-prompt`,cleared:`Pre-prompt borrado`,saved:`Pre-prompt guardado`,saveFailed:`No se pudo guardar el pre-prompt`},a={title:`Pre-prompt de Freestyle`,description:`Instrucción enviada al proveedor seleccionado en Freestyle. Freestyle se salta el pipeline de OpenSpec — le entrega al proveedor este pre-prompt más el texto de la spec y le deja implementar de forma autónoma. Déjalo en blanco para usar el valor por defecto integrado.`,label:`Pre-prompt Freestyle`,placeholder:`Déjalo en blanco para usar la instrucción por defecto de Freestyle.`,helper:`El texto de la spec se añade automáticamente después de este pre-prompt. Vacío = por defecto.`,saveButton:`Guardar pre-prompt Freestyle`,resetToDefault:`Pre-prompt Freestyle restablecido al valor por defecto`,saved:`Pre-prompt Freestyle guardado`,saveFailed:`No se pudo guardar el pre-prompt Freestyle`},o={title:`Presupuesto`,description:`Define un límite de gasto diario para este proyecto. La cola se pausa automáticamente al alcanzar el límite.`,dailyLabel:`Presupuesto diario (USD)`,dailyHelper:`Déjalo en blanco para desactivarlo. El gasto se calcula sobre las últimas 24 horas.`,dailyPlaceholder:`p. ej. 5.00`,perJobLabel:`Alerta de coste por job (USD)`,perJobHelper:`Avisa cuando un único job de este proyecto supere este importe.`,perJobPlaceholder:`p. ej. 0.50`,invalidNumber:`Introduce un número positivo o déjalo en blanco para desactivar`,dailyRemoved:`Presupuesto diario eliminado`,dailySet:"Presupuesto diario fijado en ${{amount}}",perJobAlertDisabled:`Alerta de coste por job desactivada`,alertSet:"Alerta configurada para jobs de más de ${{amount}}",saveBudgetFailed:`No se pudo guardar el presupuesto`,saveThresholdFailed:`No se pudo guardar el umbral`},s={nav:{appearance:`Apariencia`,specrailsAgents:`Proveedores de IA`,code:`Código`,terminal:`Terminal`,updates:`Actualizaciones`,mobile:`Móvil`,mcp:`MCP`,projects:`Proyectos`,advanced:`Avanzado`,webhooks:`Webhooks`,about:`Acerca de`,effects:`Efectos`,subscriptionUsage:`Uso de suscripciones`},title:`Ajustes de Desktop`,description:`Gestiona los proyectos registrados y consulta la información de Desktop.`,registeredProjects:`Proyectos registrados`,noProjects:`Aún no hay proyectos registrados`,techUrlDescription:`URL base de la API de specrails-tech (por defecto: http://localhost:3000)`,techUrlSaved:`URL de specrails-tech guardada`,techUrlSaveFailed:`No se pudo guardar la URL`,budgetAlertsHeading:`Presupuesto y alertas`,dailyBudgetLabel:`Presupuesto diario de Desktop (USD)`,dailyBudgetHelper:`Límite global de gasto diario en todos los proyectos. Las colas se pausan automáticamente al superarlo.`,dailyBudgetPlaceholder:`p. ej. 10.00`,perJobHelper:`Avisa cuando un único job supere este importe. Déjalo en blanco para desactivarlo.`,costAlertsDisabled:`Alertas de coste desactivadas`,dailyBudgetRemoved:`Presupuesto diario de Desktop eliminado`,dailyBudgetSet:"Presupuesto diario de Desktop fijado en ${{amount}}",dailyBudgetSaveFailed:`No se pudo guardar el presupuesto diario de Desktop`,projectRemoved:`Proyecto eliminado`,projectRemoveFailed:`No se pudo eliminar el proyecto`,onboardingHeading:`Onboarding`,platformTour:`Tour de la plataforma`,platformTourDescription:`Vuelve a ver el asistente de bienvenida para repasar las funciones clave.`,replayTour:`Repetir tour`,terminalPanelHeading:`Panel de terminal`,infoHeading:`Información de Desktop`,infoPort:`Puerto`,infoProjects:`Proyectos`,infoDb:`BD de Desktop`},c={heading:`Notificaciones del sistema`,description:`Muestra notificaciones nativas de escritorio cuando los jobs se completan o fallan. Las notificaciones solo aparecen cuando la pestaña no tiene el foco.`,enableLabel:`Activar notificaciones del sistema`,notifyOn:`Notificar en:`,filterAll:`Todos (completados y fallidos)`,filterCompleted:`Solo completados`,filterFailed:`Solo fallidos`,enabledToast:`Notificaciones del sistema activadas`,disabledToast:`Notificaciones del sistema desactivadas`},l={heading:`Webhooks salientes`,description:`Notifica a herramientas externas (Slack, Zapier, CI/CD) los eventos de Desktop. Las peticiones se firman con <code>X-Specrails-Signature</code> cuando hay un secreto configurado.`,eventJobCompleted:`Job completado`,eventJobFailed:`Job fallido`,eventDailyBudgetExceeded:`Presupuesto diario superado`,statusOn:`on`,statusOff:`off`,disable:`Desactivar`,enable:`Activar`,sendTestPing:`Enviar ping de prueba`,addHeading:`Añadir webhook`,secretPlaceholder:`Secreto de firma (opcional)`,addButton:`Añadir webhook`,urlRequired:`La URL es obligatoria`,selectEvent:`Selecciona al menos un evento`,added:`Webhook añadido`,addFailed:`No se pudo añadir el webhook`,updateFailed:`No se pudo actualizar el webhook`,removed:`Webhook eliminado`,removeFailed:`No se pudo eliminar el webhook`,testPingSent:`Ping de prueba enviado`,testPingFailed:`No se pudo enviar el ping de prueba`},u={title:`Panel de terminal`,desktopDescription:`Valores por defecto de Desktop aplicados a todos los proyectos salvo que exista un override por proyecto.`,projectDescription:`Overrides por proyecto para el panel de terminal. Deja un campo sin cambios para heredar el valor por defecto de Desktop.`,fontFamily:`Familia tipográfica`,fontSize:`Tamaño de fuente ({{min}}–{{max}})`,renderMode:`Modo de renderizado`,copyOnSelect:`Copiar al seleccionar`,shellIntegration:`Integración con el shell (marcas OSC 133)`,notifyLongRunning:`Notificar comandos de larga duración`,longCommandThreshold:`Umbral de comando largo (ms)`,imageRendering:`Renderizado de imágenes inline (Sixel + iTerm2)`,browserShortcutUrl:`URL del atajo de navegador`,quickScript:`Script rápido (se pega en el terminal activo — pulsa Enter manualmente)`,reset:`Restablecer`,unsavedChanges:`Cambios sin guardar`,clearOverride:`Quitar override`,clear:`Quitar`,inheritingDefault:`Heredando el valor por defecto de Desktop`,nothingToSave:`Nada que guardar`,saved:`Ajustes del terminal guardados`},d={heading:`Sección de código`,summaryLanguage:`Idioma de los resúmenes`,monthlyBudget:`Presupuesto mensual (USD)`,budgetHelper:"Tope de gasto de `surface=file-summary` por mes natural. Las regeneraciones iniciadas por el usuario pueden sobrepasarlo."},f={taglines:{dracula:`El original — oscuro con tinte púrpura y acentos neón vivos`,"aurora-light":`Claro premium — índigo inspirado en Linear sobre blanco cálido`,"obsidian-dark":`Oscuro premium — casi negro con tinte azul y acentos eléctricos`,specrails:`Tema de marca — azul marino-índigo profundo con acentos cian saturados`,"code-rain":`Terminal de fósforo — menta suave sobre casi negro verdoso`,galaxy:`Azul de espacio profundo con una estela de hoja brillante`},heading:`Apariencia`,themeGroupLabel:`Tema`,currentlyActive:`Activo actualmente`,updateFailed:`No se pudo actualizar el tema`},p={heading:`App móvil`,description:`Controla Specrails desde la app SpecRails Companion de tu teléfono, 100 % a través de tu red local. Desactivado por defecto.`,accessOn:`Acceso móvil activado`,accessOff:`Acceso móvil desactivado`,listeningOnPort:`A la escucha en el puerto {{port}}`,notListening:`No está a la escucha`,turnOn:`Activar`,turnOff:`Desactivar`,pairWebDevice:`Emparejar companion web`,reset:`Restablecer`,resetConfirm:`¿Restablecer la identidad móvil? Todos los dispositivos emparejados se revocarán y tendrán que emparejarse de nuevo.`,identityReset:`Identidad móvil restablecida`,enableFailed:`No se pudo activar el acceso móvil: {{message}}`,disableFailed:`No se pudo desactivar el acceso móvil: {{message}}`,windowsFirewall:`El Firewall de Windows pedirá permiso para el servidor de SpecRails la primera vez que lo actives — elige «Permitir en redes privadas».`,pairedDevices:`Dispositivos emparejados`,noDevices:`Aún no hay dispositivos emparejados.`,revokeDevice:`Revocar {{name}}`},m={title:`Emparejar companion web`,description:`Abre specrails.dev/companion-app en tu teléfono y escanea este código con él.`,startFailed:`No se pudo iniciar el emparejamiento: {{error}}`,showThenScan:`Cuando tu teléfono haya escaneado esto, toca «Escanear código del teléfono» y apunta la cámara hacia tu teléfono.`,scanAnswer:`Escanear código del teléfono`,scanning:`Apunta la cámara al código de tu teléfono…`,cameraFailed:`Cámara no disponible: {{message}}`,notAnswer:`Ese QR no es una respuesta de emparejamiento.`,connecting:`Conectando…`,paired:`✓ Emparejado`,pairedToast:`Companion web emparejado`,answerRejected:`El equipo de escritorio rechazó ese código. Genera uno nuevo e inténtalo de nuevo.`,copyCode:`Copiar código`,codeCopied:`Código copiado`,cancel:`Cancelar`},h={heading:`Specrails Core`,installed:`Instalado:`,updateAvailable:`Actualización disponible: {{version}}`,upToDate:`Actualizado`,neverChecked:`Sin comprobar`,check:`Buscar actualizaciones`,checking:`Comprobando…`,update:`Actualizar a {{version}}`,downloading:`Descargando…`,materializing:`Instalando…`,affectsAll:`Afecta a todos los proyectos — sin reiniciar.`,unavailable:`Las actualizaciones del core no están disponibles en esta versión.`,toastDone:`Specrails Core actualizado a {{version}}`,toastError:`Error al actualizar el core: {{message}}`,toastUpToDate:`Specrails Core está actualizado`,toastCheckFailed:`Error al comprobar actualizaciones: {{message}}`,loadFailed:`No se pudo actualizar el estado de Core. Reintentar`,runtime:`Motor: {{version}}`,bundled:`Incluido en Desktop: {{version}}`,sources:{override:`Selección explícita`,managed:`Gestionado por Desktop`,bundled:`Incluido en Desktop`,local:`Paquete local`,global:`CLI externo`},repair:`Completar actualización {{version}}`},g={heading:`Specrails Desktop`,installed:`Instalada:`,check:`Buscar actualizaciones`,checking:`Comprobando…`,upToDate:`Tienes la última versión`,updateAvailable:`Actualización disponible: {{version}}`,autoHint:`Se comprueba automáticamente al arrancar y cada 6 horas.`,unavailable:`Las actualizaciones solo están disponibles en la app de escritorio.`,toastUpToDate:`Specrails Desktop está actualizado`,toastCheckFailed:`Error al buscar actualizaciones: {{message}}`},_={title:`{{name}} — Ajustes`,description:`Configuración del proyecto: prompts, rama base, entorno, presupuesto, telemetría y terminal.`,nav:{general:`General`,branch:`Rama base`,environment:`Entorno`,budget:`Presupuesto`,telemetry:`Telemetría`,terminal:`Terminal`,agentRuntime:`Comandos de verificación`}},v={title:`Rama de integración`,description:`La rama desde la que parten los rails paralelos y a la que apuntan sus PRs en borrador. Déjalo vacío para resolver automáticamente a la rama por defecto del repositorio.`,placeholder:`automático (rama por defecto)`,resolved:`Los rails parten de <mono>{{branch}}</mono>`,save:`Guardar rama`,saved:`Rama de integración guardada`,saveFailed:`No se pudo guardar la rama de integración`},y={title:`Entorno de worktrees`,description:`Elige los nombres de variables de entorno que este proyecto pasa a jobs de rail y worktrees aislados de loops. Solo se guardan nombres; los valores se leen al iniciar la ejecución, recuperándolos del login shell si faltan en el proceso de escritorio.`,label:`Variable de entorno`,placeholder:`NODE_AUTH_TOKEN`,helper:`Pulsa Enter o Añadir. Puedes pegar varios nombres separados por comas o espacios.`,add:`Añadir`,empty:`Aún no hay variables específicas para este proyecto.`,remove:`Quitar {{name}}`,save:`Guardar entorno`,saved:`Entorno de worktrees guardado`,saveFailed:`No se pudo guardar el entorno de worktrees`,invalidName:`{{name}} no es un nombre válido de variable de entorno`,noValues:`Añade solo nombres de variables, no secretos KEY=value.`},b={heading:`Efectos`,description:`Detalles visuales de la app. Cada uno se puede desactivar aquí.`,thinkingHalo:{label:`Halo de pensamiento en el composer del agente`,description:`Mientras el agente piensa o escribe, el anillo orbitante del Constructor brilla alrededor del composer: aparece con un fundido al empezar el turno y se desvanece al terminar la respuesta.`},reducedMotion:`Respeta el ajuste de movimiento reducido del sistema: el anillo queda como un brillo estático.`,preview:`Vista previa`,previewThinking:`Pensando…`},x={language:e,page:t,errors:n,telemetry:r,prePrompt:i,freestylePrePrompt:a,budget:o,desktop:s,notifications:c,webhooks:l,terminal:u,codeSection:d,appearance:f,mobile:p,pairWeb:m,coreUpdate:h,appUpdate:g,projectDialog:_,integrationBranch:v,worktreeEnv:y,effects:b};export{g as appUpdate,f as appearance,o as budget,d as codeSection,h as coreUpdate,x as default,s as desktop,b as effects,n as errors,a as freestylePrePrompt,v as integrationBranch,e as language,p as mobile,c as notifications,t as page,m as pairWeb,i as prePrompt,_ as projectDialog,r as telemetry,u as terminal,l as webhooks,y as worktreeEnv};
|
|
1
|
+
var e={title:`Idioma`,description:`Idioma de la UI para todo Desktop. Se aplica al instante — no hace falta reiniciar.`,selectLabel:`Idioma de la interfaz`,updateFailed:`No se pudo guardar la preferencia de idioma`},t={title:`Ajustes del proyecto`},n={saveFailed:`Error al guardar: {{message}}`},r={title:`Telemetría del pipeline`,description:`Captura el uso de tokens, la duración de las fases y la actividad de los subagentes para exportar diagnósticos. Activada por defecto.`,toggleLabel:`Activar telemetría del pipeline`,toggleDescription:`Cuando está activa, los datos OTEL de los jobs del pipeline se capturan en local. Usa el botón <mono>Exportar diagnóstico</mono> en cualquier tarjeta de job para descargarlos.`,enabled:`Telemetría del pipeline activada`,disabled:`Telemetría del pipeline desactivada`,saveFailed:`No se pudo guardar el ajuste de telemetría`},i={title:`Pre-prompt de rail`,description:`Instrucciones extra específicas del proyecto que se añaden a los jobs de rail implement, después del contexto del ticket y antes de la ejecución.`,label:`Pre-prompt`,placeholder:`Ejemplo: Prefiere cambios incrementales, mantén las migraciones retrocompatibles y añade tests para cada cambio de rail.`,helper:`Úsalo para directrices estables del proyecto que deban acompañar cada ejecución de implementación en rail.`,saveButton:`Guardar pre-prompt`,cleared:`Pre-prompt borrado`,saved:`Pre-prompt guardado`,saveFailed:`No se pudo guardar el pre-prompt`},a={title:`Pre-prompt de Freestyle`,description:`Instrucción enviada al proveedor seleccionado en Freestyle. Freestyle se salta el pipeline de OpenSpec — le entrega al proveedor este pre-prompt más el texto de la spec y le deja implementar de forma autónoma. Déjalo en blanco para usar el valor por defecto integrado.`,label:`Pre-prompt Freestyle`,placeholder:`Déjalo en blanco para usar la instrucción por defecto de Freestyle.`,helper:`El texto de la spec se añade automáticamente después de este pre-prompt. Vacío = por defecto.`,saveButton:`Guardar pre-prompt Freestyle`,resetToDefault:`Pre-prompt Freestyle restablecido al valor por defecto`,saved:`Pre-prompt Freestyle guardado`,saveFailed:`No se pudo guardar el pre-prompt Freestyle`},o={title:`Presupuesto`,description:`Define un límite de gasto diario para este proyecto. La cola se pausa automáticamente al alcanzar el límite.`,dailyLabel:`Presupuesto diario (USD)`,dailyHelper:`Déjalo en blanco para desactivarlo. El gasto se calcula sobre las últimas 24 horas.`,dailyPlaceholder:`p. ej. 5.00`,perJobLabel:`Alerta de coste por job (USD)`,perJobHelper:`Avisa cuando un único job de este proyecto supere este importe.`,perJobPlaceholder:`p. ej. 0.50`,invalidNumber:`Introduce un número positivo o déjalo en blanco para desactivar`,dailyRemoved:`Presupuesto diario eliminado`,dailySet:"Presupuesto diario fijado en ${{amount}}",perJobAlertDisabled:`Alerta de coste por job desactivada`,alertSet:"Alerta configurada para jobs de más de ${{amount}}",saveBudgetFailed:`No se pudo guardar el presupuesto`,saveThresholdFailed:`No se pudo guardar el umbral`},s={nav:{appearance:`Apariencia`,specrailsAgents:`Proveedores de IA`,code:`Código`,terminal:`Terminal`,updates:`Actualizaciones`,mobile:`Móvil`,mcp:`MCP`,projects:`Proyectos`,advanced:`Avanzado`,webhooks:`Webhooks`,about:`Acerca de`,effects:`Efectos`,subscriptionUsage:`Uso de suscripciones`},title:`Ajustes de Desktop`,description:`Gestiona los proyectos registrados y consulta la información de Desktop.`,registeredProjects:`Proyectos registrados`,noProjects:`Aún no hay proyectos registrados`,techUrlDescription:`URL base de la API de specrails-tech (por defecto: http://localhost:3000)`,techUrlSaved:`URL de specrails-tech guardada`,techUrlSaveFailed:`No se pudo guardar la URL`,budgetAlertsHeading:`Presupuesto y alertas`,dailyBudgetLabel:`Presupuesto diario de Desktop (USD)`,dailyBudgetHelper:`Límite global de gasto diario en todos los proyectos. Las colas se pausan automáticamente al superarlo.`,dailyBudgetPlaceholder:`p. ej. 10.00`,perJobHelper:`Avisa cuando un único job supere este importe. Déjalo en blanco para desactivarlo.`,costAlertsDisabled:`Alertas de coste desactivadas`,dailyBudgetRemoved:`Presupuesto diario de Desktop eliminado`,dailyBudgetSet:"Presupuesto diario de Desktop fijado en ${{amount}}",dailyBudgetSaveFailed:`No se pudo guardar el presupuesto diario de Desktop`,projectRemoved:`Proyecto eliminado`,projectRemoveFailed:`No se pudo eliminar el proyecto`,onboardingHeading:`Onboarding`,platformTour:`Tour de la plataforma`,platformTourDescription:`Vuelve a ver el asistente de bienvenida para repasar las funciones clave.`,replayTour:`Repetir tour`,terminalPanelHeading:`Panel de terminal`,infoHeading:`Información de Desktop`,infoPort:`Puerto`,infoProjects:`Proyectos`,infoDb:`BD de Desktop`},c={heading:`Notificaciones del sistema`,description:`Muestra notificaciones nativas de escritorio cuando los jobs se completan o fallan. Las notificaciones solo aparecen cuando la pestaña no tiene el foco.`,enableLabel:`Activar notificaciones del sistema`,notifyOn:`Notificar en:`,filterAll:`Todos (completados y fallidos)`,filterCompleted:`Solo completados`,filterFailed:`Solo fallidos`,enabledToast:`Notificaciones del sistema activadas`,disabledToast:`Notificaciones del sistema desactivadas`},l={heading:`Webhooks salientes`,description:`Notifica a herramientas externas (Slack, Zapier, CI/CD) los eventos de Desktop. Las peticiones se firman con <code>X-Specrails-Signature</code> cuando hay un secreto configurado.`,eventJobCompleted:`Job completado`,eventJobFailed:`Job fallido`,eventDailyBudgetExceeded:`Presupuesto diario superado`,statusOn:`on`,statusOff:`off`,disable:`Desactivar`,enable:`Activar`,sendTestPing:`Enviar ping de prueba`,addHeading:`Añadir webhook`,secretPlaceholder:`Secreto de firma (opcional)`,addButton:`Añadir webhook`,urlRequired:`La URL es obligatoria`,selectEvent:`Selecciona al menos un evento`,added:`Webhook añadido`,addFailed:`No se pudo añadir el webhook`,updateFailed:`No se pudo actualizar el webhook`,removed:`Webhook eliminado`,removeFailed:`No se pudo eliminar el webhook`,testPingSent:`Ping de prueba enviado`,testPingFailed:`No se pudo enviar el ping de prueba`},u={title:`Panel de terminal`,desktopDescription:`Valores por defecto de Desktop aplicados a todos los proyectos salvo que exista un override por proyecto.`,projectDescription:`Overrides por proyecto para el panel de terminal. Deja un campo sin cambios para heredar el valor por defecto de Desktop.`,fontFamily:`Familia tipográfica`,fontSize:`Tamaño de fuente ({{min}}–{{max}})`,renderMode:`Modo de renderizado`,copyOnSelect:`Copiar al seleccionar`,shellIntegration:`Integración con el shell (marcas OSC 133)`,notifyLongRunning:`Notificar comandos de larga duración`,longCommandThreshold:`Umbral de comando largo (ms)`,imageRendering:`Renderizado de imágenes inline (Sixel + iTerm2)`,browserShortcutUrl:`URL del atajo de navegador`,quickScript:`Script rápido (se pega en el terminal activo — pulsa Enter manualmente)`,reset:`Restablecer`,unsavedChanges:`Cambios sin guardar`,clearOverride:`Quitar override`,clear:`Quitar`,inheritingDefault:`Heredando el valor por defecto de Desktop`,nothingToSave:`Nada que guardar`,saved:`Ajustes del terminal guardados`},d={heading:`Sección de código`,summaryLanguage:`Idioma de los resúmenes`,monthlyBudget:`Presupuesto mensual (USD)`,budgetHelper:"Tope de gasto de `surface=file-summary` por mes natural. Las regeneraciones iniciadas por el usuario pueden sobrepasarlo."},f={taglines:{dracula:`El original — oscuro con tinte púrpura y acentos neón vivos`,"aurora-light":`Claro premium — índigo inspirado en Linear sobre blanco cálido`,"obsidian-dark":`Oscuro premium — casi negro con tinte azul y acentos eléctricos`,specrails:`Tema de marca — azul marino-índigo profundo con acentos cian saturados`,"code-rain":`Terminal de fósforo — menta suave sobre casi negro verdoso`,galaxy:`Azul de espacio profundo con una estela de hoja brillante`},heading:`Apariencia`,themeGroupLabel:`Tema`,currentlyActive:`Activo actualmente`,updateFailed:`No se pudo actualizar el tema`},p={heading:`App móvil`,description:`Controla Specrails desde la app SpecRails Companion de tu teléfono, 100 % a través de tu red local. Desactivado por defecto.`,accessOn:`Acceso móvil activado`,accessOff:`Acceso móvil desactivado`,listeningOnPort:`A la escucha en el puerto {{port}}`,notListening:`No está a la escucha`,turnOn:`Activar`,turnOff:`Desactivar`,pairWebDevice:`Emparejar companion web`,reset:`Restablecer`,resetConfirm:`¿Restablecer la identidad móvil? Todos los dispositivos emparejados se revocarán y tendrán que emparejarse de nuevo.`,identityReset:`Identidad móvil restablecida`,enableFailed:`No se pudo activar el acceso móvil: {{message}}`,disableFailed:`No se pudo desactivar el acceso móvil: {{message}}`,windowsFirewall:`El Firewall de Windows pedirá permiso para el servidor de SpecRails la primera vez que lo actives — elige «Permitir en redes privadas».`,pairedDevices:`Dispositivos emparejados`,noDevices:`Aún no hay dispositivos emparejados.`,revokeDevice:`Revocar {{name}}`},m={title:`Emparejar companion web`,description:`Abre specrails.dev/companion-app en tu teléfono y escanea este código con él.`,startFailed:`No se pudo iniciar el emparejamiento: {{error}}`,showThenScan:`Cuando tu teléfono haya escaneado esto, toca «Escanear código del teléfono» y apunta la cámara hacia tu teléfono.`,scanAnswer:`Escanear código del teléfono`,scanning:`Apunta la cámara al código de tu teléfono…`,cameraFailed:`Cámara no disponible: {{message}}`,notAnswer:`Ese QR no es una respuesta de emparejamiento.`,connecting:`Conectando…`,paired:`✓ Emparejado`,pairedToast:`Companion web emparejado`,answerRejected:`El equipo de escritorio rechazó ese código. Genera uno nuevo e inténtalo de nuevo.`,copyCode:`Copiar código`,codeCopied:`Código copiado`,cancel:`Cancelar`},h={heading:`Specrails Core`,installed:`Instalado:`,updateAvailable:`Actualización disponible: {{version}}`,upToDate:`Actualizado`,neverChecked:`Sin comprobar`,check:`Buscar actualizaciones`,checking:`Comprobando…`,update:`Actualizar a {{version}}`,downloading:`Descargando…`,materializing:`Instalando…`,affectsAll:`Afecta a todos los proyectos — sin reiniciar.`,unavailable:`Las actualizaciones del core no están disponibles en esta versión.`,toastDone:`Specrails Core actualizado a {{version}}`,toastError:`Error al actualizar el core: {{message}}`,toastUpToDate:`Specrails Core está actualizado`,toastCheckFailed:`Error al comprobar actualizaciones: {{message}}`,loadFailed:`No se pudo actualizar el estado de Core. Reintentar`,runtime:`Motor: {{version}}`,bundled:`Incluido en Desktop: {{version}}`,sources:{override:`Selección explícita`,managed:`Gestionado por Desktop`,bundled:`Incluido en Desktop`,local:`Paquete local`,global:`CLI externo`},repair:`Completar actualización {{version}}`},g={heading:`Specrails Desktop`,installed:`Instalada:`,check:`Buscar actualizaciones`,checking:`Comprobando…`,upToDate:`Tienes la última versión`,updateAvailable:`Actualización disponible: {{version}}`,autoHint:`Se comprueba automáticamente al arrancar y cada 6 horas.`,unavailable:`Las actualizaciones solo están disponibles en la app de escritorio.`,toastUpToDate:`Specrails Desktop está actualizado`,toastCheckFailed:`Error al buscar actualizaciones: {{message}}`},_={title:`{{name}} — Ajustes`,description:`Configuración del proyecto: prompts, rama base, entorno, presupuesto, telemetría y terminal.`,nav:{general:`General`,branch:`Rama base`,environment:`Entorno`,budget:`Presupuesto`,telemetry:`Telemetría`,terminal:`Terminal`,agentRuntime:`Comandos de verificación`,subagents:`Sub-agentes`}},v={title:`Rama de integración`,description:`La rama desde la que parten los rails paralelos y a la que apuntan sus PRs en borrador. Déjalo vacío para resolver automáticamente a la rama por defecto del repositorio.`,placeholder:`automático (rama por defecto)`,resolved:`Los rails parten de <mono>{{branch}}</mono>`,save:`Guardar rama`,saved:`Rama de integración guardada`,saveFailed:`No se pudo guardar la rama de integración`},y={title:`Entorno de worktrees`,description:`Elige los nombres de variables de entorno que este proyecto pasa a jobs de rail y worktrees aislados de loops. Solo se guardan nombres; los valores se leen al iniciar la ejecución, recuperándolos del login shell si faltan en el proceso de escritorio.`,label:`Variable de entorno`,placeholder:`NODE_AUTH_TOKEN`,helper:`Pulsa Enter o Añadir. Puedes pegar varios nombres separados por comas o espacios.`,add:`Añadir`,empty:`Aún no hay variables específicas para este proyecto.`,remove:`Quitar {{name}}`,save:`Guardar entorno`,saved:`Entorno de worktrees guardado`,saveFailed:`No se pudo guardar el entorno de worktrees`,invalidName:`{{name}} no es un nombre válido de variable de entorno`,noValues:`Añade solo nombres de variables, no secretos KEY=value.`},b={heading:`Efectos`,description:`Detalles visuales de la app. Cada uno se puede desactivar aquí.`,thinkingHalo:{label:`Halo de pensamiento en el composer del agente`,description:`Mientras el agente piensa o escribe, el anillo orbitante del Constructor brilla alrededor del composer: aparece con un fundido al empezar el turno y se desvanece al terminar la respuesta.`},reducedMotion:`Respeta el ajuste de movimiento reducido del sistema: el anillo queda como un brillo estático.`,preview:`Vista previa`,previewThinking:`Pensando…`},x={title:`Sub-agentes`,stateOn:`Los agentes pueden lanzar sub-agentes.`,stateOff:`Los agentes trabajan solos, sin sub-agentes.`,explainParallel:`Los sub-agentes permiten que un agente reparta trabajo entre ayudantes que corren en paralelo y siguen después de su respuesta, informando al terminar.`,explainCost:`Cada sub-agente consume sus propios tokens, así que una sola petición puede costar bastante más.`,enabled:`Sub-agentes permitidos`,disabled:`Sub-agentes desactivados`,saveFailed:`No se pudo guardar el ajuste de sub-agentes`,project:{description:`Permite que las misiones, la exploración y los refinamientos de este proyecto usen sub-agentes. Desactivado por defecto.`,toggleLabel:`Permitir sub-agentes en este proyecto`,explainScope:`No afecta a los pipelines de Implement. Las misiones con sub-agentes en marcha aplican el cambio cuando estos terminan.`},global:{description:`Permite que las misiones sin proyecto usen sub-agentes. Desactivado por defecto.`,toggleLabel:`Permitir sub-agentes en misiones sin proyecto`,explainScope:`Cada proyecto tiene su propio ajuste en la configuración del proyecto. Las misiones con sub-agentes en marcha aplican el cambio cuando estos terminan.`},runtime:{label:`Ejecutar sub-agentes con`,same:`Igual que el agente de la misión`,sameHint:`Los sub-agentes usan el proveedor, modelo y esfuerzo del agente de la misión, lanzados de forma nativa por su propio CLI.`,chosenHint:`Las misiones en {{provider}} lanzan sus propios sub-agentes con este modelo. Con cualquier otro proveedor, Specrails los lanza en {{provider}}.`,providerLabel:`Proveedor de los sub-agentes`,modelLabel:`Modelo de los sub-agentes`,effortLabel:`Esfuerzo de los sub-agentes`,claudeEffortHint:`Los sub-agentes propios de Claude ignoran el esfuerzo; se aplica cuando los lanza Specrails.`,saved:`Los sub-agentes ahora se ejecutan con {{provider}}`,reset:`Los sub-agentes vuelven a seguir al agente de la misión`,confirm:{title:`¿Ejecutar los sub-agentes con {{provider}}?`,body:`En misiones con otro proveedor, los sub-agentes dejan de ser nativos: Specrails lanza cada uno como su propia sesión de {{provider}} en lugar del CLI de la misión.`,cost:`Más lento y posiblemente más caro: cada sub-agente arranca en frío, sin la caché de prompt que compartiría con el agente de la misión.`,control:`Más control y flexibilidad: combina proveedores, elige modelo y esfuerzo, ve el coste real de cada sub-agente y deja que sigan trabajando tras la respuesta de la misión.`,native:`Las misiones que ya usan {{provider}} mantienen los sub-agentes nativos, ahora con este modelo y esfuerzo.`,cancel:`Mantener igual que la misión`,accept:`Usar {{provider}}`}}},S={language:e,page:t,errors:n,telemetry:r,prePrompt:i,freestylePrePrompt:a,budget:o,desktop:s,notifications:c,webhooks:l,terminal:u,codeSection:d,appearance:f,mobile:p,pairWeb:m,coreUpdate:h,appUpdate:g,projectDialog:_,integrationBranch:v,worktreeEnv:y,effects:b,subagents:x};export{g as appUpdate,f as appearance,o as budget,d as codeSection,h as coreUpdate,S as default,s as desktop,b as effects,n as errors,a as freestylePrePrompt,v as integrationBranch,e as language,p as mobile,c as notifications,t as page,m as pairWeb,i as prePrompt,_ as projectDialog,x as subagents,r as telemetry,u as terminal,l as webhooks,y as worktreeEnv};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{h as e}from"./useSharedWebSocket-
|
|
1
|
+
import{h as e}from"./useSharedWebSocket-BEHPeU1Y.js";import{t}from"./createLucideIcon-Bjbbp_KS.js";var n=t(`arrow-up-right`,[[`path`,{d:`M7 7h10v10`,key:`1tivn9`}],[`path`,{d:`M7 17 17 7`,key:`1vkiza`}]]),r={job:`analytics:surfaces.job`,"quick-spec":`analytics:surfaces.quickSpec`,"explore-spec":`analytics:surfaces.exploreSpec`,"ai-edit":`analytics:surfaces.aiEdit`,smash:`analytics:surfaces.smash`,"file-summary":`analytics:surfaces.fileSummary`,loop:`analytics:surfaces.loop`,"chat-sidebar":`analytics:surfaces.chatSidebar`,"spec-launcher":`analytics:surfaces.specLauncher`,proposal:`analytics:surfaces.proposal`,"agent-studio":`analytics:surfaces.agentStudio`,setup:`analytics:surfaces.setup`},i={bg:`bg-muted/40`,text:`text-muted-foreground`,ring:`ring-border/40`,dot:`bg-muted-foreground`},a={job:{bg:`bg-accent-info/15`,text:`text-accent-info`,ring:`ring-accent-info/40`,dot:`bg-accent-info`},"quick-spec":{bg:`bg-accent-secondary/15`,text:`text-accent-secondary`,ring:`ring-accent-secondary/40`,dot:`bg-accent-secondary`},"explore-spec":{bg:`bg-accent-highlight/15`,text:`text-accent-highlight`,ring:`ring-accent-highlight/40`,dot:`bg-accent-highlight`},"ai-edit":{bg:`bg-accent-success/15`,text:`text-accent-success`,ring:`ring-accent-success/40`,dot:`bg-accent-success`},smash:{bg:`bg-accent-highlight/15`,text:`text-accent-highlight`,ring:`ring-accent-highlight/40`,dot:`bg-accent-highlight`},"file-summary":{bg:`bg-accent-warning/15`,text:`text-accent-warning`,ring:`ring-accent-warning/40`,dot:`bg-accent-warning`},loop:{bg:`bg-accent-primary/15`,text:`text-accent-primary`,ring:`ring-accent-primary/40`,dot:`bg-accent-primary`},"chat-sidebar":{bg:`bg-accent-info/15`,text:`text-accent-info`,ring:`ring-accent-info/40`,dot:`bg-accent-info`},"spec-launcher":{bg:`bg-accent-secondary/15`,text:`text-accent-secondary`,ring:`ring-accent-secondary/40`,dot:`bg-accent-secondary`},proposal:{bg:`bg-accent-highlight/15`,text:`text-accent-highlight`,ring:`ring-accent-highlight/40`,dot:`bg-accent-highlight`},"agent-studio":{bg:`bg-accent-success/15`,text:`text-accent-success`,ring:`ring-accent-success/40`,dot:`bg-accent-success`},setup:{bg:`bg-accent-primary/15`,text:`text-accent-primary`,ring:`ring-accent-primary/40`,dot:`bg-accent-primary`}};function o(e,t){return new Proxy(e,{get(e,n,r){return typeof n==`string`&&!(n in e)?t(n):Reflect.get(e,n,r)}})}var s=o(Object.defineProperties({},Object.fromEntries(Object.keys(r).map(t=>[t,{get:()=>e.t(r[t]),enumerable:!0}]))),e=>e),c=o(a,()=>i);export{s as n,n as r,c as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as e}from"./rolldown-runtime-CNC7AqOf.js";import{n as t,t as n}from"./jsx-runtime-zu2_FqZY.js";import{t as r}from"./react-dom-DiWzBDP9.js";import{h as i,l as a,r as o}from"./useSharedWebSocket-BZxKaVNT.js";var s=e(t(),1),c=e(r(),1);function l(e){if(!e||typeof document>`u`)return;let t=document.head||document.getElementsByTagName(`head`)[0],n=document.createElement(`style`);n.type=`text/css`,t.appendChild(n),n.styleSheet?n.styleSheet.cssText=e:n.appendChild(document.createTextNode(e))}var u=e=>{switch(e){case`success`:return p;case`info`:return h;case`warning`:return m;case`error`:return g;default:return null}},d=Array(12).fill(0),f=({visible:e,className:t})=>s.createElement(`div`,{className:[`sonner-loading-wrapper`,t].filter(Boolean).join(` `),"data-visible":e},s.createElement(`div`,{className:`sonner-spinner`},d.map((e,t)=>s.createElement(`div`,{className:`sonner-loading-bar`,key:`spinner-bar-${t}`})))),p=s.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 20 20`,fill:`currentColor`,height:`20`,width:`20`},s.createElement(`path`,{fillRule:`evenodd`,d:`M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z`,clipRule:`evenodd`})),m=s.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 24 24`,fill:`currentColor`,height:`20`,width:`20`},s.createElement(`path`,{fillRule:`evenodd`,d:`M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z`,clipRule:`evenodd`})),h=s.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 20 20`,fill:`currentColor`,height:`20`,width:`20`},s.createElement(`path`,{fillRule:`evenodd`,d:`M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z`,clipRule:`evenodd`})),g=s.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 20 20`,fill:`currentColor`,height:`20`,width:`20`},s.createElement(`path`,{fillRule:`evenodd`,d:`M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z`,clipRule:`evenodd`})),_=s.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,width:`12`,height:`12`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,strokeLinejoin:`round`},s.createElement(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),s.createElement(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})),v=()=>{let[e,t]=s.useState(document.hidden);return s.useEffect(()=>{let e=()=>{t(document.hidden)};return document.addEventListener(`visibilitychange`,e),()=>window.removeEventListener(`visibilitychange`,e)},[]),e},y=1,b=new class{constructor(){this.subscribe=e=>(this.subscribers.push(e),()=>{let t=this.subscribers.indexOf(e);this.subscribers.splice(t,1)}),this.publish=e=>{this.subscribers.forEach(t=>t(e))},this.addToast=e=>{this.publish(e),this.toasts=[...this.toasts,e]},this.create=e=>{let{message:t,...n}=e,r=typeof e?.id==`number`||e.id?.length>0?e.id:y++,i=this.toasts.find(e=>e.id===r),a=e.dismissible===void 0||e.dismissible;return this.dismissedToasts.has(r)&&this.dismissedToasts.delete(r),i?this.toasts=this.toasts.map(n=>n.id===r?(this.publish({...n,...e,id:r,title:t}),{...n,...e,id:r,dismissible:a,title:t}):n):this.addToast({title:t,...n,dismissible:a,id:r}),r},this.dismiss=e=>(e?(this.dismissedToasts.add(e),requestAnimationFrame(()=>this.subscribers.forEach(t=>t({id:e,dismiss:!0})))):this.toasts.forEach(e=>{this.subscribers.forEach(t=>t({id:e.id,dismiss:!0}))}),e),this.message=(e,t)=>this.create({...t,message:e}),this.error=(e,t)=>this.create({...t,message:e,type:`error`}),this.success=(e,t)=>this.create({...t,type:`success`,message:e}),this.info=(e,t)=>this.create({...t,type:`info`,message:e}),this.warning=(e,t)=>this.create({...t,type:`warning`,message:e}),this.loading=(e,t)=>this.create({...t,type:`loading`,message:e}),this.promise=(e,t)=>{if(!t)return;let n;t.loading!==void 0&&(n=this.create({...t,promise:e,type:`loading`,message:t.loading,description:typeof t.description==`function`?void 0:t.description}));let r=Promise.resolve(e instanceof Function?e():e),i=n!==void 0,a,o=r.then(async e=>{if(a=[`resolve`,e],s.isValidElement(e))i=!1,this.create({id:n,type:`default`,message:e});else if(S(e)&&!e.ok){i=!1;let r=typeof t.error==`function`?await t.error(`HTTP error! status: ${e.status}`):t.error,a=typeof t.description==`function`?await t.description(`HTTP error! status: ${e.status}`):t.description,o=typeof r==`object`&&!s.isValidElement(r)?r:{message:r};this.create({id:n,type:`error`,description:a,...o})}else if(e instanceof Error){i=!1;let r=typeof t.error==`function`?await t.error(e):t.error,a=typeof t.description==`function`?await t.description(e):t.description,o=typeof r==`object`&&!s.isValidElement(r)?r:{message:r};this.create({id:n,type:`error`,description:a,...o})}else if(t.success!==void 0){i=!1;let r=typeof t.success==`function`?await t.success(e):t.success,a=typeof t.description==`function`?await t.description(e):t.description,o=typeof r==`object`&&!s.isValidElement(r)?r:{message:r};this.create({id:n,type:`success`,description:a,...o})}}).catch(async e=>{if(a=[`reject`,e],t.error!==void 0){i=!1;let r=typeof t.error==`function`?await t.error(e):t.error,a=typeof t.description==`function`?await t.description(e):t.description,o=typeof r==`object`&&!s.isValidElement(r)?r:{message:r};this.create({id:n,type:`error`,description:a,...o})}}).finally(()=>{i&&(this.dismiss(n),n=void 0),t.finally==null||t.finally.call(t)}),c=()=>new Promise((e,t)=>o.then(()=>a[0]===`reject`?t(a[1]):e(a[1])).catch(t));return typeof n!=`string`&&typeof n!=`number`?{unwrap:c}:Object.assign(n,{unwrap:c})},this.custom=(e,t)=>{let n=t?.id||y++;return this.create({jsx:e(n),id:n,...t}),n},this.getActiveToasts=()=>this.toasts.filter(e=>!this.dismissedToasts.has(e.id)),this.subscribers=[],this.toasts=[],this.dismissedToasts=new Set}},x=(e,t)=>{let n=t?.id||y++;return b.addToast({title:e,...t,id:n}),n},S=e=>e&&typeof e==`object`&&`ok`in e&&typeof e.ok==`boolean`&&`status`in e&&typeof e.status==`number`,C=Object.assign(x,{success:b.success,info:b.info,warning:b.warning,error:b.error,custom:b.custom,message:b.message,promise:b.promise,dismiss:b.dismiss,loading:b.loading},{getHistory:()=>b.toasts,getToasts:()=>b.getActiveToasts()});l(`[data-sonner-toaster][dir=ltr],html[dir=ltr]{--toast-icon-margin-start:-3px;--toast-icon-margin-end:4px;--toast-svg-margin-start:-1px;--toast-svg-margin-end:0px;--toast-button-margin-start:auto;--toast-button-margin-end:0;--toast-close-button-start:0;--toast-close-button-end:unset;--toast-close-button-transform:translate(-35%, -35%)}[data-sonner-toaster][dir=rtl],html[dir=rtl]{--toast-icon-margin-start:4px;--toast-icon-margin-end:-3px;--toast-svg-margin-start:0px;--toast-svg-margin-end:-1px;--toast-button-margin-start:0;--toast-button-margin-end:auto;--toast-close-button-start:unset;--toast-close-button-end:0;--toast-close-button-transform:translate(35%, -35%)}[data-sonner-toaster]{position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1:hsl(0, 0%, 99%);--gray2:hsl(0, 0%, 97.3%);--gray3:hsl(0, 0%, 95.1%);--gray4:hsl(0, 0%, 93%);--gray5:hsl(0, 0%, 90.9%);--gray6:hsl(0, 0%, 88.7%);--gray7:hsl(0, 0%, 85.8%);--gray8:hsl(0, 0%, 78%);--gray9:hsl(0, 0%, 56.1%);--gray10:hsl(0, 0%, 52.3%);--gray11:hsl(0, 0%, 43.5%);--gray12:hsl(0, 0%, 9%);--border-radius:8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:0;z-index:999999999;transition:transform .4s ease}@media (hover:none) and (pointer:coarse){[data-sonner-toaster][data-lifted=true]{transform:none}}[data-sonner-toaster][data-x-position=right]{right:var(--offset-right)}[data-sonner-toaster][data-x-position=left]{left:var(--offset-left)}[data-sonner-toaster][data-x-position=center]{left:50%;transform:translateX(-50%)}[data-sonner-toaster][data-y-position=top]{top:var(--offset-top)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--offset-bottom)}[data-sonner-toast]{--y:translateY(100%);--lift-amount:calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:0;overflow-wrap:anywhere}[data-sonner-toast][data-styled=true]{padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px rgba(0,0,0,.1);width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}[data-sonner-toast]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-y-position=top]{top:0;--y:translateY(-100%);--lift:1;--lift-amount:calc(1 * var(--gap))}[data-sonner-toast][data-y-position=bottom]{bottom:0;--y:translateY(100%);--lift:-1;--lift-amount:calc(var(--lift) * var(--gap))}[data-sonner-toast][data-styled=true] [data-description]{font-weight:400;line-height:1.4;color:#3f3f3f}[data-rich-colors=true][data-sonner-toast][data-styled=true] [data-description]{color:inherit}[data-sonner-toaster][data-sonner-theme=dark] [data-description]{color:#e8e8e8}[data-sonner-toast][data-styled=true] [data-title]{font-weight:500;line-height:1.5;color:inherit}[data-sonner-toast][data-styled=true] [data-icon]{display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}[data-sonner-toast][data-promise=true] [data-icon]>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}[data-sonner-toast][data-styled=true] [data-icon]>*{flex-shrink:0}[data-sonner-toast][data-styled=true] [data-icon] svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}[data-sonner-toast][data-styled=true] [data-content]{display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;font-weight:500;cursor:pointer;outline:0;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}[data-sonner-toast][data-styled=true] [data-button]:focus-visible{box-shadow:0 0 0 2px rgba(0,0,0,.4)}[data-sonner-toast][data-styled=true] [data-button]:first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}[data-sonner-toast][data-styled=true] [data-cancel]{color:var(--normal-text);background:rgba(0,0,0,.08)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-styled=true] [data-cancel]{background:rgba(255,255,255,.3)}[data-sonner-toast][data-styled=true] [data-close-button]{position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--gray12);background:var(--normal-bg);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast][data-styled=true] [data-close-button]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-styled=true] [data-disabled=true]{cursor:not-allowed}[data-sonner-toast][data-styled=true]:hover [data-close-button]:hover{background:var(--gray2);border-color:var(--gray5)}[data-sonner-toast][data-swiping=true]::before{content:'';position:absolute;left:-100%;right:-100%;height:100%;z-index:-1}[data-sonner-toast][data-y-position=top][data-swiping=true]::before{bottom:50%;transform:scaleY(3) translateY(50%)}[data-sonner-toast][data-y-position=bottom][data-swiping=true]::before{top:50%;transform:scaleY(3) translateY(-50%)}[data-sonner-toast][data-swiping=false][data-removed=true]::before{content:'';position:absolute;inset:0;transform:scaleY(2)}[data-sonner-toast][data-expanded=true]::after{content:'';position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}[data-sonner-toast][data-mounted=true]{--y:translateY(0);opacity:1}[data-sonner-toast][data-expanded=false][data-front=false]{--scale:var(--toasts-before) * 0.05 + 1;--y:translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}[data-sonner-toast]>*{transition:opacity .4s}[data-sonner-toast][data-x-position=right]{right:0}[data-sonner-toast][data-x-position=left]{left:0}[data-sonner-toast][data-expanded=false][data-front=false][data-styled=true]>*{opacity:0}[data-sonner-toast][data-visible=false]{opacity:0;pointer-events:none}[data-sonner-toast][data-mounted=true][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}[data-sonner-toast][data-removed=true][data-front=true][data-swipe-out=false]{--y:translateY(calc(var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=false]{--y:translateY(40%);opacity:0;transition:transform .5s,opacity .2s}[data-sonner-toast][data-removed=true][data-front=false]::before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y,0)) translateX(var(--swipe-amount-x,0));transition:none}[data-sonner-toast][data-swiped=true]{user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width:600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-sonner-theme=light]{--normal-bg:#fff;--normal-border:var(--gray4);--normal-text:var(--gray12);--success-bg:hsl(143, 85%, 96%);--success-border:hsl(145, 92%, 87%);--success-text:hsl(140, 100%, 27%);--info-bg:hsl(208, 100%, 97%);--info-border:hsl(221, 91%, 93%);--info-text:hsl(210, 92%, 45%);--warning-bg:hsl(49, 100%, 97%);--warning-border:hsl(49, 91%, 84%);--warning-text:hsl(31, 92%, 45%);--error-bg:hsl(359, 100%, 97%);--error-border:hsl(359, 100%, 94%);--error-text:hsl(360, 100%, 45%)}[data-sonner-toaster][data-sonner-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg:#000;--normal-border:hsl(0, 0%, 20%);--normal-text:var(--gray1)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg:#fff;--normal-border:var(--gray3);--normal-text:var(--gray12)}[data-sonner-toaster][data-sonner-theme=dark]{--normal-bg:#000;--normal-bg-hover:hsl(0, 0%, 12%);--normal-border:hsl(0, 0%, 20%);--normal-border-hover:hsl(0, 0%, 25%);--normal-text:var(--gray1);--success-bg:hsl(150, 100%, 6%);--success-border:hsl(147, 100%, 12%);--success-text:hsl(150, 86%, 65%);--info-bg:hsl(215, 100%, 6%);--info-border:hsl(223, 43%, 17%);--info-text:hsl(216, 87%, 65%);--warning-bg:hsl(64, 100%, 6%);--warning-border:hsl(60, 100%, 9%);--warning-text:hsl(46, 87%, 65%);--error-bg:hsl(358, 76%, 10%);--error-border:hsl(357, 89%, 16%);--error-text:hsl(358, 100%, 81%)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size:16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:first-child{animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}100%{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}100%{opacity:.15}}@media (prefers-reduced-motion){.sonner-loading-bar,[data-sonner-toast],[data-sonner-toast]>*{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}`);function w(e){return e.label!==void 0}var T=3,E=`24px`,D=`16px`,O=4e3,k=356,A=14,j=45,ee=200;function M(...e){return e.filter(Boolean).join(` `)}function N(e){let[t,n]=e.split(`-`),r=[];return t&&r.push(t),n&&r.push(n),r}var P=e=>{let{invert:t,toast:n,unstyled:r,interacting:i,setHeights:a,visibleToasts:o,heights:c,index:l,toasts:d,expanded:p,removeToast:m,defaultRichColors:h,closeButton:g,style:y,cancelButtonStyle:b,actionButtonStyle:x,className:S=``,descriptionClassName:C=``,duration:T,position:E,gap:D,expandByDefault:k,classNames:A,icons:P,closeButtonAriaLabel:te=`Close toast`}=e,[F,I]=s.useState(null),[L,R]=s.useState(null),[z,B]=s.useState(!1),[V,H]=s.useState(!1),[U,W]=s.useState(!1),[ne,re]=s.useState(!1),[ie,G]=s.useState(!1),[ae,K]=s.useState(0),[oe,se]=s.useState(0),q=s.useRef(n.duration||T||O),ce=s.useRef(null),J=s.useRef(null),le=l===0,ue=l+1<=o,Y=n.type,X=n.dismissible!==!1,de=n.className||``,fe=n.descriptionClassName||``,pe=s.useMemo(()=>c.findIndex(e=>e.toastId===n.id)||0,[c,n.id]),me=s.useMemo(()=>n.closeButton??g,[n.closeButton,g]),he=s.useMemo(()=>n.duration||T||O,[n.duration,T]),ge=s.useRef(0),Z=s.useRef(0),_e=s.useRef(0),Q=s.useRef(null),[ve,ye]=E.split(`-`),be=s.useMemo(()=>c.reduce((e,t,n)=>n>=pe?e:e+t.height,0),[c,pe]),xe=v(),Se=n.invert||t,Ce=Y===`loading`;Z.current=s.useMemo(()=>pe*D+be,[pe,be]),s.useEffect(()=>{q.current=he},[he]),s.useEffect(()=>{B(!0)},[]),s.useEffect(()=>{let e=J.current;if(e){let t=e.getBoundingClientRect().height;return se(t),a(e=>[{toastId:n.id,height:t,position:n.position},...e]),()=>a(e=>e.filter(e=>e.toastId!==n.id))}},[a,n.id]),s.useLayoutEffect(()=>{if(!z)return;let e=J.current,t=e.style.height;e.style.height=`auto`;let r=e.getBoundingClientRect().height;e.style.height=t,se(r),a(e=>e.find(e=>e.toastId===n.id)?e.map(e=>e.toastId===n.id?{...e,height:r}:e):[{toastId:n.id,height:r,position:n.position},...e])},[z,n.title,n.description,a,n.id,n.jsx,n.action,n.cancel]);let $=s.useCallback(()=>{H(!0),K(Z.current),a(e=>e.filter(e=>e.toastId!==n.id)),setTimeout(()=>{m(n)},ee)},[n,m,a,Z]);s.useEffect(()=>{if(n.promise&&Y===`loading`||n.duration===1/0||n.type===`loading`)return;let e;return p||i||xe?(()=>{if(_e.current<ge.current){let e=new Date().getTime()-ge.current;q.current-=e}_e.current=new Date().getTime()})():q.current!==1/0&&(ge.current=new Date().getTime(),e=setTimeout(()=>{n.onAutoClose==null||n.onAutoClose.call(n,n),$()},q.current)),()=>clearTimeout(e)},[p,i,n,Y,xe,$]),s.useEffect(()=>{n.delete&&($(),n.onDismiss==null||n.onDismiss.call(n,n))},[$,n.delete]);function we(){return P?.loading?s.createElement(`div`,{className:M(A?.loader,n?.classNames?.loader,`sonner-loader`),"data-visible":Y===`loading`},P.loading):s.createElement(f,{className:M(A?.loader,n?.classNames?.loader),visible:Y===`loading`})}let Te=n.icon||P?.[Y]||u(Y);return s.createElement(`li`,{tabIndex:0,ref:J,className:M(S,de,A?.toast,n?.classNames?.toast,A?.default,A?.[Y],n?.classNames?.[Y]),"data-sonner-toast":``,"data-rich-colors":n.richColors??h,"data-styled":!(n.jsx||n.unstyled||r),"data-mounted":z,"data-promise":!!n.promise,"data-swiped":ie,"data-removed":V,"data-visible":ue,"data-y-position":ve,"data-x-position":ye,"data-index":l,"data-front":le,"data-swiping":U,"data-dismissible":X,"data-type":Y,"data-invert":Se,"data-swipe-out":ne,"data-swipe-direction":L,"data-expanded":!!(p||k&&z),"data-testid":n.testId,style:{"--index":l,"--toasts-before":l,"--z-index":d.length-l,"--offset":`${V?ae:Z.current}px`,"--initial-height":k?`auto`:`${oe}px`,...y,...n.style},onDragEnd:()=>{W(!1),I(null),Q.current=null},onPointerDown:e=>{e.button!==2&&(Ce||!X||(ce.current=new Date,K(Z.current),e.target.setPointerCapture(e.pointerId),e.target.tagName!==`BUTTON`&&(W(!0),Q.current={x:e.clientX,y:e.clientY})))},onPointerUp:()=>{if(ne||!X)return;Q.current=null;let e=Number(J.current?.style.getPropertyValue(`--swipe-amount-x`).replace(`px`,``)||0),t=Number(J.current?.style.getPropertyValue(`--swipe-amount-y`).replace(`px`,``)||0),r=new Date().getTime()-ce.current?.getTime(),i=F===`x`?e:t,a=Math.abs(i)/r;if(Math.abs(i)>=j||a>.11){K(Z.current),n.onDismiss==null||n.onDismiss.call(n,n),R(F===`x`?e>0?`right`:`left`:t>0?`down`:`up`),$(),re(!0);return}else{var o,s;(o=J.current)==null||o.style.setProperty(`--swipe-amount-x`,`0px`),(s=J.current)==null||s.style.setProperty(`--swipe-amount-y`,`0px`)}G(!1),W(!1),I(null)},onPointerMove:t=>{var n,r;if(!Q.current||!X||window.getSelection()?.toString().length>0)return;let i=t.clientY-Q.current.y,a=t.clientX-Q.current.x,o=e.swipeDirections??N(E);!F&&(Math.abs(a)>1||Math.abs(i)>1)&&I(Math.abs(a)>Math.abs(i)?`x`:`y`);let s={x:0,y:0},c=e=>1/(1.5+Math.abs(e)/20);if(F===`y`){if(o.includes(`top`)||o.includes(`bottom`))if(o.includes(`top`)&&i<0||o.includes(`bottom`)&&i>0)s.y=i;else{let e=i*c(i);s.y=Math.abs(e)<Math.abs(i)?e:i}}else if(F===`x`&&(o.includes(`left`)||o.includes(`right`)))if(o.includes(`left`)&&a<0||o.includes(`right`)&&a>0)s.x=a;else{let e=a*c(a);s.x=Math.abs(e)<Math.abs(a)?e:a}(Math.abs(s.x)>0||Math.abs(s.y)>0)&&G(!0),(n=J.current)==null||n.style.setProperty(`--swipe-amount-x`,`${s.x}px`),(r=J.current)==null||r.style.setProperty(`--swipe-amount-y`,`${s.y}px`)}},me&&!n.jsx&&Y!==`loading`?s.createElement(`button`,{"aria-label":te,"data-disabled":Ce,"data-close-button":!0,onClick:Ce||!X?()=>{}:()=>{$(),n.onDismiss==null||n.onDismiss.call(n,n)},className:M(A?.closeButton,n?.classNames?.closeButton)},P?.close??_):null,(Y||n.icon||n.promise)&&n.icon!==null&&(P?.[Y]!==null||n.icon)?s.createElement(`div`,{"data-icon":``,className:M(A?.icon,n?.classNames?.icon)},n.promise||n.type===`loading`&&!n.icon?n.icon||we():null,n.type===`loading`?null:Te):null,s.createElement(`div`,{"data-content":``,className:M(A?.content,n?.classNames?.content)},s.createElement(`div`,{"data-title":``,className:M(A?.title,n?.classNames?.title)},n.jsx?n.jsx:typeof n.title==`function`?n.title():n.title),n.description?s.createElement(`div`,{"data-description":``,className:M(C,fe,A?.description,n?.classNames?.description)},typeof n.description==`function`?n.description():n.description):null),s.isValidElement(n.cancel)?n.cancel:n.cancel&&w(n.cancel)?s.createElement(`button`,{"data-button":!0,"data-cancel":!0,style:n.cancelButtonStyle||b,onClick:e=>{w(n.cancel)&&X&&(n.cancel.onClick==null||n.cancel.onClick.call(n.cancel,e),$())},className:M(A?.cancelButton,n?.classNames?.cancelButton)},n.cancel.label):null,s.isValidElement(n.action)?n.action:n.action&&w(n.action)?s.createElement(`button`,{"data-button":!0,"data-action":!0,style:n.actionButtonStyle||x,onClick:e=>{w(n.action)&&(n.action.onClick==null||n.action.onClick.call(n.action,e),!e.defaultPrevented&&$())},className:M(A?.actionButton,n?.classNames?.actionButton)},n.action.label):null)};function te(){if(typeof window>`u`||typeof document>`u`)return`ltr`;let e=document.documentElement.getAttribute(`dir`);return e===`auto`||!e?window.getComputedStyle(document.documentElement).direction:e}function F(e,t){let n={};return[e,t].forEach((e,t)=>{let r=t===1,i=r?`--mobile-offset`:`--offset`,a=r?D:E;function o(e){[`top`,`right`,`bottom`,`left`].forEach(t=>{n[`${i}-${t}`]=typeof e==`number`?`${e}px`:e})}typeof e==`number`||typeof e==`string`?o(e):typeof e==`object`?[`top`,`right`,`bottom`,`left`].forEach(t=>{e[t]===void 0?n[`${i}-${t}`]=a:n[`${i}-${t}`]=typeof e[t]==`number`?`${e[t]}px`:e[t]}):o(a)}),n}var I=s.forwardRef(function(e,t){let{id:n,invert:r,position:i=`bottom-right`,hotkey:a=[`altKey`,`KeyT`],expand:o,closeButton:l,className:u,offset:d,mobileOffset:f,theme:p=`light`,richColors:m,duration:h,style:g,visibleToasts:_=T,toastOptions:v,dir:y=te(),gap:x=A,icons:S,containerAriaLabel:C=`Notifications`}=e,[w,E]=s.useState([]),D=s.useMemo(()=>n?w.filter(e=>e.toasterId===n):w.filter(e=>!e.toasterId),[w,n]),O=s.useMemo(()=>Array.from(new Set([i].concat(D.filter(e=>e.position).map(e=>e.position)))),[D,i]),[j,ee]=s.useState([]),[M,N]=s.useState(!1),[I,L]=s.useState(!1),[R,z]=s.useState(p===`system`?typeof window<`u`&&window.matchMedia&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`:p),B=s.useRef(null),V=a.join(`+`).replace(/Key/g,``).replace(/Digit/g,``),H=s.useRef(null),U=s.useRef(!1),W=s.useCallback(e=>{E(t=>(t.find(t=>t.id===e.id)?.delete||b.dismiss(e.id),t.filter(({id:t})=>t!==e.id)))},[]);return s.useEffect(()=>b.subscribe(e=>{if(e.dismiss){requestAnimationFrame(()=>{E(t=>t.map(t=>t.id===e.id?{...t,delete:!0}:t))});return}setTimeout(()=>{c.flushSync(()=>{E(t=>{let n=t.findIndex(t=>t.id===e.id);return n===-1?[e,...t]:[...t.slice(0,n),{...t[n],...e},...t.slice(n+1)]})})})}),[w]),s.useEffect(()=>{if(p!==`system`){z(p);return}if(p===`system`&&(window.matchMedia&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?z(`dark`):z(`light`)),typeof window>`u`)return;let e=window.matchMedia(`(prefers-color-scheme: dark)`);try{e.addEventListener(`change`,({matches:e})=>{z(e?`dark`:`light`)})}catch{e.addListener(({matches:e})=>{try{z(e?`dark`:`light`)}catch(e){console.error(e)}})}},[p]),s.useEffect(()=>{w.length<=1&&N(!1)},[w]),s.useEffect(()=>{let e=e=>{if(a.every(t=>e[t]||e.code===t)){var t;N(!0),(t=B.current)==null||t.focus()}e.code===`Escape`&&(document.activeElement===B.current||B.current?.contains(document.activeElement))&&N(!1)};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[a]),s.useEffect(()=>{if(B.current)return()=>{H.current&&(H.current.focus({preventScroll:!0}),H.current=null,U.current=!1)}},[B.current]),s.createElement(`section`,{ref:t,"aria-label":`${C} ${V}`,tabIndex:-1,"aria-live":`polite`,"aria-relevant":`additions text`,"aria-atomic":`false`,suppressHydrationWarning:!0},O.map((t,n)=>{let[i,a]=t.split(`-`);return D.length?s.createElement(`ol`,{key:t,dir:y===`auto`?te():y,tabIndex:-1,ref:B,className:u,"data-sonner-toaster":!0,"data-sonner-theme":R,"data-y-position":i,"data-x-position":a,style:{"--front-toast-height":`${j[0]?.height||0}px`,"--width":`${k}px`,"--gap":`${x}px`,...g,...F(d,f)},onBlur:e=>{U.current&&!e.currentTarget.contains(e.relatedTarget)&&(U.current=!1,H.current&&=(H.current.focus({preventScroll:!0}),null))},onFocus:e=>{e.target instanceof HTMLElement&&e.target.dataset.dismissible===`false`||U.current||(U.current=!0,H.current=e.relatedTarget)},onMouseEnter:()=>N(!0),onMouseMove:()=>N(!0),onMouseLeave:()=>{I||N(!1)},onDragEnd:()=>N(!1),onPointerDown:e=>{e.target instanceof HTMLElement&&e.target.dataset.dismissible===`false`||L(!0)},onPointerUp:()=>L(!1)},D.filter(e=>!e.position&&n===0||e.position===t).map((n,i)=>s.createElement(P,{key:n.id,icons:S,index:i,toast:n,defaultRichColors:m,duration:v?.duration??h,className:v?.className,descriptionClassName:v?.descriptionClassName,invert:r,visibleToasts:_,closeButton:v?.closeButton??l,interacting:I,position:t,style:v?.style,unstyled:v?.unstyled,classNames:v?.classNames,cancelButtonStyle:v?.cancelButtonStyle,actionButtonStyle:v?.actionButtonStyle,closeButtonAriaLabel:v?.closeButtonAriaLabel,removeToast:W,toasts:D.filter(e=>e.position==n.position),heights:j.filter(e=>e.position==n.position),setHeights:ee,expandByDefault:o,gap:x,expanded:M,swipeDirections:e.swipeDirections}))):null}))}),L=null;function R(e){L=e}function z(){if(!L)throw Error(`getApiBase called with no active project — call setActiveProjectId first`);return`${a}/api/projects/${L}`}var B=new Map;function V(e,t){return`${e}:${t}`}function H(e){return(e instanceof Error?e.message:e==null?``:String(e)).trim()||`Request failed`}function U(e){if(!e)return;let t=`${e}:`;for(let e of B.keys())e.startsWith(t)&&B.delete(e)}function W({namespace:e,projectId:t,initialValue:n,fetcher:r,pollInterval:i=0}){let a=t?V(t,e):null,[o,c]=(0,s.useState)(()=>a&&B.has(a)?B.get(a):n),[l,u]=(0,s.useState)(()=>!a||!B.has(a)),[d,f]=(0,s.useState)(l),[p,m]=(0,s.useState)(null),h=(0,s.useRef)(r);h.current=r;let g=(0,s.useRef)(n);g.current=n;let _=(0,s.useRef)(a);_.current=a;let v=(0,s.useRef)(0),y=(0,s.useRef)(null),b=(0,s.useCallback)(async(e,t,n)=>{let r=++v.current;y.current?.abort();let i=new AbortController;y.current=i,n&&_.current===e&&(f(!0),m(null));try{let n=await h.current({projectId:t,signal:i.signal});if(i.signal.aborted||r!==v.current)return;B.set(e,n),_.current===e&&(c(n),m(null))}catch(t){if(i.signal.aborted||r!==v.current)return;_.current===e&&m(H(t))}finally{r===v.current&&(y.current===i&&(y.current=null),_.current===e&&(f(!1),u(!1)))}},[]);return(0,s.useEffect)(()=>{if(v.current+=1,y.current?.abort(),y.current=null,m(null),!a||!t){c(g.current),u(!0),f(!1);return}let e=B.has(a);e?(c(B.get(a)),u(!1),f(!1)):(c(g.current),u(!0),f(!0)),b(a,t,!e);let n;return i>0&&(n=setInterval(()=>{b(a,t,!1)},i)),()=>{v.current+=1,y.current?.abort(),y.current=null,n&&clearInterval(n)}},[a,t,i,b]),{data:o,isLoading:d,isFirstLoad:l,error:p,refresh:(0,s.useCallback)(async()=>{!a||!t||await b(a,t,!0)},[a,t,b])}}var ne=n();function re(e){return e.providers&&e.providers.length>0?e.providers:[e.provider]}var ie=(0,s.createContext)(null),G=`specrails-desktop:activeProjectId`;function ae(e){try{e?localStorage.setItem(G,e):localStorage.removeItem(G)}catch{}}function K(){try{return localStorage.getItem(G)}catch{return null}}function oe({children:e,isolated:t=!1}){let n=(0,s.useCallback)(e=>{t||ae(e)},[t]),[r,c]=(0,s.useState)([]),[l,u]=(0,s.useState)(null),[d,f]=(0,s.useState)(!0),[p,m]=(0,s.useState)(!1),h=(0,s.useRef)(null),g=(0,s.useRef)(new Set),_=(0,s.useRef)(!1),v=(0,s.useRef)(0),y=(0,s.useRef)(null),b=(0,s.useRef)(null),x=(0,s.useRef)(0),S=(0,s.useCallback)(e=>{n(e),R(e),u(t=>(t!==null&&t!==e&&(h.current&&clearTimeout(h.current),m(!0),h.current=setTimeout(()=>m(!1),400)),e))},[n]),{registerHandler:w,unregisterHandler:T,connectionStatus:E}=o(),D=(0,s.useCallback)(async function e(){if(!_.current||y.current)return;b.current&&clearTimeout(b.current);let r=new AbortController;y.current=r;let i=v.current,o=setTimeout(()=>r.abort(),8e3);try{let e=await fetch(`${a}/api/projects`,{signal:r.signal});if(!e.ok)throw Error(`HTTP ${e.status}`);let o=await e.json();if(!Array.isArray(o.projects))throw Error(`Invalid project snapshot`);if(!_.current||r.signal.aborted||i!==v.current)return;c(o.projects);let s=o.projects;u(e=>{if(e&&s.some(t=>t.id===e))return e;let r=t?null:K(),i=r&&s.some(e=>e.id===r)?r:null;return n(i),R(i),i}),x.current=0,f(!1)}catch{if(_.current&&i===v.current){let t=Math.min(500*2**Math.min(x.current++,5),1e4);b.current=setTimeout(()=>{e()},t)}}finally{clearTimeout(o),y.current===r&&(y.current=null)}},[t,n]);(0,s.useEffect)(()=>{_.current=!0,D();let e=()=>{D()};return window.addEventListener(`online`,e),window.addEventListener(`focus`,e),()=>{_.current=!1,v.current++,y.current?.abort(),y.current=null,b.current&&clearTimeout(b.current),h.current&&clearTimeout(h.current),window.removeEventListener(`online`,e),window.removeEventListener(`focus`,e)}},[D]);let O=(0,s.useRef)(E),k=(0,s.useRef)(E===`connected`);(0,s.useEffect)(()=>{E===`connected`&&(k.current&&O.current!==`connected`&&D(),k.current=!0),O.current=E},[E,D]);let A=(0,s.useCallback)(e=>{if(!e||typeof e!=`object`)return;let r=e;if(typeof r.type==`string`){if(r.type===`desktop.projects`){if(!Array.isArray(r.projects))return;v.current++,x.current=0,b.current&&clearTimeout(b.current);let e=r.projects;c(e),u(r=>{let i;if(r&&e.find(e=>e.id===r))i=r;else{let n=t?null:K();i=n&&e.find(e=>e.id===n)?n:!t&&e.length>0?e[0].id:null}return n(i),R(i),i}),f(!1)}else if(r.type===`desktop.project_added`){let e=r.project;if(!e||typeof e.id!=`string`)return;v.current++,c(t=>t.find(t=>t.id===e.id)?t:[...t,e]),g.current.has(e.id)?g.current.delete(e.id):t||(C.success(i.t(`nav:projects.added`,{name:e.name})),S(e.id))}else if(r.type===`providers.detected_changed`)D();else if(r.type===`desktop.project_removed`){let e=r.projectId;if(typeof e!=`string`)return;v.current++,t||C.success(i.t(`nav:projects.removed`)),U(e),c(t=>t.filter(t=>t.id!==e)),u(t=>t===e?(n(null),R(null),null):t)}}},[D,S,t,n]);(0,s.useLayoutEffect)(()=>(w(`desktop`,A),()=>T(`desktop`)),[A,w,T]);let j=(0,s.useRef)(0);(0,s.useEffect)(()=>{let e=()=>{let e=Date.now();e-j.current<6e4||(j.current=e,fetch(`${a}/api/providers/detected?refresh=1`).catch(()=>{}))};return window.addEventListener(`focus`,e),()=>window.removeEventListener(`focus`,e)},[]);let ee=(0,s.useCallback)(async(e,t,n,r,i)=>{try{let a={path:e};n&&n.length>0&&(a.providers=n),t&&(a.name=t),r?.length&&(a.repositories=r),i?.length&&(a.workspacePaths=i);let o=await fetch(`/api/projects`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(a)});if(!o.ok){let e=await o.json();throw Error(e.error??`HTTP ${o.status}`)}let s=await o.json();return g.current.add(s.project.id),v.current++,c(e=>e.find(e=>e.id===s.project.id)?e:[...e,s.project]),S(s.project.id),s}catch(e){throw console.error(`[useDesktop] addProject error:`,e),e}},[S]),M=(0,s.useCallback)(async e=>{try{let t=await fetch(`${a}/api/projects/${e}`,{method:`DELETE`});if(!t.ok){let e=await t.json();throw Error(e.error??`HTTP ${t.status}`)}U(e),v.current++,c(t=>t.filter(t=>t.id!==e)),u(t=>t===e?(n(null),R(null),null):t)}catch(e){throw console.error(`[useDesktop] removeProject error:`,e),e}},[n]),N=(0,s.useMemo)(()=>({projects:r,activeProjectId:l,setActiveProjectId:S,addProject:ee,removeProject:M,refreshProjects:D,isLoading:d,isSwitchingProject:p}),[r,l,S,ee,M,D,d,p]);return(0,ne.jsx)(ie.Provider,{value:N,children:e})}var se={projects:[],activeProjectId:null,setActiveProjectId:()=>{},addProject:async()=>null,removeProject:async()=>{},refreshProjects:async()=>{},isLoading:!1,isSwitchingProject:!1};function q(){return(0,s.useContext)(ie)??se}export{z as a,W as i,re as n,I as o,q as r,C as s,oe as t};
|
|
1
|
+
import{a as e}from"./rolldown-runtime-CNC7AqOf.js";import{n as t,t as n}from"./jsx-runtime-zu2_FqZY.js";import{t as r}from"./react-dom-DiWzBDP9.js";import{h as i,l as a,r as o}from"./useSharedWebSocket-BEHPeU1Y.js";var s=e(t(),1),c=e(r(),1);function l(e){if(!e||typeof document>`u`)return;let t=document.head||document.getElementsByTagName(`head`)[0],n=document.createElement(`style`);n.type=`text/css`,t.appendChild(n),n.styleSheet?n.styleSheet.cssText=e:n.appendChild(document.createTextNode(e))}var u=e=>{switch(e){case`success`:return p;case`info`:return h;case`warning`:return m;case`error`:return g;default:return null}},d=Array(12).fill(0),f=({visible:e,className:t})=>s.createElement(`div`,{className:[`sonner-loading-wrapper`,t].filter(Boolean).join(` `),"data-visible":e},s.createElement(`div`,{className:`sonner-spinner`},d.map((e,t)=>s.createElement(`div`,{className:`sonner-loading-bar`,key:`spinner-bar-${t}`})))),p=s.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 20 20`,fill:`currentColor`,height:`20`,width:`20`},s.createElement(`path`,{fillRule:`evenodd`,d:`M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z`,clipRule:`evenodd`})),m=s.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 24 24`,fill:`currentColor`,height:`20`,width:`20`},s.createElement(`path`,{fillRule:`evenodd`,d:`M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z`,clipRule:`evenodd`})),h=s.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 20 20`,fill:`currentColor`,height:`20`,width:`20`},s.createElement(`path`,{fillRule:`evenodd`,d:`M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z`,clipRule:`evenodd`})),g=s.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 20 20`,fill:`currentColor`,height:`20`,width:`20`},s.createElement(`path`,{fillRule:`evenodd`,d:`M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z`,clipRule:`evenodd`})),_=s.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,width:`12`,height:`12`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,strokeLinejoin:`round`},s.createElement(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),s.createElement(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})),v=()=>{let[e,t]=s.useState(document.hidden);return s.useEffect(()=>{let e=()=>{t(document.hidden)};return document.addEventListener(`visibilitychange`,e),()=>window.removeEventListener(`visibilitychange`,e)},[]),e},y=1,b=new class{constructor(){this.subscribe=e=>(this.subscribers.push(e),()=>{let t=this.subscribers.indexOf(e);this.subscribers.splice(t,1)}),this.publish=e=>{this.subscribers.forEach(t=>t(e))},this.addToast=e=>{this.publish(e),this.toasts=[...this.toasts,e]},this.create=e=>{let{message:t,...n}=e,r=typeof e?.id==`number`||e.id?.length>0?e.id:y++,i=this.toasts.find(e=>e.id===r),a=e.dismissible===void 0||e.dismissible;return this.dismissedToasts.has(r)&&this.dismissedToasts.delete(r),i?this.toasts=this.toasts.map(n=>n.id===r?(this.publish({...n,...e,id:r,title:t}),{...n,...e,id:r,dismissible:a,title:t}):n):this.addToast({title:t,...n,dismissible:a,id:r}),r},this.dismiss=e=>(e?(this.dismissedToasts.add(e),requestAnimationFrame(()=>this.subscribers.forEach(t=>t({id:e,dismiss:!0})))):this.toasts.forEach(e=>{this.subscribers.forEach(t=>t({id:e.id,dismiss:!0}))}),e),this.message=(e,t)=>this.create({...t,message:e}),this.error=(e,t)=>this.create({...t,message:e,type:`error`}),this.success=(e,t)=>this.create({...t,type:`success`,message:e}),this.info=(e,t)=>this.create({...t,type:`info`,message:e}),this.warning=(e,t)=>this.create({...t,type:`warning`,message:e}),this.loading=(e,t)=>this.create({...t,type:`loading`,message:e}),this.promise=(e,t)=>{if(!t)return;let n;t.loading!==void 0&&(n=this.create({...t,promise:e,type:`loading`,message:t.loading,description:typeof t.description==`function`?void 0:t.description}));let r=Promise.resolve(e instanceof Function?e():e),i=n!==void 0,a,o=r.then(async e=>{if(a=[`resolve`,e],s.isValidElement(e))i=!1,this.create({id:n,type:`default`,message:e});else if(S(e)&&!e.ok){i=!1;let r=typeof t.error==`function`?await t.error(`HTTP error! status: ${e.status}`):t.error,a=typeof t.description==`function`?await t.description(`HTTP error! status: ${e.status}`):t.description,o=typeof r==`object`&&!s.isValidElement(r)?r:{message:r};this.create({id:n,type:`error`,description:a,...o})}else if(e instanceof Error){i=!1;let r=typeof t.error==`function`?await t.error(e):t.error,a=typeof t.description==`function`?await t.description(e):t.description,o=typeof r==`object`&&!s.isValidElement(r)?r:{message:r};this.create({id:n,type:`error`,description:a,...o})}else if(t.success!==void 0){i=!1;let r=typeof t.success==`function`?await t.success(e):t.success,a=typeof t.description==`function`?await t.description(e):t.description,o=typeof r==`object`&&!s.isValidElement(r)?r:{message:r};this.create({id:n,type:`success`,description:a,...o})}}).catch(async e=>{if(a=[`reject`,e],t.error!==void 0){i=!1;let r=typeof t.error==`function`?await t.error(e):t.error,a=typeof t.description==`function`?await t.description(e):t.description,o=typeof r==`object`&&!s.isValidElement(r)?r:{message:r};this.create({id:n,type:`error`,description:a,...o})}}).finally(()=>{i&&(this.dismiss(n),n=void 0),t.finally==null||t.finally.call(t)}),c=()=>new Promise((e,t)=>o.then(()=>a[0]===`reject`?t(a[1]):e(a[1])).catch(t));return typeof n!=`string`&&typeof n!=`number`?{unwrap:c}:Object.assign(n,{unwrap:c})},this.custom=(e,t)=>{let n=t?.id||y++;return this.create({jsx:e(n),id:n,...t}),n},this.getActiveToasts=()=>this.toasts.filter(e=>!this.dismissedToasts.has(e.id)),this.subscribers=[],this.toasts=[],this.dismissedToasts=new Set}},x=(e,t)=>{let n=t?.id||y++;return b.addToast({title:e,...t,id:n}),n},S=e=>e&&typeof e==`object`&&`ok`in e&&typeof e.ok==`boolean`&&`status`in e&&typeof e.status==`number`,C=Object.assign(x,{success:b.success,info:b.info,warning:b.warning,error:b.error,custom:b.custom,message:b.message,promise:b.promise,dismiss:b.dismiss,loading:b.loading},{getHistory:()=>b.toasts,getToasts:()=>b.getActiveToasts()});l(`[data-sonner-toaster][dir=ltr],html[dir=ltr]{--toast-icon-margin-start:-3px;--toast-icon-margin-end:4px;--toast-svg-margin-start:-1px;--toast-svg-margin-end:0px;--toast-button-margin-start:auto;--toast-button-margin-end:0;--toast-close-button-start:0;--toast-close-button-end:unset;--toast-close-button-transform:translate(-35%, -35%)}[data-sonner-toaster][dir=rtl],html[dir=rtl]{--toast-icon-margin-start:4px;--toast-icon-margin-end:-3px;--toast-svg-margin-start:0px;--toast-svg-margin-end:-1px;--toast-button-margin-start:0;--toast-button-margin-end:auto;--toast-close-button-start:unset;--toast-close-button-end:0;--toast-close-button-transform:translate(35%, -35%)}[data-sonner-toaster]{position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1:hsl(0, 0%, 99%);--gray2:hsl(0, 0%, 97.3%);--gray3:hsl(0, 0%, 95.1%);--gray4:hsl(0, 0%, 93%);--gray5:hsl(0, 0%, 90.9%);--gray6:hsl(0, 0%, 88.7%);--gray7:hsl(0, 0%, 85.8%);--gray8:hsl(0, 0%, 78%);--gray9:hsl(0, 0%, 56.1%);--gray10:hsl(0, 0%, 52.3%);--gray11:hsl(0, 0%, 43.5%);--gray12:hsl(0, 0%, 9%);--border-radius:8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:0;z-index:999999999;transition:transform .4s ease}@media (hover:none) and (pointer:coarse){[data-sonner-toaster][data-lifted=true]{transform:none}}[data-sonner-toaster][data-x-position=right]{right:var(--offset-right)}[data-sonner-toaster][data-x-position=left]{left:var(--offset-left)}[data-sonner-toaster][data-x-position=center]{left:50%;transform:translateX(-50%)}[data-sonner-toaster][data-y-position=top]{top:var(--offset-top)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--offset-bottom)}[data-sonner-toast]{--y:translateY(100%);--lift-amount:calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:0;overflow-wrap:anywhere}[data-sonner-toast][data-styled=true]{padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px rgba(0,0,0,.1);width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}[data-sonner-toast]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-y-position=top]{top:0;--y:translateY(-100%);--lift:1;--lift-amount:calc(1 * var(--gap))}[data-sonner-toast][data-y-position=bottom]{bottom:0;--y:translateY(100%);--lift:-1;--lift-amount:calc(var(--lift) * var(--gap))}[data-sonner-toast][data-styled=true] [data-description]{font-weight:400;line-height:1.4;color:#3f3f3f}[data-rich-colors=true][data-sonner-toast][data-styled=true] [data-description]{color:inherit}[data-sonner-toaster][data-sonner-theme=dark] [data-description]{color:#e8e8e8}[data-sonner-toast][data-styled=true] [data-title]{font-weight:500;line-height:1.5;color:inherit}[data-sonner-toast][data-styled=true] [data-icon]{display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}[data-sonner-toast][data-promise=true] [data-icon]>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}[data-sonner-toast][data-styled=true] [data-icon]>*{flex-shrink:0}[data-sonner-toast][data-styled=true] [data-icon] svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}[data-sonner-toast][data-styled=true] [data-content]{display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;font-weight:500;cursor:pointer;outline:0;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}[data-sonner-toast][data-styled=true] [data-button]:focus-visible{box-shadow:0 0 0 2px rgba(0,0,0,.4)}[data-sonner-toast][data-styled=true] [data-button]:first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}[data-sonner-toast][data-styled=true] [data-cancel]{color:var(--normal-text);background:rgba(0,0,0,.08)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-styled=true] [data-cancel]{background:rgba(255,255,255,.3)}[data-sonner-toast][data-styled=true] [data-close-button]{position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--gray12);background:var(--normal-bg);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast][data-styled=true] [data-close-button]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-styled=true] [data-disabled=true]{cursor:not-allowed}[data-sonner-toast][data-styled=true]:hover [data-close-button]:hover{background:var(--gray2);border-color:var(--gray5)}[data-sonner-toast][data-swiping=true]::before{content:'';position:absolute;left:-100%;right:-100%;height:100%;z-index:-1}[data-sonner-toast][data-y-position=top][data-swiping=true]::before{bottom:50%;transform:scaleY(3) translateY(50%)}[data-sonner-toast][data-y-position=bottom][data-swiping=true]::before{top:50%;transform:scaleY(3) translateY(-50%)}[data-sonner-toast][data-swiping=false][data-removed=true]::before{content:'';position:absolute;inset:0;transform:scaleY(2)}[data-sonner-toast][data-expanded=true]::after{content:'';position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}[data-sonner-toast][data-mounted=true]{--y:translateY(0);opacity:1}[data-sonner-toast][data-expanded=false][data-front=false]{--scale:var(--toasts-before) * 0.05 + 1;--y:translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}[data-sonner-toast]>*{transition:opacity .4s}[data-sonner-toast][data-x-position=right]{right:0}[data-sonner-toast][data-x-position=left]{left:0}[data-sonner-toast][data-expanded=false][data-front=false][data-styled=true]>*{opacity:0}[data-sonner-toast][data-visible=false]{opacity:0;pointer-events:none}[data-sonner-toast][data-mounted=true][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}[data-sonner-toast][data-removed=true][data-front=true][data-swipe-out=false]{--y:translateY(calc(var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=false]{--y:translateY(40%);opacity:0;transition:transform .5s,opacity .2s}[data-sonner-toast][data-removed=true][data-front=false]::before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y,0)) translateX(var(--swipe-amount-x,0));transition:none}[data-sonner-toast][data-swiped=true]{user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width:600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-sonner-theme=light]{--normal-bg:#fff;--normal-border:var(--gray4);--normal-text:var(--gray12);--success-bg:hsl(143, 85%, 96%);--success-border:hsl(145, 92%, 87%);--success-text:hsl(140, 100%, 27%);--info-bg:hsl(208, 100%, 97%);--info-border:hsl(221, 91%, 93%);--info-text:hsl(210, 92%, 45%);--warning-bg:hsl(49, 100%, 97%);--warning-border:hsl(49, 91%, 84%);--warning-text:hsl(31, 92%, 45%);--error-bg:hsl(359, 100%, 97%);--error-border:hsl(359, 100%, 94%);--error-text:hsl(360, 100%, 45%)}[data-sonner-toaster][data-sonner-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg:#000;--normal-border:hsl(0, 0%, 20%);--normal-text:var(--gray1)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg:#fff;--normal-border:var(--gray3);--normal-text:var(--gray12)}[data-sonner-toaster][data-sonner-theme=dark]{--normal-bg:#000;--normal-bg-hover:hsl(0, 0%, 12%);--normal-border:hsl(0, 0%, 20%);--normal-border-hover:hsl(0, 0%, 25%);--normal-text:var(--gray1);--success-bg:hsl(150, 100%, 6%);--success-border:hsl(147, 100%, 12%);--success-text:hsl(150, 86%, 65%);--info-bg:hsl(215, 100%, 6%);--info-border:hsl(223, 43%, 17%);--info-text:hsl(216, 87%, 65%);--warning-bg:hsl(64, 100%, 6%);--warning-border:hsl(60, 100%, 9%);--warning-text:hsl(46, 87%, 65%);--error-bg:hsl(358, 76%, 10%);--error-border:hsl(357, 89%, 16%);--error-text:hsl(358, 100%, 81%)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size:16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:first-child{animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}100%{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}100%{opacity:.15}}@media (prefers-reduced-motion){.sonner-loading-bar,[data-sonner-toast],[data-sonner-toast]>*{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}`);function w(e){return e.label!==void 0}var T=3,E=`24px`,D=`16px`,O=4e3,k=356,A=14,j=45,ee=200;function M(...e){return e.filter(Boolean).join(` `)}function N(e){let[t,n]=e.split(`-`),r=[];return t&&r.push(t),n&&r.push(n),r}var P=e=>{let{invert:t,toast:n,unstyled:r,interacting:i,setHeights:a,visibleToasts:o,heights:c,index:l,toasts:d,expanded:p,removeToast:m,defaultRichColors:h,closeButton:g,style:y,cancelButtonStyle:b,actionButtonStyle:x,className:S=``,descriptionClassName:C=``,duration:T,position:E,gap:D,expandByDefault:k,classNames:A,icons:P,closeButtonAriaLabel:te=`Close toast`}=e,[F,I]=s.useState(null),[L,R]=s.useState(null),[z,B]=s.useState(!1),[V,H]=s.useState(!1),[U,W]=s.useState(!1),[ne,re]=s.useState(!1),[ie,G]=s.useState(!1),[ae,K]=s.useState(0),[oe,se]=s.useState(0),q=s.useRef(n.duration||T||O),ce=s.useRef(null),J=s.useRef(null),le=l===0,ue=l+1<=o,Y=n.type,X=n.dismissible!==!1,de=n.className||``,fe=n.descriptionClassName||``,pe=s.useMemo(()=>c.findIndex(e=>e.toastId===n.id)||0,[c,n.id]),me=s.useMemo(()=>n.closeButton??g,[n.closeButton,g]),he=s.useMemo(()=>n.duration||T||O,[n.duration,T]),ge=s.useRef(0),Z=s.useRef(0),_e=s.useRef(0),Q=s.useRef(null),[ve,ye]=E.split(`-`),be=s.useMemo(()=>c.reduce((e,t,n)=>n>=pe?e:e+t.height,0),[c,pe]),xe=v(),Se=n.invert||t,Ce=Y===`loading`;Z.current=s.useMemo(()=>pe*D+be,[pe,be]),s.useEffect(()=>{q.current=he},[he]),s.useEffect(()=>{B(!0)},[]),s.useEffect(()=>{let e=J.current;if(e){let t=e.getBoundingClientRect().height;return se(t),a(e=>[{toastId:n.id,height:t,position:n.position},...e]),()=>a(e=>e.filter(e=>e.toastId!==n.id))}},[a,n.id]),s.useLayoutEffect(()=>{if(!z)return;let e=J.current,t=e.style.height;e.style.height=`auto`;let r=e.getBoundingClientRect().height;e.style.height=t,se(r),a(e=>e.find(e=>e.toastId===n.id)?e.map(e=>e.toastId===n.id?{...e,height:r}:e):[{toastId:n.id,height:r,position:n.position},...e])},[z,n.title,n.description,a,n.id,n.jsx,n.action,n.cancel]);let $=s.useCallback(()=>{H(!0),K(Z.current),a(e=>e.filter(e=>e.toastId!==n.id)),setTimeout(()=>{m(n)},ee)},[n,m,a,Z]);s.useEffect(()=>{if(n.promise&&Y===`loading`||n.duration===1/0||n.type===`loading`)return;let e;return p||i||xe?(()=>{if(_e.current<ge.current){let e=new Date().getTime()-ge.current;q.current-=e}_e.current=new Date().getTime()})():q.current!==1/0&&(ge.current=new Date().getTime(),e=setTimeout(()=>{n.onAutoClose==null||n.onAutoClose.call(n,n),$()},q.current)),()=>clearTimeout(e)},[p,i,n,Y,xe,$]),s.useEffect(()=>{n.delete&&($(),n.onDismiss==null||n.onDismiss.call(n,n))},[$,n.delete]);function we(){return P?.loading?s.createElement(`div`,{className:M(A?.loader,n?.classNames?.loader,`sonner-loader`),"data-visible":Y===`loading`},P.loading):s.createElement(f,{className:M(A?.loader,n?.classNames?.loader),visible:Y===`loading`})}let Te=n.icon||P?.[Y]||u(Y);return s.createElement(`li`,{tabIndex:0,ref:J,className:M(S,de,A?.toast,n?.classNames?.toast,A?.default,A?.[Y],n?.classNames?.[Y]),"data-sonner-toast":``,"data-rich-colors":n.richColors??h,"data-styled":!(n.jsx||n.unstyled||r),"data-mounted":z,"data-promise":!!n.promise,"data-swiped":ie,"data-removed":V,"data-visible":ue,"data-y-position":ve,"data-x-position":ye,"data-index":l,"data-front":le,"data-swiping":U,"data-dismissible":X,"data-type":Y,"data-invert":Se,"data-swipe-out":ne,"data-swipe-direction":L,"data-expanded":!!(p||k&&z),"data-testid":n.testId,style:{"--index":l,"--toasts-before":l,"--z-index":d.length-l,"--offset":`${V?ae:Z.current}px`,"--initial-height":k?`auto`:`${oe}px`,...y,...n.style},onDragEnd:()=>{W(!1),I(null),Q.current=null},onPointerDown:e=>{e.button!==2&&(Ce||!X||(ce.current=new Date,K(Z.current),e.target.setPointerCapture(e.pointerId),e.target.tagName!==`BUTTON`&&(W(!0),Q.current={x:e.clientX,y:e.clientY})))},onPointerUp:()=>{if(ne||!X)return;Q.current=null;let e=Number(J.current?.style.getPropertyValue(`--swipe-amount-x`).replace(`px`,``)||0),t=Number(J.current?.style.getPropertyValue(`--swipe-amount-y`).replace(`px`,``)||0),r=new Date().getTime()-ce.current?.getTime(),i=F===`x`?e:t,a=Math.abs(i)/r;if(Math.abs(i)>=j||a>.11){K(Z.current),n.onDismiss==null||n.onDismiss.call(n,n),R(F===`x`?e>0?`right`:`left`:t>0?`down`:`up`),$(),re(!0);return}else{var o,s;(o=J.current)==null||o.style.setProperty(`--swipe-amount-x`,`0px`),(s=J.current)==null||s.style.setProperty(`--swipe-amount-y`,`0px`)}G(!1),W(!1),I(null)},onPointerMove:t=>{var n,r;if(!Q.current||!X||window.getSelection()?.toString().length>0)return;let i=t.clientY-Q.current.y,a=t.clientX-Q.current.x,o=e.swipeDirections??N(E);!F&&(Math.abs(a)>1||Math.abs(i)>1)&&I(Math.abs(a)>Math.abs(i)?`x`:`y`);let s={x:0,y:0},c=e=>1/(1.5+Math.abs(e)/20);if(F===`y`){if(o.includes(`top`)||o.includes(`bottom`))if(o.includes(`top`)&&i<0||o.includes(`bottom`)&&i>0)s.y=i;else{let e=i*c(i);s.y=Math.abs(e)<Math.abs(i)?e:i}}else if(F===`x`&&(o.includes(`left`)||o.includes(`right`)))if(o.includes(`left`)&&a<0||o.includes(`right`)&&a>0)s.x=a;else{let e=a*c(a);s.x=Math.abs(e)<Math.abs(a)?e:a}(Math.abs(s.x)>0||Math.abs(s.y)>0)&&G(!0),(n=J.current)==null||n.style.setProperty(`--swipe-amount-x`,`${s.x}px`),(r=J.current)==null||r.style.setProperty(`--swipe-amount-y`,`${s.y}px`)}},me&&!n.jsx&&Y!==`loading`?s.createElement(`button`,{"aria-label":te,"data-disabled":Ce,"data-close-button":!0,onClick:Ce||!X?()=>{}:()=>{$(),n.onDismiss==null||n.onDismiss.call(n,n)},className:M(A?.closeButton,n?.classNames?.closeButton)},P?.close??_):null,(Y||n.icon||n.promise)&&n.icon!==null&&(P?.[Y]!==null||n.icon)?s.createElement(`div`,{"data-icon":``,className:M(A?.icon,n?.classNames?.icon)},n.promise||n.type===`loading`&&!n.icon?n.icon||we():null,n.type===`loading`?null:Te):null,s.createElement(`div`,{"data-content":``,className:M(A?.content,n?.classNames?.content)},s.createElement(`div`,{"data-title":``,className:M(A?.title,n?.classNames?.title)},n.jsx?n.jsx:typeof n.title==`function`?n.title():n.title),n.description?s.createElement(`div`,{"data-description":``,className:M(C,fe,A?.description,n?.classNames?.description)},typeof n.description==`function`?n.description():n.description):null),s.isValidElement(n.cancel)?n.cancel:n.cancel&&w(n.cancel)?s.createElement(`button`,{"data-button":!0,"data-cancel":!0,style:n.cancelButtonStyle||b,onClick:e=>{w(n.cancel)&&X&&(n.cancel.onClick==null||n.cancel.onClick.call(n.cancel,e),$())},className:M(A?.cancelButton,n?.classNames?.cancelButton)},n.cancel.label):null,s.isValidElement(n.action)?n.action:n.action&&w(n.action)?s.createElement(`button`,{"data-button":!0,"data-action":!0,style:n.actionButtonStyle||x,onClick:e=>{w(n.action)&&(n.action.onClick==null||n.action.onClick.call(n.action,e),!e.defaultPrevented&&$())},className:M(A?.actionButton,n?.classNames?.actionButton)},n.action.label):null)};function te(){if(typeof window>`u`||typeof document>`u`)return`ltr`;let e=document.documentElement.getAttribute(`dir`);return e===`auto`||!e?window.getComputedStyle(document.documentElement).direction:e}function F(e,t){let n={};return[e,t].forEach((e,t)=>{let r=t===1,i=r?`--mobile-offset`:`--offset`,a=r?D:E;function o(e){[`top`,`right`,`bottom`,`left`].forEach(t=>{n[`${i}-${t}`]=typeof e==`number`?`${e}px`:e})}typeof e==`number`||typeof e==`string`?o(e):typeof e==`object`?[`top`,`right`,`bottom`,`left`].forEach(t=>{e[t]===void 0?n[`${i}-${t}`]=a:n[`${i}-${t}`]=typeof e[t]==`number`?`${e[t]}px`:e[t]}):o(a)}),n}var I=s.forwardRef(function(e,t){let{id:n,invert:r,position:i=`bottom-right`,hotkey:a=[`altKey`,`KeyT`],expand:o,closeButton:l,className:u,offset:d,mobileOffset:f,theme:p=`light`,richColors:m,duration:h,style:g,visibleToasts:_=T,toastOptions:v,dir:y=te(),gap:x=A,icons:S,containerAriaLabel:C=`Notifications`}=e,[w,E]=s.useState([]),D=s.useMemo(()=>n?w.filter(e=>e.toasterId===n):w.filter(e=>!e.toasterId),[w,n]),O=s.useMemo(()=>Array.from(new Set([i].concat(D.filter(e=>e.position).map(e=>e.position)))),[D,i]),[j,ee]=s.useState([]),[M,N]=s.useState(!1),[I,L]=s.useState(!1),[R,z]=s.useState(p===`system`?typeof window<`u`&&window.matchMedia&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`:p),B=s.useRef(null),V=a.join(`+`).replace(/Key/g,``).replace(/Digit/g,``),H=s.useRef(null),U=s.useRef(!1),W=s.useCallback(e=>{E(t=>(t.find(t=>t.id===e.id)?.delete||b.dismiss(e.id),t.filter(({id:t})=>t!==e.id)))},[]);return s.useEffect(()=>b.subscribe(e=>{if(e.dismiss){requestAnimationFrame(()=>{E(t=>t.map(t=>t.id===e.id?{...t,delete:!0}:t))});return}setTimeout(()=>{c.flushSync(()=>{E(t=>{let n=t.findIndex(t=>t.id===e.id);return n===-1?[e,...t]:[...t.slice(0,n),{...t[n],...e},...t.slice(n+1)]})})})}),[w]),s.useEffect(()=>{if(p!==`system`){z(p);return}if(p===`system`&&(window.matchMedia&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?z(`dark`):z(`light`)),typeof window>`u`)return;let e=window.matchMedia(`(prefers-color-scheme: dark)`);try{e.addEventListener(`change`,({matches:e})=>{z(e?`dark`:`light`)})}catch{e.addListener(({matches:e})=>{try{z(e?`dark`:`light`)}catch(e){console.error(e)}})}},[p]),s.useEffect(()=>{w.length<=1&&N(!1)},[w]),s.useEffect(()=>{let e=e=>{if(a.every(t=>e[t]||e.code===t)){var t;N(!0),(t=B.current)==null||t.focus()}e.code===`Escape`&&(document.activeElement===B.current||B.current?.contains(document.activeElement))&&N(!1)};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[a]),s.useEffect(()=>{if(B.current)return()=>{H.current&&(H.current.focus({preventScroll:!0}),H.current=null,U.current=!1)}},[B.current]),s.createElement(`section`,{ref:t,"aria-label":`${C} ${V}`,tabIndex:-1,"aria-live":`polite`,"aria-relevant":`additions text`,"aria-atomic":`false`,suppressHydrationWarning:!0},O.map((t,n)=>{let[i,a]=t.split(`-`);return D.length?s.createElement(`ol`,{key:t,dir:y===`auto`?te():y,tabIndex:-1,ref:B,className:u,"data-sonner-toaster":!0,"data-sonner-theme":R,"data-y-position":i,"data-x-position":a,style:{"--front-toast-height":`${j[0]?.height||0}px`,"--width":`${k}px`,"--gap":`${x}px`,...g,...F(d,f)},onBlur:e=>{U.current&&!e.currentTarget.contains(e.relatedTarget)&&(U.current=!1,H.current&&=(H.current.focus({preventScroll:!0}),null))},onFocus:e=>{e.target instanceof HTMLElement&&e.target.dataset.dismissible===`false`||U.current||(U.current=!0,H.current=e.relatedTarget)},onMouseEnter:()=>N(!0),onMouseMove:()=>N(!0),onMouseLeave:()=>{I||N(!1)},onDragEnd:()=>N(!1),onPointerDown:e=>{e.target instanceof HTMLElement&&e.target.dataset.dismissible===`false`||L(!0)},onPointerUp:()=>L(!1)},D.filter(e=>!e.position&&n===0||e.position===t).map((n,i)=>s.createElement(P,{key:n.id,icons:S,index:i,toast:n,defaultRichColors:m,duration:v?.duration??h,className:v?.className,descriptionClassName:v?.descriptionClassName,invert:r,visibleToasts:_,closeButton:v?.closeButton??l,interacting:I,position:t,style:v?.style,unstyled:v?.unstyled,classNames:v?.classNames,cancelButtonStyle:v?.cancelButtonStyle,actionButtonStyle:v?.actionButtonStyle,closeButtonAriaLabel:v?.closeButtonAriaLabel,removeToast:W,toasts:D.filter(e=>e.position==n.position),heights:j.filter(e=>e.position==n.position),setHeights:ee,expandByDefault:o,gap:x,expanded:M,swipeDirections:e.swipeDirections}))):null}))}),L=null;function R(e){L=e}function z(){if(!L)throw Error(`getApiBase called with no active project — call setActiveProjectId first`);return`${a}/api/projects/${L}`}var B=new Map;function V(e,t){return`${e}:${t}`}function H(e){return(e instanceof Error?e.message:e==null?``:String(e)).trim()||`Request failed`}function U(e){if(!e)return;let t=`${e}:`;for(let e of B.keys())e.startsWith(t)&&B.delete(e)}function W({namespace:e,projectId:t,initialValue:n,fetcher:r,pollInterval:i=0}){let a=t?V(t,e):null,[o,c]=(0,s.useState)(()=>a&&B.has(a)?B.get(a):n),[l,u]=(0,s.useState)(()=>!a||!B.has(a)),[d,f]=(0,s.useState)(l),[p,m]=(0,s.useState)(null),h=(0,s.useRef)(r);h.current=r;let g=(0,s.useRef)(n);g.current=n;let _=(0,s.useRef)(a);_.current=a;let v=(0,s.useRef)(0),y=(0,s.useRef)(null),b=(0,s.useCallback)(async(e,t,n)=>{let r=++v.current;y.current?.abort();let i=new AbortController;y.current=i,n&&_.current===e&&(f(!0),m(null));try{let n=await h.current({projectId:t,signal:i.signal});if(i.signal.aborted||r!==v.current)return;B.set(e,n),_.current===e&&(c(n),m(null))}catch(t){if(i.signal.aborted||r!==v.current)return;_.current===e&&m(H(t))}finally{r===v.current&&(y.current===i&&(y.current=null),_.current===e&&(f(!1),u(!1)))}},[]);return(0,s.useEffect)(()=>{if(v.current+=1,y.current?.abort(),y.current=null,m(null),!a||!t){c(g.current),u(!0),f(!1);return}let e=B.has(a);e?(c(B.get(a)),u(!1),f(!1)):(c(g.current),u(!0),f(!0)),b(a,t,!e);let n;return i>0&&(n=setInterval(()=>{b(a,t,!1)},i)),()=>{v.current+=1,y.current?.abort(),y.current=null,n&&clearInterval(n)}},[a,t,i,b]),{data:o,isLoading:d,isFirstLoad:l,error:p,refresh:(0,s.useCallback)(async()=>{!a||!t||await b(a,t,!0)},[a,t,b])}}var ne=n();function re(e){return e.providers&&e.providers.length>0?e.providers:[e.provider]}var ie=(0,s.createContext)(null),G=`specrails-desktop:activeProjectId`;function ae(e){try{e?localStorage.setItem(G,e):localStorage.removeItem(G)}catch{}}function K(){try{return localStorage.getItem(G)}catch{return null}}function oe({children:e,isolated:t=!1}){let n=(0,s.useCallback)(e=>{t||ae(e)},[t]),[r,c]=(0,s.useState)([]),[l,u]=(0,s.useState)(null),[d,f]=(0,s.useState)(!0),[p,m]=(0,s.useState)(!1),h=(0,s.useRef)(null),g=(0,s.useRef)(new Set),_=(0,s.useRef)(!1),v=(0,s.useRef)(0),y=(0,s.useRef)(null),b=(0,s.useRef)(null),x=(0,s.useRef)(0),S=(0,s.useCallback)(e=>{n(e),R(e),u(t=>(t!==null&&t!==e&&(h.current&&clearTimeout(h.current),m(!0),h.current=setTimeout(()=>m(!1),400)),e))},[n]),{registerHandler:w,unregisterHandler:T,connectionStatus:E}=o(),D=(0,s.useCallback)(async function e(){if(!_.current||y.current)return;b.current&&clearTimeout(b.current);let r=new AbortController;y.current=r;let i=v.current,o=setTimeout(()=>r.abort(),8e3);try{let e=await fetch(`${a}/api/projects`,{signal:r.signal});if(!e.ok)throw Error(`HTTP ${e.status}`);let o=await e.json();if(!Array.isArray(o.projects))throw Error(`Invalid project snapshot`);if(!_.current||r.signal.aborted||i!==v.current)return;c(o.projects);let s=o.projects;u(e=>{if(e&&s.some(t=>t.id===e))return e;let r=t?null:K(),i=r&&s.some(e=>e.id===r)?r:null;return n(i),R(i),i}),x.current=0,f(!1)}catch{if(_.current&&i===v.current){let t=Math.min(500*2**Math.min(x.current++,5),1e4);b.current=setTimeout(()=>{e()},t)}}finally{clearTimeout(o),y.current===r&&(y.current=null)}},[t,n]);(0,s.useEffect)(()=>{_.current=!0,D();let e=()=>{D()};return window.addEventListener(`online`,e),window.addEventListener(`focus`,e),()=>{_.current=!1,v.current++,y.current?.abort(),y.current=null,b.current&&clearTimeout(b.current),h.current&&clearTimeout(h.current),window.removeEventListener(`online`,e),window.removeEventListener(`focus`,e)}},[D]);let O=(0,s.useRef)(E),k=(0,s.useRef)(E===`connected`);(0,s.useEffect)(()=>{E===`connected`&&(k.current&&O.current!==`connected`&&D(),k.current=!0),O.current=E},[E,D]);let A=(0,s.useCallback)(e=>{if(!e||typeof e!=`object`)return;let r=e;if(typeof r.type==`string`){if(r.type===`desktop.projects`){if(!Array.isArray(r.projects))return;v.current++,x.current=0,b.current&&clearTimeout(b.current);let e=r.projects;c(e),u(r=>{let i;if(r&&e.find(e=>e.id===r))i=r;else{let n=t?null:K();i=n&&e.find(e=>e.id===n)?n:!t&&e.length>0?e[0].id:null}return n(i),R(i),i}),f(!1)}else if(r.type===`desktop.project_added`){let e=r.project;if(!e||typeof e.id!=`string`)return;v.current++,c(t=>t.find(t=>t.id===e.id)?t:[...t,e]),g.current.has(e.id)?g.current.delete(e.id):t||(C.success(i.t(`nav:projects.added`,{name:e.name})),S(e.id))}else if(r.type===`providers.detected_changed`)D();else if(r.type===`desktop.project_removed`){let e=r.projectId;if(typeof e!=`string`)return;v.current++,t||C.success(i.t(`nav:projects.removed`)),U(e),c(t=>t.filter(t=>t.id!==e)),u(t=>t===e?(n(null),R(null),null):t)}}},[D,S,t,n]);(0,s.useLayoutEffect)(()=>(w(`desktop`,A),()=>T(`desktop`)),[A,w,T]);let j=(0,s.useRef)(0);(0,s.useEffect)(()=>{let e=()=>{let e=Date.now();e-j.current<6e4||(j.current=e,fetch(`${a}/api/providers/detected?refresh=1`).catch(()=>{}))};return window.addEventListener(`focus`,e),()=>window.removeEventListener(`focus`,e)},[]);let ee=(0,s.useCallback)(async(e,t,n,r,i)=>{try{let a={path:e};n&&n.length>0&&(a.providers=n),t&&(a.name=t),r?.length&&(a.repositories=r),i?.length&&(a.workspacePaths=i);let o=await fetch(`/api/projects`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(a)});if(!o.ok){let e=await o.json();throw Error(e.error??`HTTP ${o.status}`)}let s=await o.json();return g.current.add(s.project.id),v.current++,c(e=>e.find(e=>e.id===s.project.id)?e:[...e,s.project]),S(s.project.id),s}catch(e){throw console.error(`[useDesktop] addProject error:`,e),e}},[S]),M=(0,s.useCallback)(async e=>{try{let t=await fetch(`${a}/api/projects/${e}`,{method:`DELETE`});if(!t.ok){let e=await t.json();throw Error(e.error??`HTTP ${t.status}`)}U(e),v.current++,c(t=>t.filter(t=>t.id!==e)),u(t=>t===e?(n(null),R(null),null):t)}catch(e){throw console.error(`[useDesktop] removeProject error:`,e),e}},[n]),N=(0,s.useMemo)(()=>({projects:r,activeProjectId:l,setActiveProjectId:S,addProject:ee,removeProject:M,refreshProjects:D,isLoading:d,isSwitchingProject:p}),[r,l,S,ee,M,D,d,p]);return(0,ne.jsx)(ie.Provider,{value:N,children:e})}var se={projects:[],activeProjectId:null,setActiveProjectId:()=>{},addProject:async()=>null,removeProject:async()=>{},refreshProjects:async()=>{},isLoading:!1,isSwitchingProject:!1};function q(){return(0,s.useContext)(ie)??se}export{z as a,W as i,re as n,I as o,q as r,C as s,oe as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as e}from"./rolldown-runtime-CNC7AqOf.js";import{n as t}from"./jsx-runtime-zu2_FqZY.js";import{n}from"./createLucideIcon-Bjbbp_KS.js";import{n as r}from"./project-repositories-
|
|
1
|
+
import{a as e}from"./rolldown-runtime-CNC7AqOf.js";import{n as t}from"./jsx-runtime-zu2_FqZY.js";import{n}from"./createLucideIcon-Bjbbp_KS.js";import{n as r}from"./project-repositories-Cc3oNv8X.js";function i(e){if(!Number.isFinite(e)||e<0)return`0s`;let t=Math.round(e/1e3);if(t<60)return`${t}s`;let n=Math.floor(t/60),r=t%60;return n<60?`${n}m ${r}s`:`${Math.floor(n/60)}h ${n%60}m`}var a=e(t(),1);function o(e,t={}){let{jobId:i,railIndex:o,enabled:s=!0}=t,{t:c}=n(`agentRuntime`),[l,u]=(0,a.useState)([]),[d,f]=(0,a.useState)(``),[p,m]=(0,a.useState)(null),[h,g]=(0,a.useState)(0),[_,v]=(0,a.useState)({}),y=(0,a.useRef)(!0),b=s&&!!e,x=e?`${r(e)}/agent-runtime/runs`:``,S=(0,a.useRef)(x);S.current=x;let C=(0,a.useRef)(new Set);(0,a.useEffect)(()=>{m(null),v({})},[x]);let w=i?`${x}/${encodeURIComponent(i)}`:o===void 0?x:`${x}?railIndex=${o}`;(0,a.useEffect)(()=>{if(y.current=!0,!b)return u([]),f(``),()=>{y.current=!1};let e=!1,t;async function n(){try{let t=await fetch(w,{cache:`no-store`});if(!t.ok)throw Error();let n=await t.json();if(!Array.isArray(n.runs))throw Error();e||(u(n.runs),f(``))}catch{e||f(c(`runs.loadFailed`))}finally{e||(t=setTimeout(()=>void n(),1e4))}}return n(),()=>{e=!0,y.current=!1,clearTimeout(t)}},[b,w,h,c]);let T=(0,a.useCallback)(async(t,n,i)=>{let a=`${x}:${t.runId}`;if(!e||C.current.has(a))return;C.current.add(a);let o=()=>y.current&&S.current===x;m(t.runId),f(``);try{let a=n===`approve`?{approve:[t.pendingApproval.stepId]}:n===`recover`?{recover:i??t.recoverableSteps}:n===`answer`?{answer:(_[t.runId]??``).trim(),...t.engineVersion===2&&t.pendingQuestion?{interruptId:t.pendingQuestion.stepId}:{}}:{},s=n===`cancel`?`cancel`:n===`settle`?`settle`:n===`dismiss`?`dismiss`:`resume`,l=t.engineVersion===2&&(s===`resume`||s===`settle`),u=l||t.engineVersion===2&&s===`cancel`?`${r(e)}/loop-runs`:x,d=await fetch(`${u}/${encodeURIComponent(t.runId)}/${l?`resume`:s}`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(a)});if(!d.ok){let e=await d.json();throw Error(e.message??e.detail??c(`runs.actionFailed`))}o()&&(n===`answer`&&v(e=>({...e,[t.runId]:``})),g(e=>e+1))}catch(e){o()&&f(e instanceof Error?e.message:c(`runs.actionFailed`))}finally{C.current.delete(a),o()&&m(null)}},[_,x,e,c]);return{runs:l,error:d,busy:p,answers:_,setAnswer:(0,a.useCallback)((e,t)=>{v(n=>({...n,[e]:t}))},[]),act:T,refresh:(0,a.useCallback)(()=>g(e=>e+1),[])}}export{i as n,o as t};
|