pisper 0.6.27 → 0.6.28
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/package.json +6 -6
- package/web/.vite/manifest.json +825 -665
- package/web/assets/{AppDialog-BSwETcOe.js → AppDialog-Cjnspn8J.js} +1 -1
- package/web/assets/{AppOverlays-_EStnaiK.js → AppOverlays-ielr5J2J.js} +1 -1
- package/web/assets/AssetsPage-BC1mYvQw.js +1 -0
- package/web/assets/BoardPage-BS3oBeRU.js +3 -0
- package/web/assets/{ChannelsPage-BlTQXqjl.js → ChannelsPage-DOysYIcY.js} +1 -1
- package/web/assets/{ChatAppearancePage-DzAq4wj8.js → ChatAppearancePage-DqNJD2hC.js} +1 -1
- package/web/assets/{ChatHistoryPage-B4v3MEb8.js → ChatHistoryPage-DcTFMdWO.js} +1 -1
- package/web/assets/ChatPage-DaKslieG.js +553 -0
- package/web/assets/ConfigPage-Cg93xSDY.js +7 -0
- package/web/assets/{DesktopWindowControls-gaFTmZN5.js → DesktopWindowControls-Zz88RwFF.js} +1 -1
- package/web/assets/{FeaturePage-IWVjXcVp.js → FeaturePage-bqByIxYg.js} +1 -1
- package/web/assets/{FileAttachmentPreview-DxwMjwfS.js → FileAttachmentPreview-Dc92kq62.js} +1 -1
- package/web/assets/{FloatingWidgets-D8VLtEFT.js → FloatingWidgets-CwJuWUMz.js} +1 -1
- package/web/assets/FocusRuntimeControls-huHLWDdy.js +1 -0
- package/web/assets/{GitDiffViewer-CEMK-4P4.js → GitDiffViewer-b4QqrnGx.js} +1 -1
- package/web/assets/{ManageProjectsDialog-BxB9J7IY.js → ManageProjectsDialog-DpwUwosB.js} +1 -1
- package/web/assets/{MarkdownMessage-gnw-y810.js → MarkdownMessage-BEmTlPSn.js} +1 -1
- package/web/assets/McpPage-COTq4Jjj.js +1 -0
- package/web/assets/{MemoryEvolution-DG9gtC6n.js → MemoryEvolution-CNi44VEB.js} +1 -1
- package/web/assets/MemoryPage-fUDrPE_v.js +2 -0
- package/web/assets/{MobileNavigation-Chysgboq.js → MobileNavigation-BvCRGO5c.js} +1 -1
- package/web/assets/MorePage-BuKQ5rBF.js +1 -0
- package/web/assets/NewFolderDialog-Btk5x-Ar.js +1 -0
- package/web/assets/{PageHeader-DK5D_R5_.js → PageHeader-BjhZ50ed.js} +1 -1
- package/web/assets/{PhoneDrawer-BbjnEawt.js → PhoneDrawer-Cs-ka4ZZ.js} +1 -1
- package/web/assets/{PhoneMenuButton-mlilY9bo.js → PhoneMenuButton-CTlyYTpl.js} +1 -1
- package/web/assets/{PhoneTopBar-CEnUC7MQ.js → PhoneTopBar-Cx2DM1ne.js} +1 -1
- package/web/assets/PluginsPage-B9Xlbo-c.js +1 -0
- package/web/assets/{SafeModePrompt-CalnTUf0.js → SafeModePrompt-BCrBZdI6.js} +1 -1
- package/web/assets/{SchedulesPage-CgHGU15C.js → SchedulesPage-Eh7MyRAr.js} +1 -1
- package/web/assets/SessionBrowserPane-Zeec5cZP.js +2 -0
- package/web/assets/SessionContextPanel-CVKmX-do.js +2 -0
- package/web/assets/{SessionHome-DVWSDkiq.js → SessionHome-CJR_Ufgl.js} +1 -1
- package/web/assets/SessionInspector-D5tmy63H.js +1 -0
- package/web/assets/{SessionShell-McHYcUMD.js → SessionShell-w3sKK33I.js} +1 -1
- package/web/assets/{SettingsSidebar-B6B_0bT6.js → SettingsSidebar-CseRAdbZ.js} +1 -1
- package/web/assets/{ShortcutHelpDialog-BuPN71vl.js → ShortcutHelpDialog-R4Gx-9DQ.js} +1 -1
- package/web/assets/{ShortcutKeys-DNpsGYcw.js → ShortcutKeys-DksC1OkE.js} +1 -1
- package/web/assets/{SidebarUpdateStatus-B9E-HRrS.js → SidebarUpdateStatus-BCd1eq_6.js} +1 -1
- package/web/assets/{SkillsPage-Ffz15Nmx.js → SkillsPage-Bn2y_EfT.js} +1 -1
- package/web/assets/{TaskProcessesPane-ML4UTyA9.js → TaskProcessesPane-FwGhuWob.js} +1 -1
- package/web/assets/{TaskTerminalView-CEWghfPZ.js → TaskTerminalView-Cd4PIsW7.js} +1 -1
- package/web/assets/{TerminalPanel-Dq1eeEaE.js → TerminalPanel-48zgvDnP.js} +1 -1
- package/web/assets/{WebDesktopPet-C5oPRBKd.js → WebDesktopPet-gSDBRZ3C.js} +1 -1
- package/web/assets/WorkflowsPage-Cs8PPuKK.js +1 -0
- package/web/assets/{WorkspacePicker-CZP9fnUA.js → WorkspacePicker-93gmdtjf.js} +1 -1
- package/web/assets/{alert-firawb0H.js → alert-DRIrgNI4.js} +1 -1
- package/web/assets/api-AeFmYDtL.js +1 -0
- package/web/assets/{app-update-HRbiPDT4.js → app-update-Cf9JJ7WK.js} +1 -1
- package/web/assets/{approval-confirm-C0RA-dqX.js → approval-confirm-D-cfu-xY.js} +1 -1
- package/web/assets/board-messages-D6AWGHuF.js +1 -0
- package/web/assets/board-projects-CjfuDvHx.js +1 -0
- package/web/assets/bots-store-vErH7x9u.js +1 -0
- package/web/assets/chat-api-CSAs7Y6E.js +1 -0
- package/web/assets/{client-store-DvE_NEoR.js → client-store-B5wZ2IWH.js} +1 -1
- package/web/assets/{config-search-Cr0TsTRS.js → config-search-eh2zQyZD.js} +1 -1
- package/web/assets/desktop-hosts-BNXtrr7R.js +191 -0
- package/web/assets/{dialog-9LXtFD-0.js → dialog-BDNbY1pW.js} +1 -1
- package/web/assets/event-stream-Dh7h5sXJ.js +2 -0
- package/web/assets/{events-oPlZB-qC.js → events-CuVwhRWu.js} +1 -1
- package/web/assets/{focus-session-composer-bits-VRvsf-4b.js → focus-session-composer-bits-Dkc0qSzm.js} +1 -1
- package/web/assets/folder-paths-BKS24lJ6.js +1 -0
- package/web/assets/{hosts-5EeWX76B.js → hosts-B_02vF1S.js} +1 -1
- package/web/assets/http-Bp65Kb4t.js +2 -0
- package/web/assets/http-response-PZN5QIRk.js +1 -0
- package/web/assets/i18n-D80GstlU.js +1 -0
- package/web/assets/index-BnQCk-QI.css +2 -0
- package/web/assets/{index-rOrQSojS.js → index-CiRnxTh1.js} +2 -2
- package/web/assets/machine-messages-Y3INM-Uy.js +1 -0
- package/web/assets/machines-api-08M8wQiu.js +1 -0
- package/web/assets/{memory-api-sER80Rta.js → memory-api-DSpQSQ5N.js} +1 -1
- package/web/assets/mount-app-DRohHSG7.js +9 -0
- package/web/assets/{mutation-CEbxdVYy.js → mutation-b4pPvB7p.js} +1 -1
- package/web/assets/{palette-navigation-HbVGltCo.js → palette-navigation-C8WTTMd3.js} +1 -1
- package/web/assets/permission-rules-api-D931wxo9.js +1 -0
- package/web/assets/{pick-system-directory-CWhZCX6d.js → pick-system-directory-CaiscVfr.js} +1 -1
- package/web/assets/placements-BERPVxJD.js +2 -0
- package/web/assets/{popover-DlJP3VbH.js → popover-BKgOyW2Z.js} +1 -1
- package/web/assets/public-CEKKZh7R.js +2 -0
- package/web/assets/{public-D4ziZ0_l.js → public-CwI1S0by.js} +1 -1
- package/web/assets/{public-Pwc0VWsG.js → public-D9GopZqN.js} +2 -2
- package/web/assets/{web-preview-DIo7zGil.js → public-DrlrVRdl.js} +1 -1
- package/web/assets/{public-components-DzeaQBwj.js → public-components-BX9oxLC6.js} +1 -1
- package/web/assets/public-diff-DpNMZ8NJ.js +1 -0
- package/web/assets/public-events-CLCgth5h.js +1 -0
- package/web/assets/public-flags-DaG3PoAy.js +1 -0
- package/web/assets/public-folder-dialog-_QoxpOd4.js +1 -0
- package/web/assets/{public-greeting-BTftKeXA.js → public-greeting-hvhJuZMw.js} +1 -1
- package/web/assets/{public-session-BQEMyJz3.js → public-session-DUzugr9Y.js} +1 -1
- package/web/assets/{public-sidebar-TnRh2L95.js → public-sidebar-QGIKY-SE.js} +1 -1
- package/web/assets/query-DFQayLF5.js +1 -0
- package/web/assets/runtime-capabilities-B7qveLBm.js +1 -0
- package/web/assets/{runtime-capabilities-store-SnV1V9_K.js → runtime-capabilities-store-Bd3gWIM7.js} +1 -1
- package/web/assets/{safe-mode-instance-D5jkqqdG.js → safe-mode-instance-B7_JMLGQ.js} +1 -1
- package/web/assets/safe-mode-sentinel-B_NPQ0qy.js +1 -0
- package/web/assets/{session-change-summary-api-orjhsMHB.js → session-change-summary-api-BHpd8dcW.js} +1 -1
- package/web/assets/{session-home-CwRaSks0.js → session-home-BmAnhROp.js} +1 -1
- package/web/assets/session-inspector-store-DHEIlh_X.js +1 -0
- package/web/assets/{session-organization-api-BbD_xU9l.js → session-organization-api-D9hTSIh7.js} +1 -1
- package/web/assets/session-scope-yI3Hi_8F.js +1 -0
- package/web/assets/{session-tree-actions-wrMgK5VF.js → session-tree-actions-BhCOaiTd.js} +1 -1
- package/web/assets/{session-tree-summary-BO-Oz0d-.js → session-tree-summary-BLv-bkYC.js} +1 -1
- package/web/assets/session-web-preview-guvsmkWE.js +1 -0
- package/web/assets/session-workspaces-Brm-8lHh.js +1 -0
- package/web/assets/{settings-navigation-DiP_AM1C.js → settings-navigation-C6_RpGgI.js} +1 -1
- package/web/assets/{shortcuts-BmJZiLby.js → shortcuts-Dsd4mjfP.js} +1 -1
- package/web/assets/side-chat-context-scyCH7W7.js +7 -0
- package/web/assets/{sidebar-COyrGoC_.js → sidebar-BKgF_JcM.js} +1 -1
- package/web/assets/{sidebar-store-CRsJYE3n.js → sidebar-store-DHwAOBnN.js} +1 -1
- package/web/assets/{speech-session-BUTlvobj.js → speech-session-B7DFYRtL.js} +1 -1
- package/web/assets/{startup-queries-Cz_Djz3X.js → startup-queries-BlA4Hayt.js} +1 -1
- package/web/assets/tool-labels-D-3gybP7.js +1 -0
- package/web/assets/{use-i18n-CaxKosZm.js → use-i18n-BVRhlQ1v.js} +1 -1
- package/web/assets/{use-open-bot-BcuoHEet.js → use-open-bot-DyXtOatN.js} +1 -1
- package/web/assets/{use-studio-actions-D0_lMh6m.js → use-studio-actions-DEeR_rS9.js} +1 -1
- package/web/assets/{useCatalogProjects-B10EehnV.js → useCatalogProjects-BD5GyCxg.js} +1 -1
- package/web/assets/useMachines-CwX7YqNe.js +1 -0
- package/web/assets/useNativeBrowser-C0j3zafh.js +1 -0
- package/web/assets/useNewProjectPicker-COxPJj6n.js +2 -0
- package/web/assets/{useNow-BZ7RxPrw.js → useNow-CfPk0uIz.js} +1 -1
- package/web/assets/{usePhoneShell-0IX6-LbH.js → usePhoneShell-BpuKJgci.js} +1 -1
- package/web/assets/{useQuery-DdcpUQhO.js → useQuery-DfOU-27z.js} +1 -1
- package/web/assets/useSessionListQuery-CURESPBn.js +2 -0
- package/web/assets/{useSessionRowActions-DCeaGwuL.js → useSessionRowActions-DoCwFh8w.js} +1 -1
- package/web/assets/{useSidebarModel-DNcSN-4f.js → useSidebarModel-CY79-mYl.js} +1 -1
- package/web/assets/web-preview-C7DdG9JP.js +1 -0
- package/web/assets/{web-preview-events-BvZrLClr.js → web-preview-events-D7F0Z-Hy.js} +1 -1
- package/web/assets/{workspace-order-store-BYpf9Z59.js → workspace-order-store-C-jYrC0l.js} +1 -1
- package/web/index.html +2 -2
- package/web/assets/AssetsPage-V8CwPJ-g.js +0 -1
- package/web/assets/BoardPage-CeCxAAr2.js +0 -3
- package/web/assets/ChatPage-D8Etebyo.js +0 -553
- package/web/assets/ConfigPage-Dgp9JPFH.js +0 -5
- package/web/assets/FocusRuntimeControls-DLdIWv0j.js +0 -1
- package/web/assets/McpPage-C0czFuy7.js +0 -1
- package/web/assets/MemoryPage-CGpPJtAj.js +0 -2
- package/web/assets/MorePage-CxS1EaML.js +0 -1
- package/web/assets/NewFolderDialog-Dgo2ZRmr.js +0 -1
- package/web/assets/PluginsPage-CcrK4yJY.js +0 -1
- package/web/assets/SessionBrowserPane-BISoBe8t.js +0 -2
- package/web/assets/SessionContextPanel-C9F4h-Qa.js +0 -2
- package/web/assets/SessionInspector-BUBN0O36.js +0 -1
- package/web/assets/WorkflowsPage-BSlpEhf2.js +0 -1
- package/web/assets/api-MVoWVwmh.js +0 -3
- package/web/assets/board-messages-BptuVfY-.js +0 -1
- package/web/assets/board-projects-DF-0RkuW.js +0 -1
- package/web/assets/bots-store-BmFj9w2F.js +0 -1
- package/web/assets/chat-api-D9RzUTQi.js +0 -1
- package/web/assets/folder-paths-DlIGURu0.js +0 -1
- package/web/assets/i18n-Cl3sIF9G.js +0 -1
- package/web/assets/index-l96Dl6z6.css +0 -2
- package/web/assets/mount-app-COPez7JX.js +0 -9
- package/web/assets/permission-rules-api-M-EIynsN.js +0 -1
- package/web/assets/placements-BDYSXHzl.js +0 -2
- package/web/assets/public-BDWkdvCh.js +0 -1
- package/web/assets/public-diff-C6x0INNk.js +0 -1
- package/web/assets/public-events-BXREjvNl.js +0 -1
- package/web/assets/public-flags-Dvf3q-4D.js +0 -1
- package/web/assets/query-Bj-DUNYq.js +0 -1
- package/web/assets/runtime-capabilities-CHYOF_hE.js +0 -1
- package/web/assets/safe-mode-sentinel-B3v6JZTG.js +0 -1
- package/web/assets/session-scope-CFKKqbrz.js +0 -1
- package/web/assets/session-workspaces-Csgpuzxd.js +0 -1
- package/web/assets/side-chat-context-DhztplBz.js +0 -7
- package/web/assets/tool-labels-Bexnwp5q.js +0 -1
- package/web/assets/useNewProjectPicker-CD-xwRhH.js +0 -2
- package/web/assets/useSessionListQuery-DXeYJTOA.js +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={zh:{"page.title":`全部代理`,"page.summary":`{agents} 个代理 · {projects} 个项目 · {running} 个在运行`,"page.loading":`正在读取代理…`,"page.error":`暂时无法读取会话`,"page.errorHint":`检查本机运行时是否在线,然后重试。`,"page.retry":`重试`,"lane.attention":`需要你`,"lane.running":`运行中`,"lane.queued":`排队`,"lane.done":`已完成`,"lane.orderAttention":`按等待时长`,"lane.orderRunning":`按开始时间`,"lane.orderQueued":`按队列顺序`,"lane.orderDone":`最新的在前`,"lane.history":`全部历史会话`,"status.approval":`等待批准`,"status.failed":`失败`,"status.failedHandled":`失败 · 已查看`,"status.running":`运行中`,"status.queued":`排队中`,"status.done":`已完成`,"status.stopped":`已停止`,"filter.projects":`项目`,"filter.allProjects":`全部项目`,"filter.projectsTitle":`项目:{projects}`,"filter.listSeparator":`、`,"filter.statuses":`状态`,"filter.statusTitle":`状态:{statuses}`,"filter.noProject":`无项目`,"filter.emptyTitle":`筛选后没有卡片`,"filter.emptyHint":`换一个项目或状态,或者清除筛选。`,"filter.clear":`清除筛选`,"group.label":`分组方式`,"group.lane":`按状态`,"group.project":`按项目`,"card.label":`{title},{status}`,"card.more":`“{title}”的更多操作`,"card.pinned":`已置顶`,"card.standard":`常规操作`,"card.critical":`高风险`,"card.criticalWithReason":`高风险 · {reason}`,"card.approvalLoading":`正在读取审批详情…`,"card.approvalUnavailable":`暂时读不到审批详情,请在会话里查看。`,"card.moreApprovals":`还有 {count} 条审批等你处理`,"card.moreApprovalsCritical":`还有 {count} 条审批等你处理,其中有高风险`,"card.deny":`拒绝`,"card.approve":`允许`,"card.approveCritical":`允许…`,"card.retry":`重试`,"card.archive":`归档`,"card.files":`{count} 个文件`,"card.expand":`展开完整命令`,"card.expandArgs":`展开完整参数`,"card.collapse":`收起`,"card.subAgent":`子代理`,"card.subAgentProgress":`子代理 {running} 个运行中,共 {total} 个`,"activity.starting":`启动中`,"activity.thinking":`思考中`,"activity.responding":`回复中`,"activity.working":`处理中`,"activity.compacting":`压缩上下文中`,"menu.open":`打开会话`,"menu.pin":`置顶`,"menu.unpin":`取消置顶`,"menu.markHandled":`标记已处理`,"menu.copyLink":`复制会话链接`,"menu.archive":`归档`,"action.failed":`操作没有完成,请稍后重试。`,"action.archived":`已归档:{title}`,"action.copied":`已复制会话链接`,"action.copyFailed":`无法复制链接`,"confirm.title":`确认高风险操作`,"confirm.titleStandard":`确认批准`,"confirm.description":`这条审批被命令守卫标记为高风险,批准前请核对完整参数。`,"confirm.descriptionCritical":`这是高风险操作(例如安装全局插件或提交表单),批准前请核对完整参数。`,"confirm.descriptionStandard":`批准前请核对完整参数。`,"confirm.descriptionLoading":`正在读取审批详情…`,"confirm.session":`会话`,"confirm.tool":`工具`,"confirm.cwd":`工作目录`,"confirm.fullArgs":`完整参数`,"confirm.loading":`正在读取审批详情,读取完成前不能批准。`,"confirm.hint":`按住确认按钮 0.6 秒,或按`,"confirm.hintTouch":`按住确认按钮 0.6 秒`,"confirm.hold":`按住确认`,"confirm.approving":`正在批准…`,"confirm.cancel":`取消`,"triage.progress":`逐个处理 {index}/{total}`,"triage.approve":`允许`,"triage.deny":`拒绝`,"triage.retry":`重试`,"triage.open":`打开`,"triage.exit":`退出`,"triage.finished":`全部处理完`,"triage.nothing":`没有需要你处理的事项`,"announce.moved":`{title} 进入 {lane}`,"launch.projects":`最近的项目`,"launch.projectLabel":`项目:{project}`,"launch.defaultProject":`默认目录`,"launch.noProject":`不选项目`,"launch.chooseFolder":`选择文件夹…`,"launch.newFolder":`新建文件夹…`,"project.actionsFor":`{project} 的操作`,"project.new":`新建项目…`,"folder.title":`新建文件夹`,"folder.description":`在所选位置新建一个空文件夹,并把它作为这次任务的项目。`,"folder.parent":`位置`,"folder.parentPlaceholder":`绝对路径;留空则使用默认工作目录`,"folder.browse":`浏览…`,"folder.browseTitle":`选择新文件夹的位置`,"folder.browseUnavailable":`这台设备无法打开系统文件管理器,请直接填写位置的路径。`,"folder.name":`名称`,"folder.namePlaceholder":`例如 my-project`,"folder.preview":`将新建:{path}`,"folder.create":`新建`,"folder.creating":`正在新建…`,"folder.error.nameRequired":`请填写文件夹名称。`,"folder.error.nameInvalid":`名称不能包含 / \\ : * ? " < > | 等字符,也不能以点或空格结尾。`,"folder.error.parentMissing":`位置不存在或不是文件夹。`,"folder.error.existsAsFile":`这个位置已经有一个同名的文件。`,"folder.error.permission":`没有权限在这个位置新建文件夹。`,"folder.error.failed":`新建文件夹失败。`,"folder.error.failedWithReason":`新建文件夹失败:{reason}`,"project.manage":`管理项目…`,"project.newTaskHere":`在此项目新建任务`,"project.rename":`重命名…`,"project.resetName":`恢复目录名`,"project.delete":`删除项目…`,"project.remove":`移除项目`,"project.chosen":`已选择项目「{project}」,描述第一个任务即可派发`,"project.pickerDescription":`选择项目所在的文件夹,它会成为启动台的派发目标。`,"project.renameDescription":`自定义全部代理与派发对话框里显示的项目名称,工作目录保持不变。`,"project.manageTitle":`管理项目`,"project.manageDescription":`调整项目的显示顺序与名称。还没有会话的项目可以直接移除,不影响目录与文件;有会话的项目删除时会连同其中的全部会话一起删除。`,"project.sessions":`{count} 个会话`,"project.folderName":`目录名:{name}`,"project.moveUp":`上移 {project}`,"project.moveDown":`下移 {project}`,"project.renameNamed":`重命名 {project}`,"project.resetNamed":`{project} 恢复目录名`,"project.deleteWithChatsNamed":`连同会话一起删除 {project}`,"project.removeNamed":`移除项目 {project}`,"project.listLabel":`项目列表`,"project.empty":`还没有项目`,"project.emptyHint":`新建项目后,在启动台描述第一个任务即可派发。`,"project.loading":`正在读取项目…`,"project.error":`读取项目失败`,"project.deleting":`正在删除…`,"project.done":`完成`,"phone.running":`运行中 {elapsed}`,"phone.changes":`+{count} 改动`,"phone.changesLabel":`查看本会话的 {count} 个改动`,"phone.openInspector":`改动、终端、文件与预览`,"phone.inspectorDescription":`本会话的改动、终端、资料来源与网页预览`,"phone.earlierTurns":`展开更早的对话:{summary}`,"phone.previousTurn":`上一轮`,"session.moveWorkspace":`移动工作区…`,"session.workflowRuns":`工作流运行记录`,"session.workflowRunsEmpty":`这个会话还没有工作流运行记录`,"session.plan":`计划 {done}/{total}`,"session.planLabel":`计划进度:已完成 {done} 项,共 {total} 项`,"session.titleMenu":`{title}:会话操作`,"session.tree":`会话树`,"session.treeBranches":`会话树:{count} 个分支`,"session.changedFiles":`{count} 个文件`,"session.changes":`{count} 个文件 +{added} −{removed}`,"session.contextUsage":`上下文已用 {percent}%`,"session.withShortcut":`{label}({shortcut})`,"session.planOpen":`{plan}:在检查器里查看`,"inspector.label":`检查器`,"inspector.tabs":`检查器标签`,"inspector.changes":`改动`,"inspector.changesCount":`改动 {count}`,"inspector.changesScope":`改动范围`,"inspector.scopeSession":`本会话`,"inspector.scopeWorkspace":`工作区`,"inspector.terminal":`终端`,"inspector.terminalScope":`终端视图`,"inspector.processes":`进程`,"inspector.terminalUnavailable":`这台设备或当前运行时不提供终端`,"inspector.files":`文件`,"inspector.preview":`预览`,"inspector.plan":`计划`,"inspector.sideChat":`侧聊`,"inspector.closeTab":`关闭“{tab}”`,"inspector.add":`添加组件标签`,"inspector.addHint":`组件放到“会话面板”位置后,会作为标签出现在这里。`,"inspector.openComponents":`打开组件页`,"inspector.close":`收起检查器`,"transcript.operations":`{count} 个操作`,"transcript.running":`{count} 运行中`,"transcript.failed":`{count} 失败`,"transcript.turn":`第 {count} 轮`,"composer.placeholder":`回复代理,或用 / 调用命令`,"composer.tokens":`{tokens} tok`,"composer.queuedFollowUp":`本轮后`,"composer.queuedSteer":`排队`,"composer.steerNow":`立即发送`,"composer.steerHint":`打断当前这一步,代理马上读到`,"composer.longPressSteer":`运行中长按立即发送`,"changes.sessionSummary":`本会话改动 {count} 个文件`,"changes.workspaceSummary":`工作区改动 {count} 个文件`,"changes.revertAll":`全部还原`,"changes.more":`更多改动操作`,"changes.pending":`{count} 个待批准`,"changes.revertFile":`还原此文件`,"changes.files":`改动的文件`,"changes.diffView":`差异视图`,"changes.unified":`统一`,"changes.split":`并排`,"changes.splitTooNarrow":`检查器不足 600 像素宽,放不下并排视图;把检查器拖宽后可用。`,"changes.approvedAt":`已批准写入 · {time}`,"changes.pendingAt":`待批准 · {time}`,"changes.revertedAt":`已还原 · {time}`,"changes.statusModified":`已修改`,"changes.statusCreated":`新建`,"changes.statusDeleted":`已删除`,"changes.statusRenamed":`已重命名`,"inspector.goal":`目标`,"inspector.team":`团队`,"inspector.subAgents":`子代理`,"shortcuts.agentPanel":`聚焦侧栏会话列表`,"shortcuts.toggleInspector":`显示 / 隐藏检查器`,"shortcuts.previousAgent":`按侧栏顺序切换到上一个会话`,"shortcuts.nextAgent":`按侧栏顺序切换到下一个会话`,"shortcuts.steerMessage":`运行中立即发送`,"shortcuts.shortcutHelp":`快捷键速查`,"shortcuts.sendMessage":`发送(运行中排队)`,"shortcuts.focusSearch":`聚焦筛选 / 搜索`,"shortcuts.groupGlobal":`全局`,"shortcuts.groupBoard":`全部代理`,"shortcuts.groupSession":`会话`,"shortcuts.globalHint":`带修饰键的组合在输入框内同样生效。`,"shortcuts.boardHint":`只在全部代理页生效;单字母键在焦点不在输入框时生效,只能改成不带修饰键的字母。`,"shortcuts.sessionHint":`只在会话页生效;Esc 永远不用于返回。`,"shortcuts.fixed":`固定`,"shortcuts.boardMove":`在代理之间移动(焦点在行上)`,"shortcuts.boardOpen":`打开会话`,"shortcuts.boardExitTriage":`退出逐个处理`,"shortcuts.newline":`换行`,"shortcuts.stopRun":`停止运行(有打开的浮层时先关闭浮层)`,"shortcuts.helpDescription":`当前设备上的绑定。改绑后这里立即更新。`,"shortcuts.helpCustomize":`在设置中改绑`,"home.draftTitle":`新任务`,"home.draftSubtitle":`发出第一条消息时才会创建会话`,"home.draftHint":`选好项目,描述要做的事。发出第一条消息后,这里就是它的会话;其他代理都在“全部代理”里。`,"home.loading":`正在打开上次的会话…`,"home.loadFailed":`无法读取会话列表`,"home.loadFailedHint":`暂时无法确认上次停留的会话。可以重试,或直接开始一个新任务。`,"home.startDraft":`开始新任务`,"home.goHome":`回到主页`,"shortcuts.openSession":`打开会话主页`,"shortcuts.sessionTree":`会话树(分支与标记)`,"shortcuts.sideChat":`侧聊`,"shortcuts.cycleFocusRegion":`在侧栏、顶栏、对话、输入框之间切换焦点`,"shortcuts.groupSidebar":`侧栏`,"shortcuts.sidebarHint":`焦点在侧栏会话行上时生效;A / D 跟随“全部代理”的允许 / 拒绝键,只处理普通批准。`,"shortcuts.sidebarMove":`在会话行之间移动`,"shortcuts.sidebarOpen":`打开会话`,"sidebar.reason.failed":`运行失败`,"sidebar.reason.approval":`等你批准`,"sidebar.reason.criticalApproval":`高风险批准`,"sidebar.reason.question":`等你回答`,"sidebar.reason.questions":`等你回答 · {count} 个问题`,"sidebar.reason.questionCount":`{count} 个问题`,"sidebar.group.attention":`需要你`,"sidebar.group.running":`运行中`,"sidebar.group.queued":`排队`,"sidebar.group.pinned":`置顶`,"sidebar.group.done":`今天完成`,"sidebar.loading":`正在加载会话`,"sidebar.error":`会话列表加载失败`,"sidebar.retry":`重试`,"sidebar.empty":`还没有代理在运行。用“新任务”派出第一个。`,"sidebar.emptyAttention":`没有等你处理的事`,"sidebar.emptyRunning":`没有在运行的代理`,"sidebar.moreRunning":`还有 {count} 个 →`,"sidebar.allDone":`全部 →`,"sidebar.history":`历史会话`,"sidebar.group.recent":`最近`,"sidebar.emptyRecent":`还没有会话`,"sidebar.allChats":`全部会话`,"sidebar.announce":`{title} 需要你:{reason}`,"sidebar.announceSeparator":`;`,"sidebar.attentionRow":`{title},{reason},已等 {wait}`,"sidebar.attentionRowNoWait":`{title},{reason}`,"sidebar.unread":`未读`,"sidebar.deny":`拒绝`,"sidebar.approve":`允许`,"sidebar.open":`打开`,"sidebar.denyNamed":`拒绝 {title} 的请求`,"sidebar.approveNamed":`允许 {title} 的请求`,"sidebar.openNamed":`打开 {title} 处理`,"sidebar.rowMenu":`{title} 的更多操作`,"sidebar.renameTitle":`重命名会话`,"sidebar.renameLabel":`会话标题`,"sidebar.renameSave":`保存`,"sidebar.renamed":`会话标题已更新`,"sidebar.railAttention":`{count} 个代理需要你,打开全部代理`,"sidebar.railRunning":`{count} 个代理运行中,打开全部代理`,"sidebar.filter.all":`全部`,"sidebar.filter.projectActions":`项目操作`,"sidebar.filter.addProject":`添加项目…`,"sidebar.filter.noProjects":`还没有项目`,"sidebar.fleet.attention":`{count} 个需要你`,"sidebar.fleet.running":`{count} 个运行中`,"sidebar.fleet.label":`{attention} 个代理需要你,{running} 个运行中,打开全部代理`,"menu.rename":`重命名`,"composer.placeholderRunning":`运行中:{queue} 排队,{steer} 立即发送`,"composer.placeholderRunningQueueOnly":`运行中:{queue} 排队`,"composer.placeholderRunningTouch":`运行中:点发送排队,长按立即发送`,"composer.sendQueuedNow":`立即发送这条排队消息`,"composer.editQueued":`编辑排队消息`,"composer.cancelQueued":`取消排队`,"composer.plusMenu":`添加附件、技能或语音输入`,"composer.modeChip":`审批与执行方式`,"composer.goalShort":`Goal`,"composer.teamShort":`Team`,"composer.cycleRunMode":`切换`,"composer.contextUsage":`上下文`,"composer.sessionTokens":`本会话`,"composer.cacheHitLabel":`缓存命中`,"transcript.allDone":`全部完成`,"transcript.copyMarkdown":`复制为 Markdown`,"card.holdToApprove":`按住允许`,"card.holdHint":`高风险操作需按住 0.6 秒`,"card.moreWaiting":`还有 {count} 项等你处理`,"shortcuts.cycleRunMode":`切换执行方式(Plan / Goal / Team)`,"project.moveUpShort":`上移`,"project.moveDownShort":`下移`,"triage.answer":`回答`,"overview.doneUnread":`已完成 · 未读`,"overview.waited":`已等 {wait}`,"overview.ran":`已运行 {time}`,"overview.finishedAt":`{time} 完成`,"overview.openToHandle":`打开处理`,"overview.log":`日志`,"overview.retryNamed":`重试 {title}`,"overview.subAgents":`子代理 {running}/{total}`,"overview.startNow":`立即开始`,"overview.queuedAfter":`排在「{title}」之后`,"overview.queuedAfterUnknown":`等前一个任务结束`,"overview.queuePosition":`第 {n} 位`,"overview.empty":`还没有代理在运行`,"overview.newTask":`新任务`,"overview.widgets":`已放置的组件`,"overview.subAgentSlots":`子代理 {running}/{max}`,"overview.todayTokens":`今日 {tokens} tok`,"overview.memory":`内存 {memory}`,"overview.systemLoading":`正在读取系统信息…`,"overview.systemUnavailable":`暂时读不到系统信息`,"overview.projectAttention":`{count} 个需要你`,"overview.projectRunning":`{count} 个运行中`,"overview.projectQueued":`{count} 个排队`,"overview.projectDone":`{count} 个今天完成`,"question.title":`代理在问你`,"question.label":`代理的提问`,"question.waiting":`还有 {count} 个提问等你回答`,"question.moreAfter":`之后还有 {count} 个`,"question.failed":`没能提交回答,请再试一次(可能已经在别处回答过)`,"question.other":`其他…`,"question.otherLabel":`其他回答:{question}`,"question.otherPlaceholder":`写下你的回答`,"question.skip":`跳过`,"question.submit":`提交`,"question.answerNamed":`回答“{title}”:{option}`,"composer.plusSheetTitle":`添加`,"composer.attachmentShort":`附件`,"composer.voiceInput":`语音输入`,"composer.planShort":`Plan`,"phone.openInspectorShort":`改动与文件`,"inspector.running":`运行中`,"inspector.runningCount":`运行中 {count}`,"inspector.runningStatus":`运行中`,"inspector.runningQueued":`排队中`,"inspector.runningTool":`工具`,"inspector.runningAgent":`子代理`,"inspector.runningEmpty":`这个会话现在没有在运行的命令或子代理`,"inspector.runningHint":`列出代理正在执行的命令和工具、子代理,以及本任务的终端。命令自己转到后台的进程(如 nohup、&)不在其中。`,"launch.machines":`远程机器`,"launch.addMachine":`添加远程机器…`,"machine.folderTitle":`在 {name} 上工作`,"machine.folderDescription":`Agent 的文件和命令工具会在这台机器上运行。`,"machine.folderLabel":`对方机器上的目录`,"machine.folderHint":`留空就是家目录。`,"machine.folderInRoots":`只能选这些目录里的位置:{roots}`,"machine.confirm":`使用这个目录`,"machine.checking":`正在连接…`,"machine.cancel":`取消`,"composer.context.system":`系统提示词`,"composer.context.project":`项目说明`,"composer.context.skills":`技能列表`,"composer.context.tools":`内置工具`,"composer.context.mcp":`MCP 工具`,"composer.context.messages":`对话消息`,"composer.context.toolResults":`工具调用与结果`,"composer.context.free":`剩余 {tokens}`,"composer.context.estimated":`总量来自模型,各部分为估算。`,"composer.context.allEstimated":`模型还没返回用量,都是估算。`,"composer.context.prefixUnknown":`系统提示词和工具要等会话运行后才能统计。`,"composer.context.compactAt":`到 {percent}% 自动压缩`,"composer.context.deferred":`{count} 个待用,用到才占上下文`,"composer.context.callCount":`{count} 次调用`,"composer.context.composition":`占用构成`,"composer.context.toolCount":`{count} 个工具`},en:{"page.title":`All agents`,"page.summary":`{agents} agents · {projects} projects · {running} running`,"page.loading":`Loading agents…`,"page.error":`Sessions could not be loaded`,"page.errorHint":`Check that the local runtime is online, then retry.`,"page.retry":`Retry`,"lane.attention":`Needs you`,"lane.running":`Running`,"lane.queued":`Queued`,"lane.done":`Done`,"lane.orderAttention":`Longest wait first`,"lane.orderRunning":`By start time`,"lane.orderQueued":`Queue order`,"lane.orderDone":`Newest first`,"lane.history":`All sessions`,"status.approval":`Awaiting approval`,"status.failed":`Failed`,"status.failedHandled":`Failed · seen`,"status.running":`Running`,"status.queued":`Queued`,"status.done":`Done`,"status.stopped":`Stopped`,"filter.projects":`Projects`,"filter.allProjects":`All projects`,"filter.projectsTitle":`Project: {projects}`,"filter.listSeparator":`, `,"filter.statuses":`Status`,"filter.statusTitle":`Status: {statuses}`,"filter.noProject":`No project`,"filter.emptyTitle":`No cards match these filters`,"filter.emptyHint":`Pick another project or status, or clear the filters.`,"filter.clear":`Clear filters`,"group.label":`Group by`,"group.lane":`By status`,"group.project":`By project`,"card.label":`{title}, {status}`,"card.more":`More actions for “{title}”`,"card.pinned":`Pinned`,"card.standard":`Routine`,"card.critical":`High risk`,"card.criticalWithReason":`High risk · {reason}`,"card.approvalLoading":`Loading approval details…`,"card.approvalUnavailable":`Approval details are unavailable; check them in the session.`,"card.moreApprovals":`{count} more approvals waiting`,"card.moreApprovalsCritical":`{count} more approvals waiting, including high-risk ones`,"card.deny":`Deny`,"card.approve":`Allow`,"card.approveCritical":`Allow…`,"card.retry":`Retry`,"card.archive":`Archive`,"card.files":`{count} files`,"card.expand":`Show full command`,"card.expandArgs":`Show all arguments`,"card.collapse":`Collapse`,"card.subAgent":`Sub-agent`,"card.subAgentProgress":`Sub-agents: {running} of {total} running`,"activity.starting":`Starting`,"activity.thinking":`Thinking`,"activity.responding":`Responding`,"activity.working":`Working`,"activity.compacting":`Compacting context`,"menu.open":`Open session`,"menu.pin":`Pin`,"menu.unpin":`Unpin`,"menu.markHandled":`Mark as handled`,"menu.copyLink":`Copy session link`,"menu.archive":`Archive`,"action.failed":`That didn't go through. Try again shortly.`,"action.archived":`Archived: {title}`,"action.copied":`Session link copied`,"action.copyFailed":`Couldn't copy the link`,"confirm.title":`Confirm high-risk action`,"confirm.titleStandard":`Confirm approval`,"confirm.description":`The command guard flagged this approval as high risk. Check the full arguments before allowing it.`,"confirm.descriptionCritical":`This is a high-risk action, such as installing a global plugin or submitting a form. Check the full arguments before allowing it.`,"confirm.descriptionStandard":`Check the full arguments before allowing it.`,"confirm.descriptionLoading":`Loading approval details…`,"confirm.session":`Session`,"confirm.tool":`Tool`,"confirm.cwd":`Working folder`,"confirm.fullArgs":`Full arguments`,"confirm.loading":`Loading approval details. You can allow it once they arrive.`,"confirm.hint":`Hold the confirm button for 0.6 s, or press`,"confirm.hintTouch":`Hold the confirm button for 0.6 s`,"confirm.hold":`Hold to confirm`,"confirm.approving":`Allowing…`,"confirm.cancel":`Cancel`,"triage.progress":`Triage {index}/{total}`,"triage.approve":`Allow`,"triage.deny":`Deny`,"triage.retry":`Retry`,"triage.open":`Open`,"triage.exit":`Exit`,"triage.finished":`All handled`,"triage.nothing":`Nothing needs you`,"announce.moved":`{title} moved to {lane}`,"launch.projects":`Recent projects`,"launch.projectLabel":`Project: {project}`,"launch.defaultProject":`Default folder`,"launch.noProject":`No project`,"launch.chooseFolder":`Choose folder…`,"launch.newFolder":`New folder…`,"project.actionsFor":`Actions for {project}`,"project.new":`New project…`,"folder.title":`New folder`,"folder.description":`Create an empty folder at the chosen location and use it as this task's project.`,"folder.parent":`Location`,"folder.parentPlaceholder":`Absolute path; leave empty for the default working folder`,"folder.browse":`Browse…`,"folder.browseTitle":`Choose where to create the new folder`,"folder.browseUnavailable":`This device can't open the system file manager. Type the location path instead.`,"folder.name":`Name`,"folder.namePlaceholder":`e.g. my-project`,"folder.preview":`Will create: {path}`,"folder.create":`Create`,"folder.creating":`Creating…`,"folder.error.nameRequired":`Enter a folder name.`,"folder.error.nameInvalid":`The name can't contain / \\ : * ? " < > | and can't end with a dot or space.`,"folder.error.parentMissing":`The location doesn't exist or isn't a folder.`,"folder.error.existsAsFile":`A file with this name already exists at the location.`,"folder.error.permission":`You don't have permission to create a folder at this location.`,"folder.error.failed":`Couldn't create the folder.`,"folder.error.failedWithReason":`Couldn't create the folder: {reason}`,"project.manage":`Manage projects…`,"project.newTaskHere":`New task in this project`,"project.rename":`Rename…`,"project.resetName":`Use folder name`,"project.delete":`Delete project…`,"project.remove":`Remove project`,"project.chosen":`Project "{project}" selected. Describe the first task to dispatch it.`,"project.pickerDescription":`Choose the project folder. It becomes the launch console target.`,"project.renameDescription":`Customize the project name shown in All agents and the dispatch dialog. The working directory stays the same.`,"project.manageTitle":`Manage projects`,"project.manageDescription":`Change the order and names of your projects. Projects without chats can be removed without touching their folders or files. Deleting a project with chats also deletes all of its chats.`,"project.sessions":`{count} chats`,"project.folderName":`Folder: {name}`,"project.moveUp":`Move {project} up`,"project.moveDown":`Move {project} down`,"project.renameNamed":`Rename {project}`,"project.resetNamed":`Use folder name for {project}`,"project.deleteWithChatsNamed":`Delete {project} and its chats`,"project.removeNamed":`Remove project {project}`,"project.listLabel":`Projects`,"project.empty":`No projects yet`,"project.emptyHint":`Create a project, then describe its first task in the launch console.`,"project.loading":`Loading projects…`,"project.error":`Couldn't load projects`,"project.deleting":`Deleting…`,"project.done":`Done`,"phone.running":`Running {elapsed}`,"phone.changes":`+{count} changes`,"phone.changesLabel":`View the {count} files changed in this session`,"phone.openInspector":`Changes, terminal, files and preview`,"phone.inspectorDescription":`Changes, terminal, sources and web preview for this session`,"phone.earlierTurns":`Show earlier conversation: {summary}`,"phone.previousTurn":`Previous turn`,"session.moveWorkspace":`Move workspace…`,"session.workflowRuns":`Workflow runs`,"session.workflowRunsEmpty":`This session has no workflow runs yet`,"session.plan":`Plan {done}/{total}`,"session.planLabel":`Plan progress: {done} of {total} done`,"session.titleMenu":`{title}: session actions`,"session.tree":`Session tree`,"session.treeBranches":`Session tree: {count} branches`,"session.treeBranches_one":`Session tree: {count} branch`,"session.changedFiles":`{count} files`,"session.changedFiles_one":`{count} file`,"session.changes":`{count} files +{added} −{removed}`,"session.changes_one":`{count} file +{added} −{removed}`,"session.contextUsage":`Context used {percent}%`,"session.withShortcut":`{label} ({shortcut})`,"session.planOpen":`{plan}: view in the inspector`,"inspector.label":`Inspector`,"inspector.tabs":`Inspector tabs`,"inspector.changes":`Changes`,"inspector.changesCount":`Changes {count}`,"inspector.changesScope":`Change scope`,"inspector.scopeSession":`This session`,"inspector.scopeWorkspace":`Workspace`,"inspector.terminal":`Terminal`,"inspector.terminalScope":`Terminal view`,"inspector.processes":`Processes`,"inspector.terminalUnavailable":`This device or runtime does not provide a terminal`,"inspector.files":`Files`,"inspector.preview":`Preview`,"inspector.plan":`Plan`,"inspector.sideChat":`Side chat`,"inspector.closeTab":`Close “{tab}”`,"inspector.add":`Add component tab`,"inspector.addHint":`Components placed in the “session panel” slot show up here as tabs.`,"inspector.openComponents":`Open Components`,"inspector.close":`Hide inspector`,"transcript.operations":`{count} operations`,"transcript.operations_one":`{count} operation`,"transcript.running":`{count} running`,"transcript.failed":`{count} failed`,"transcript.turn":`Turn {count}`,"composer.placeholder":`Reply to the agent, or use / for commands`,"composer.tokens":`{tokens} tok`,"composer.queuedFollowUp":`After run`,"composer.queuedSteer":`Queued`,"composer.steerNow":`Send now`,"composer.steerHint":`Interrupts the current step so the agent reads it right away`,"composer.longPressSteer":`While running, press and hold to send now`,"changes.sessionSummary":`{count} files changed in this session`,"changes.workspaceSummary":`{count} uncommitted files in the workspace`,"changes.revertAll":`Revert all`,"changes.more":`More change actions`,"changes.pending":`{count} pending approval`,"changes.revertFile":`Revert this file`,"changes.files":`Changed files`,"changes.diffView":`Diff view`,"changes.unified":`Unified`,"changes.split":`Split`,"changes.splitTooNarrow":`The inspector is narrower than 600 px, too narrow for side by side. Widen it to use this view.`,"changes.approvedAt":`Write approved · {time}`,"changes.pendingAt":`Awaiting approval · {time}`,"changes.revertedAt":`Reverted · {time}`,"changes.statusModified":`Modified`,"changes.statusCreated":`Added`,"changes.statusDeleted":`Deleted`,"changes.statusRenamed":`Renamed`,"inspector.goal":`Goal`,"inspector.team":`Team`,"inspector.subAgents":`Sub-agents`,"shortcuts.agentPanel":`Focus the sidebar session list`,"shortcuts.toggleInspector":`Show / hide inspector`,"shortcuts.previousAgent":`Previous session in sidebar order`,"shortcuts.nextAgent":`Next session in sidebar order`,"shortcuts.steerMessage":`Send now while running`,"shortcuts.shortcutHelp":`Keyboard shortcuts`,"shortcuts.sendMessage":`Send (queues while running)`,"shortcuts.focusSearch":`Focus filter / search`,"shortcuts.groupGlobal":`Global`,"shortcuts.groupBoard":`All agents`,"shortcuts.groupSession":`Session`,"shortcuts.globalHint":`Chords with a modifier also work while typing.`,"shortcuts.boardHint":`All agents page only. Single-letter keys work when focus is not in a text field and can only be letters without modifiers.`,"shortcuts.sessionHint":`Session page only. Esc never navigates back.`,"shortcuts.fixed":`Fixed`,"shortcuts.boardMove":`Move between agents (row focused)`,"shortcuts.boardOpen":`Open the session`,"shortcuts.boardExitTriage":`Leave triage`,"shortcuts.newline":`New line`,"shortcuts.stopRun":`Stop the run (closes an open overlay first)`,"shortcuts.helpDescription":`Bindings on this device. Changes show up here right away.`,"shortcuts.helpCustomize":`Customize in Settings`,"home.draftTitle":`New task`,"home.draftSubtitle":`A session is created when you send the first message`,"home.draftHint":`Pick a project and describe the task. After the first message this becomes its session; other agents stay in All agents.`,"home.loading":`Opening your last session…`,"home.loadFailed":`Couldn't load sessions`,"home.loadFailedHint":`Your last session can't be confirmed right now. Retry, or start a new task instead.`,"home.startDraft":`Start a new task`,"home.goHome":`Go to home`,"shortcuts.openSession":`Open session home`,"shortcuts.sessionTree":`Session tree (branches and marks)`,"shortcuts.sideChat":`Side chat`,"shortcuts.cycleFocusRegion":`Move focus between sidebar, top bar, conversation and composer`,"shortcuts.groupSidebar":`Sidebar`,"shortcuts.sidebarHint":`When a session row in the sidebar has focus. A / D follow the All agents allow / deny keys and only handle standard approvals.`,"shortcuts.sidebarMove":`Move between session rows`,"shortcuts.sidebarOpen":`Open session`,"sidebar.reason.failed":`Run failed`,"sidebar.reason.approval":`Waiting for your approval`,"sidebar.reason.criticalApproval":`High-risk approval`,"sidebar.reason.question":`Waiting for your answer`,"sidebar.reason.questions":`Waiting for your answer · {count} questions`,"sidebar.reason.questions_one":`Waiting for your answer · {count} question`,"sidebar.reason.questionCount":`{count} questions`,"sidebar.reason.questionCount_one":`{count} question`,"sidebar.group.attention":`Needs you`,"sidebar.group.running":`Running`,"sidebar.group.queued":`Queued`,"sidebar.group.pinned":`Pinned`,"sidebar.group.done":`Done today`,"sidebar.loading":`Loading sessions`,"sidebar.error":`Couldn't load sessions`,"sidebar.retry":`Retry`,"sidebar.empty":`No agents running yet. Start one with New task.`,"sidebar.emptyAttention":`Nothing needs you`,"sidebar.emptyRunning":`No agents running`,"sidebar.moreRunning":`{count} more →`,"sidebar.allDone":`All →`,"sidebar.history":`History`,"sidebar.group.recent":`Recent`,"sidebar.emptyRecent":`No chats yet`,"sidebar.allChats":`All chats`,"sidebar.announce":`{title} needs you: {reason}`,"sidebar.announceSeparator":`; `,"sidebar.attentionRow":`{title}, {reason}, waiting {wait}`,"sidebar.attentionRowNoWait":`{title}, {reason}`,"sidebar.unread":`Unread`,"sidebar.deny":`Deny`,"sidebar.approve":`Allow`,"sidebar.open":`Open`,"sidebar.denyNamed":`Deny the request from {title}`,"sidebar.approveNamed":`Allow the request from {title}`,"sidebar.openNamed":`Open {title} to handle it`,"sidebar.rowMenu":`More actions for {title}`,"sidebar.renameTitle":`Rename session`,"sidebar.renameLabel":`Session title`,"sidebar.renameSave":`Save`,"sidebar.renamed":`Session title updated`,"sidebar.railAttention":`{count} agents need you, open all agents`,"sidebar.railAttention_one":`{count} agent needs you, open all agents`,"sidebar.railRunning":`{count} agents running, open all agents`,"sidebar.railRunning_one":`{count} agent running, open all agents`,"sidebar.filter.all":`All`,"sidebar.filter.projectActions":`Project actions`,"sidebar.filter.addProject":`Add project…`,"sidebar.filter.noProjects":`No projects yet`,"sidebar.fleet.attention":`{count} need you`,"sidebar.fleet.running":`{count} running`,"sidebar.fleet.label":`{attention} need you, {running} running, open all agents`,"menu.rename":`Rename`,"composer.placeholderRunning":`Running: {queue} to queue, {steer} to send now`,"composer.placeholderRunningQueueOnly":`Running: {queue} to queue`,"composer.placeholderRunningTouch":`Running: tap send to queue, hold send to send now`,"composer.sendQueuedNow":`Send this queued message now`,"composer.editQueued":`Edit queued message`,"composer.cancelQueued":`Cancel queued message`,"composer.plusMenu":`Add attachments, skills or voice input`,"composer.modeChip":`Approval and run mode`,"composer.goalShort":`Goal`,"composer.teamShort":`Team`,"composer.cycleRunMode":`Cycle`,"composer.contextUsage":`Context`,"composer.sessionTokens":`This session`,"composer.cacheHitLabel":`Cache hits`,"transcript.allDone":`all done`,"transcript.copyMarkdown":`Copy as Markdown`,"card.holdToApprove":`Hold to allow`,"card.holdHint":`High-risk: hold for 0.6 s`,"card.moreWaiting":`{count} more waiting for you`,"shortcuts.cycleRunMode":`Cycle run mode (Plan / Goal / Team)`,"project.moveUpShort":`Move up`,"project.moveDownShort":`Move down`,"triage.answer":`Answer`,"overview.doneUnread":`Done · unread`,"overview.waited":`waited {wait}`,"overview.ran":`running for {time}`,"overview.finishedAt":`finished at {time}`,"overview.openToHandle":`Open to handle`,"overview.log":`Log`,"overview.retryNamed":`Retry {title}`,"overview.subAgents":`Sub-agents {running}/{total}`,"overview.startNow":`Start now`,"overview.queuedAfter":`After “{title}”`,"overview.queuedAfterUnknown":`Waiting for an earlier task`,"overview.queuePosition":`No. {n} in queue`,"overview.empty":`No agents are running yet`,"overview.newTask":`New task`,"overview.widgets":`Placed components`,"overview.subAgentSlots":`Sub-agents {running}/{max}`,"overview.todayTokens":`{tokens} tok today`,"overview.memory":`Memory {memory}`,"overview.systemLoading":`Reading system info…`,"overview.systemUnavailable":`System info is unavailable right now`,"overview.projectAttention":`{count} need you`,"overview.projectAttention_one":`{count} needs you`,"overview.projectRunning":`{count} running`,"overview.projectQueued":`{count} queued`,"overview.projectDone":`{count} done today`,"question.title":`The agent is asking you`,"question.label":`Agent question`,"question.waiting":`{count} more questions are waiting for you`,"question.moreAfter":`{count} more after this`,"question.failed":`Couldn't send the answer. Try again (it may have been answered elsewhere).`,"question.other":`Other…`,"question.otherLabel":`Other answer: {question}`,"question.otherPlaceholder":`Write your answer`,"question.skip":`Skip`,"question.submit":`Submit`,"question.answerNamed":`Answer “{title}”: {option}`,"composer.plusSheetTitle":`Add`,"composer.attachmentShort":`Attachment`,"composer.voiceInput":`Voice input`,"composer.planShort":`Plan`,"phone.openInspectorShort":`Changes & files`,"inspector.running":`Running`,"inspector.runningCount":`Running {count}`,"inspector.runningStatus":`Running`,"inspector.runningQueued":`Queued`,"inspector.runningTool":`Tool`,"inspector.runningAgent":`Subagent`,"inspector.runningEmpty":`Nothing is running in this chat right now`,"inspector.runningHint":`Shows the commands and tools the agent is running, its subagents, and this task’s terminals. Processes a command sends to the background (nohup, &) are not listed.`,"launch.machines":`Remote machines`,"launch.addMachine":`Add remote machine…`,"machine.folderTitle":`Work on {name}`,"machine.folderDescription":`The agent's file and shell tools will run on this machine.`,"machine.folderLabel":`Folder on that machine`,"machine.folderHint":`Leave empty for the home folder.`,"machine.folderInRoots":`Must be inside: {roots}`,"machine.confirm":`Use this folder`,"machine.checking":`Connecting…`,"machine.cancel":`Cancel`,"composer.context.system":`System prompt`,"composer.context.project":`Project instructions`,"composer.context.skills":`Skill list`,"composer.context.tools":`Built-in tools`,"composer.context.mcp":`MCP tools`,"composer.context.messages":`Messages`,"composer.context.toolResults":`Tool calls & results`,"composer.context.free":`{tokens} free`,"composer.context.estimated":`Total from the model; the parts are estimates.`,"composer.context.allEstimated":`No usage from the model yet; all estimates.`,"composer.context.prefixUnknown":`The system prompt and tools can be counted once the session has run.`,"composer.context.compactAt":`Compacts at {percent}%`,"composer.context.deferred":`{count} on standby, free until called`,"composer.context.callCount":`{count} calls`,"composer.context.composition":`What is using it`,"composer.context.toolCount":`{count} tools`}};export{e as boardMessages};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as e}from"./workspace-order-store-C-jYrC0l.js";import{s as t}from"./useSessionListQuery-CURESPBn.js";import{n}from"./session-workspaces-Brm-8lHh.js";import{o as r}from"./card-presentation-1oph2b8P.js";function i(t,n){let r=e(n,t.map(e=>e.key)).map(e=>({...e,count:0}));return[...t,...r]}function a(t,i,a){let o=t.filter(e=>!e.machine).sort((e,t)=>(Date.parse(t.modified||``)||0)-(Date.parse(e.modified||``)||0)),s=n(o).filter(e=>e.key!==`\0`&&e.cwd);return[...e(i,s.map(e=>e.key)),...s.slice(0,12)].map(e=>({key:e.key,cwd:e.cwd,label:a[e.key]||r(e.cwd)}))}function o(e,t){return a(e,[],{})[0]?.cwd||t[0]?.cwd||``}function s(e,a,o,s,c){let l=n(e).map(e=>({key:e.key,cwd:e.cwd,count:e.sessions.length}));return t(i(l,a).map(e=>{let t=e.cwd?r(e.cwd):c,n=e.key===`\0`?``:o[e.key]||``;return{...e,label:n||t,folderLabel:t,custom:!!n}}),s)}export{i,s as n,a as r,o as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e}from"./rolldown-runtime-B0Z9INg1.js";import{i as t}from"./vendor-react-DwNgTV1j.js";import{c as n}from"./i18n-D80GstlU.js";import{o as r}from"./vendor-state-GkUciC5H.js";import{n as i}from"./startup-queries-BlA4Hayt.js";import{t as a}from"./http-response-PZN5QIRk.js";import{n as o}from"./http-Bp65Kb4t.js";import{a as s,o as ee}from"./BotAvatar-CNL-APwP.js";n.addResourceBundle(`zh-CN`,`bots`,{"sidebar.title":`Bots`,"sidebar.newBot":`新建 Bot`,"sidebar.showAll":`显示全部({count})`,"sidebar.showLess":`收起`,"activity.idle":`空闲`,"activity.paused":`已暂停`,"character.blob":`小圆`,"character.bean":`豆豆`,"character.robot":`机器人`,"character.cat":`小猫`,"character.owl":`猫头鹰`,"character.ghost":`小幽灵`,"character.cloud":`云朵`,"character.octo":`章鱼`,"character.bunny":`兔子`,"character.bear":`小熊`,"character.fox":`小狐`,"character.star":`星星`,"new.title":`新建 Bot`,"new.description":`起个名字就能开始。它负责什么可以现在写,也可以之后在对话里告诉它。`,"new.name":`名字`,"new.namePlaceholder":`例如:审查员`,"new.character":`角色`,"new.color":`颜色`,"new.colorOption":`颜色 {index}`,"new.pick":`选择…`,"new.cancel":`取消`,"new.create":`开始对话`,"new.creating":`正在创建…`,"page.disabledTitle":`Bots 还没打开`,"page.disabledDescription":`Bots 是实验功能,在设置 › 实验功能里打开后就能用。`,"page.openLabs":`去实验功能`,"page.loading":`正在读取…`,"page.notFound":`这个 Bot 不存在了`,"page.emptyTitle":`还没有 Bot`,"page.emptyDescription":`Bot 是常驻的同事:一个长期对话,你随时找它,聊天软件和定时任务也能找它。`,"details.instructions":`它负责什么`,"details.instructionsPlaceholder":`例如:你负责 pisper 仓库的 PR 审查;小问题直接改,其余只提建议;先跑 npm test 再下结论。`,"details.save":`保存`,"details.acceptsWork":`接收聊天与定时的消息`,"details.permission":`权限`,"details.modeApproval":`每一步都问我`,"details.modeWorkspace":`危险操作才问`,"details.modeFull":`完全访问`,"details.permissionHint":`它在这台电脑上自己改文件、跑命令,不限于起始目录。“危险操作才问”:只有命令守卫标出的危险命令、浏览器里的点击与填写、第三方插件才停下来问你。能在群聊里叫它时不能选完全访问。`,"computer.description":`它在这台电脑上读写代码、跑命令。可以换成另一台运行 pisper executor 的电脑。`,"computer.runsOn":`运行在`,"computer.local":`本机`,"activity.approval":`等你批准一个操作`,"activity.question":`有问题问你`,"details.tools":`可用工具`,"details.toolsAll":`全部工具`,"details.toolsReadOnly":`只读`,"details.toolsCustom":`自定义({count} 个)`,"details.toolsHint":`只读:能读代码、搜索,不能改文件、不能跑命令。范围外的工具在执行前就会被拦下。`,"computer.unnamed":`未命名的电脑`,"computer.online":`在线`,"computer.offline":`离线`,"computer.option":`{name}({state})`,"computer.folder":`起始目录`,"computer.folderPlaceholder":`/path/to/repo`,"computer.folderInRoots":`必须在这台电脑允许的目录里:{roots}`,"computer.switch":`换到这里`,"computer.listTitle":`电脑`,"computer.usedBy":`{names} 在用`,"computer.remove":`移除`,"computer.confirmRemove":`确定移除`,"computer.cancel":`取消`,"computer.add":`添加电脑`,"computer.addTitle":`添加一台电脑`,"computer.done":`完成`,"computer.code":`配对码`,"computer.codeHint":`10 分钟内有效,只能用一次`,"computer.remoteOff":`先打开远程访问,那台电脑才连得上这里。`,"computer.openRemote":`打开远程访问`,"computer.runThere":`在那台电脑上运行(把目录换成允许 Bot 读写的代码目录,可以写多个 --root):`,"computer.rootPlaceholder":`~/code`,"computer.rootHint":`那台电脑只需要 Node.js,不需要模型密钥。`,"computer.copy":`复制命令`,"computer.copied":`已复制`,"computer.brainPlaceholder":`https://<这台电脑的远程访问地址>`,"triggers.chats":`可以叫它的聊天`,"triggers.chatsHint":`在这些聊天里发“/{name} 要做的事”或“@Pisper {name} 要做的事”就能叫它。聊天与人的 ID 在聊天里发 /whoami 查看。`,"triggers.p2p":`私聊`,"triggers.group":`群聊`,"triggers.peers":`聊天 {ids}`,"triggers.allPeers":`所有聊天`,"triggers.senders":`{ids} 能叫它`,"triggers.ownerOnly":`只有你能叫它`,"triggers.remove":`删除`,"triggers.platform":`渠道`,"triggers.peerIds":`聊天 ID`,"triggers.peerIdsPlaceholder":`聊天 ID,多个用逗号分开;不填表示所有聊天`,"triggers.senderIds":`谁能叫它`,"triggers.senderIdsPlaceholder":`谁能叫它(ID,逗号分开);不填只有你`,"triggers.senderIdsRequired":`谁能叫它(ID,逗号分开);群聊必须填写`,"triggers.cancel":`取消`,"triggers.add":`添加`,"triggers.addChat":`添加聊天`,"triggers.feishu":`飞书`,"triggers.weixin":`微信`,"triggers.qq":`QQ`,"triggers.telegram":`Telegram`,"triggers.schedules":`定时让它做`,"triggers.scheduleEnabled":`启用这个定时`,"triggers.scheduleMessage":`要做的事`,"triggers.scheduleMessagePlaceholder":`例如:检查依赖有没有安全更新`,"triggers.frequency":`频率`,"triggers.daily":`每天`,"triggers.weekly":`每周`,"triggers.once":`一次`,"triggers.weekday":`星期`,"triggers.date":`日期`,"triggers.time":`时间`,"triggers.addSchedule":`添加定时`,"triggers.monday":`周一`,"triggers.tuesday":`周二`,"triggers.wednesday":`周三`,"triggers.thursday":`周四`,"triggers.friday":`周五`,"triggers.saturday":`周六`,"triggers.sunday":`周日`,"triggers.onceAt":`{date} {time} 一次`,"triggers.weeklyAt":`每{day} {time}`,"triggers.dailyAt":`每天 {time}`,"triggers.otherSchedule":`按定时任务页里的设置`,"new.shuffle":`换一个样子`,"new.chooseLook":`自己挑样子`,"new.duty":`它负责什么(可选)`,"new.dutyPlaceholder":`例如:审查 pisper 仓库的 PR;小问题直接改,其余只提建议。`,"new.folder":`起始目录`,"new.folderDefault":`不填就从默认工作目录开始`,"new.folderSummary":`从本机的默认工作目录开始干活。`,"new.changeFolder":`换个目录`,"settings.changeLook":`换个样子`,"settings.doneLook":`选好了`,"settings.computer":`电脑`,"settings.computerSummary":`{computer} · {folder}`,"settings.chatsCount":`{count} 个聊天`,"settings.notSet":`未设置`,"settings.advanced":`高级`,"settings.advancedSummary":`权限:{permission} · 工具、暂停`,"activity.busy":`正在忙`,"settingsPage.backToChat":`和 {name} 聊天`,"settingsPage.title":`{name} 的设置`,"model.title":`模型`,"model.summary":`{model} · 思考:{thinking}`,"model.model":`模型`,"model.thinking":`思考`,"model.hint":`它的会话用这里的模型和思考等级,改了下一轮生效。档位跟着“设置 › 子代理”里的模型档位走。`,"model.tierFast":`快速档`,"model.tierStandard":`标准档`,"model.tierStrong":`强档`,"model.thinkingDefault":`模型默认`,"model.thinkingOff":`关闭`,"model.thinkingMinimal":`极轻`,"model.thinkingLow":`轻度`,"model.thinkingMedium":`标准`,"model.thinkingHigh":`深度`,"model.thinkingXhigh":`极深`,"activity.working":`{count} 件在做`,"activity.workingOn":`{count} 件在做 · 在做:{task}`,"memory.title":`记忆`,"memory.count":`{count} 条`,"memory.hint":`{name} 自己记得的事:你让它记住的、你纠正过的、做完一件活学到的。和当前这件事相关的会自动带上,它派出去的子 agent 也一样。`,"memory.readGlobal":`读取全局记忆`,"memory.readGlobalHint":`只读你的长期偏好,不写入。Bot 之间互相看不到。`,"memory.empty":`{name} 还没记住什么`,"memory.edit":`改这一条`,"memory.editLabel":`改这条记忆`,"memory.delete":`删掉这一条`,"memory.save":`保存`,"memory.cancel":`取消`,"memory.add":`记下`,"memory.addLabel":`加一条记忆`,"memory.addPlaceholder":`例如:发版前要在 iPhone 上点一遍首页`,"skills.title":`它学会的`,"skills.count":`{count} 个技能`,"skills.hint":`{name} 做完一件活会复盘:会反复做的事,它把做法写成自己的技能,之后派出去的子 agent 都带着;你纠正过的做法也会更新进去。`,"skills.empty":`{name} 还没学会什么`,"skills.loading":`正在读取…`,"skills.delete":`删掉这个技能`,"skills.schedule":`设成定时`,"skills.scheduleMessage":`照技能 {name} 做一遍`,"proactive.title":`主动`,"proactive.off":`关着`,"proactive.summaryCheck":`每 {count} 小时巡看`,"proactive.summaryBrief":`每天 {time} 简报`,"proactive.check":`空闲时自己巡看`,"proactive.every":`多久一次`,"proactive.everyHours":`每 {count} 小时`,"proactive.checkHint":`{name} 手上没活时,按它负责的东西只读看一遍(读文件、搜索,不改东西、不跑命令、不往外发消息),发现写成对话里的一条建议,你说“做吧”它才去做。`,"proactive.brief":`每天写一份简报`,"proactive.briefAt":`什么时候`,"proactive.briefHint":`过去一天做了什么、今天排了什么、有什么建议,写在它的对话里。`,"details.parallel":`同时做几件`,"details.parallelCount":`{count} 件`,"details.parallelHint":`它同时派出去干活的子 agent 最多几个,多的排队。`,"greeting.hello":`你好,我是{name}`,"greeting.duty":`我记下了:{duty}`,"greeting.editDuty":`改`,"greeting.ask":`想让我帮你做什么?选一个,或者直接告诉我。`,"greeting.talk":`有事直接告诉我。`,"greeting.brief":`每天给我一份简报`,"greeting.briefHint":`到点告诉你过去一天做了什么、今天有什么安排,每天都会消耗模型用量`,"greeting.briefWhen":`每天几点给你简报?`,"greeting.briefNote":`如果今天已经过了这个时间,会马上写今天这份。`,"greeting.briefConfirm":`好`,"greeting.briefOn":`每天 {time} 给你简报`,"greeting.briefOnHint":`每天都会消耗模型用量,点一下改时间`,"greeting.watch":`帮我盯一个项目`,"greeting.watchHint":`默认每 {count} 小时只读看一遍,每次都消耗模型用量`,"greeting.watchWhen":`多久看一遍?`,"greeting.watchNote":`选好目录后马上看第一遍,之后在我空闲时按这个频率看。只读,不改东西、不跑命令。每次都会调用模型、消耗用量,随时可以在设置里关。`,"greeting.watchConfirm":`选择目录并开始`,"greeting.watchDuty":`盯着这个项目,发现问题告诉我。`,"greeting.folder":`告诉我项目在哪`,"greeting.folderHint":`现在在 {folder},选个目录我就换过去`,"greeting.folderWatchHint":`现在在 {folder}。每 {count} 小时看一遍,每次都消耗模型用量,可在设置里关`,"greeting.chats":`在聊天软件里找我`,"greeting.chatsHint":`连上飞书、微信、QQ 或 Telegram,直接叫我`,"greeting.chatsOn":`已连上 {count} 个聊天`,"greeting.chatsOnHint":`点一下管理`}),n.addResourceBundle(`en-US`,`bots`,{"sidebar.title":`Bots`,"sidebar.newBot":`New Bot`,"sidebar.showAll":`Show all ({count})`,"sidebar.showLess":`Show less`,"activity.idle":`Idle`,"activity.paused":`Paused`,"character.blob":`Blob`,"character.bean":`Bean`,"character.robot":`Robot`,"character.cat":`Cat`,"character.owl":`Owl`,"character.ghost":`Ghost`,"character.cloud":`Cloud`,"character.octo":`Octopus`,"character.bunny":`Bunny`,"character.bear":`Bear`,"character.fox":`Fox`,"character.star":`Star`,"new.title":`New Bot`,"new.description":`A name is all it needs. Say what it’s responsible for now, or tell it later in the chat.`,"new.name":`Name`,"new.namePlaceholder":`e.g. Reviewer`,"new.character":`Character`,"new.color":`Color`,"new.colorOption":`Color {index}`,"new.pick":`Choose…`,"new.cancel":`Cancel`,"new.create":`Start chatting`,"new.creating":`Creating…`,"page.disabledTitle":`Bots are turned off`,"page.disabledDescription":`Bots is a Labs feature. Turn it on in Settings › Labs.`,"page.openLabs":`Open Labs`,"page.loading":`Loading…`,"page.notFound":`This Bot no longer exists`,"page.emptyTitle":`No Bots yet`,"page.emptyDescription":`A Bot is a teammate that's always around: one long conversation you can pick up anytime, and chats and schedules can reach it too.`,"details.instructions":`What it’s responsible for`,"details.instructionsPlaceholder":`e.g. You review PRs in the pisper repo; fix small issues directly, otherwise only suggest; run npm test before concluding.`,"details.save":`Save`,"details.acceptsWork":`Take messages from chats and schedules`,"details.permission":`Permission`,"details.modeApproval":`Ask before every step`,"details.modeWorkspace":`Ask only if risky`,"details.modeFull":`Full access`,"details.permissionHint":`It edits files and runs commands on this computer on its own, not only in the starting folder. “Ask only if risky”: it stops to ask only for commands the guard flags as dangerous, clicks and typing in the browser, and third-party plugins. Bots you can call from a group chat can’t use full access.`,"computer.description":`It reads and writes code and runs commands on this computer. You can switch it to another computer running pisper executor.`,"computer.runsOn":`Runs on`,"computer.local":`This computer`,"activity.approval":`Waiting for your approval`,"activity.question":`Has a question for you`,"details.tools":`Tools`,"details.toolsAll":`All tools`,"details.toolsReadOnly":`Read only`,"details.toolsCustom":`Custom ({count})`,"details.toolsHint":`Read only: it can read and search code but not edit files or run commands. Tools outside the scope are blocked before they run.`,"computer.unnamed":`Unnamed computer`,"computer.online":`online`,"computer.offline":`offline`,"computer.option":`{name} ({state})`,"computer.folder":`Starting folder`,"computer.folderPlaceholder":`/path/to/repo`,"computer.folderInRoots":`Must be inside a folder this computer allows: {roots}`,"computer.switch":`Switch here`,"computer.listTitle":`Computers`,"computer.usedBy":`Used by {names}`,"computer.remove":`Remove`,"computer.confirmRemove":`Yes, remove`,"computer.cancel":`Cancel`,"computer.add":`Add a computer`,"computer.addTitle":`Add a computer`,"computer.done":`Done`,"computer.code":`Pairing code`,"computer.codeHint":`valid for 10 minutes, single use`,"computer.remoteOff":`Turn on remote access first so the other computer can reach this one.`,"computer.openRemote":`Open remote access`,"computer.runThere":`Run this on that computer (replace the folder with the code folder Bots may use; repeat --root for more):`,"computer.rootPlaceholder":`~/code`,"computer.rootHint":`That computer only needs Node.js, no model keys.`,"computer.copy":`Copy commands`,"computer.copied":`Copied`,"computer.brainPlaceholder":`https://<remote-access-address-of-this-computer>`,"triggers.chats":`Chats that can call it`,"triggers.chatsHint":`In these chats, send “/{name} what to do” or “@Pisper {name} what to do”. Send /whoami in a chat to see its IDs.`,"triggers.p2p":`Direct`,"triggers.group":`Group`,"triggers.peers":`chats {ids}`,"triggers.allPeers":`all chats`,"triggers.senders":`{ids} can call it`,"triggers.ownerOnly":`only you can call it`,"triggers.remove":`Remove`,"triggers.platform":`Channel`,"triggers.peerIds":`Chat IDs`,"triggers.peerIdsPlaceholder":`Chat IDs, comma separated; empty means all chats`,"triggers.senderIds":`Who can call it`,"triggers.senderIdsPlaceholder":`Who can call it (IDs, comma separated); empty means only you`,"triggers.senderIdsRequired":`Who can call it (IDs, comma separated); required for groups`,"triggers.cancel":`Cancel`,"triggers.add":`Add`,"triggers.addChat":`Add a chat`,"triggers.feishu":`Feishu`,"triggers.weixin":`WeChat`,"triggers.qq":`QQ`,"triggers.telegram":`Telegram`,"triggers.schedules":`On a schedule`,"triggers.scheduleEnabled":`Schedule on`,"triggers.scheduleMessage":`What to do`,"triggers.scheduleMessagePlaceholder":`e.g. Check dependencies for security updates`,"triggers.frequency":`Frequency`,"triggers.daily":`Daily`,"triggers.weekly":`Weekly`,"triggers.once":`Once`,"triggers.weekday":`Day`,"triggers.date":`Date`,"triggers.time":`Time`,"triggers.addSchedule":`Add a schedule`,"triggers.monday":`Monday`,"triggers.tuesday":`Tuesday`,"triggers.wednesday":`Wednesday`,"triggers.thursday":`Thursday`,"triggers.friday":`Friday`,"triggers.saturday":`Saturday`,"triggers.sunday":`Sunday`,"triggers.onceAt":`Once on {date} at {time}`,"triggers.weeklyAt":`Every {day} at {time}`,"triggers.dailyAt":`Daily at {time}`,"triggers.otherSchedule":`As set on the Schedules page`,"new.shuffle":`Try another look`,"new.chooseLook":`Pick a look`,"new.duty":`What it’s responsible for (optional)`,"new.dutyPlaceholder":`e.g. Review PRs in the pisper repo; fix small issues, otherwise only suggest.`,"new.folder":`Starting folder`,"new.folderDefault":`Leave empty to start in the default working folder`,"new.folderSummary":`Starts in the default working folder on this computer.`,"new.changeFolder":`Change folder`,"settings.changeLook":`Change look`,"settings.doneLook":`Done`,"settings.computer":`Computer`,"settings.computerSummary":`{computer} · {folder}`,"settings.chatsCount":`{count} chats`,"settings.notSet":`Not set`,"settings.advanced":`Advanced`,"settings.advancedSummary":`Permission: {permission} · tools, pause`,"activity.busy":`Busy`,"settingsPage.backToChat":`Chat with {name}`,"settingsPage.title":`{name} settings`,"model.title":`Model`,"model.summary":`{model} · thinking: {thinking}`,"model.model":`Model`,"model.thinking":`Thinking`,"model.hint":`Its session uses this model and thinking level; changes apply from the next turn. Tiers follow the model tiers in Settings › Subagents.`,"model.tierFast":`Fast tier`,"model.tierStandard":`Standard tier`,"model.tierStrong":`Strong tier`,"model.thinkingDefault":`Model default`,"model.thinkingOff":`Off`,"model.thinkingMinimal":`Minimal`,"model.thinkingLow":`Low`,"model.thinkingMedium":`Medium`,"model.thinkingHigh":`High`,"model.thinkingXhigh":`Extra high`,"activity.working":`{count} in progress`,"activity.workingOn":`{count} in progress · now: {task}`,"memory.title":`Memory`,"memory.count":`{count} items`,"memory.hint":`What {name} remembers: what you asked it to remember, your corrections, and lessons from finished work. Whatever relates to the task at hand comes along automatically, also for sub-agents it hands work to.`,"memory.readGlobal":`Read global memory`,"memory.readGlobalHint":`Read-only access to your long-term preferences. Bots cannot see each other's memory.`,"memory.empty":`{name} has not remembered anything yet`,"memory.edit":`Edit`,"memory.editLabel":`Edit this memory`,"memory.delete":`Delete`,"memory.save":`Save`,"memory.cancel":`Cancel`,"memory.add":`Add`,"memory.addLabel":`Add a memory`,"memory.addPlaceholder":`e.g. Check the home page on an iPhone before each release`,"skills.title":`What it learned`,"skills.count":`{count} skills`,"skills.hint":`{name} reviews each finished job: work it will do again gets written down as its own skill, and every sub-agent it hands work to carries its skills. Your corrections update them too.`,"skills.empty":`{name} has not learned anything yet`,"skills.loading":`Loading…`,"skills.delete":`Delete this skill`,"skills.schedule":`Put on a schedule`,"skills.scheduleMessage":`Do it once following skill {name}`,"proactive.title":`Proactive`,"proactive.off":`Off`,"proactive.summaryCheck":`Checks every {count} h`,"proactive.summaryBrief":`Daily brief at {time}`,"proactive.check":`Check on things when idle`,"proactive.every":`How often`,"proactive.everyHours":`Every {count} h`,"proactive.checkHint":`When {name} has nothing to do, it looks over what it is responsible for, read-only (reads and searches files; no edits, no commands, no outgoing messages). Findings become a suggestion in its conversation; it only starts work when you say so.`,"proactive.brief":`Write a daily brief`,"proactive.briefAt":`When`,"proactive.briefHint":`What was done in the last day, what is scheduled today and any suggestions, written in its conversation.`,"details.parallel":`Jobs at once`,"details.parallelCount":`{count}`,"details.parallelHint":`How many sub-agents it runs at the same time; the rest wait in line.`,"greeting.hello":`Hi, I'm {name}`,"greeting.duty":`Noted: {duty}`,"greeting.editDuty":`Edit`,"greeting.ask":`What should I help with? Pick one, or just tell me.`,"greeting.talk":`Just tell me what you need.`,"greeting.brief":`Send me a daily brief`,"greeting.briefHint":`What happened over the past day and what's planned for today. Uses model quota every day`,"greeting.briefWhen":`What time should the brief arrive?`,"greeting.briefNote":`If this time has already passed today, I'll write today's brief right away.`,"greeting.briefConfirm":`OK`,"greeting.briefOn":`Daily brief at {time}`,"greeting.briefOnHint":`Uses model quota every day. Click to change the time`,"greeting.watch":`Keep an eye on a project`,"greeting.watchHint":`Read-only look every {count} h by default. Each look uses model quota`,"greeting.watchWhen":`How often should I look?`,"greeting.watchNote":`I'll take the first look as soon as you pick a folder, then at this interval whenever I'm idle. Read-only: no edits, no commands. Each look calls the model and uses quota. You can turn it off in settings at any time.`,"greeting.watchConfirm":`Pick a folder and start`,"greeting.watchDuty":`Keep an eye on this project and tell me about any problems.`,"greeting.folder":`Show me where the project is`,"greeting.folderHint":`Currently in {folder}. Pick a folder and I'll move there`,"greeting.folderWatchHint":`Currently in {folder}. Looks every {count} h, each using model quota. Turn off in settings`,"greeting.chats":`Reach me in chat apps`,"greeting.chatsHint":`Connect Feishu, WeChat, QQ or Telegram and call me from there`,"greeting.chatsOn":`Connected chats: {count}`,"greeting.chatsOnHint":`Click to manage`});var c=[`read`,`grep`,`find`,`ls`];function l(e){if(e===null)return`all`;let t=[...e].sort();return t.length===c.length&&[...c].sort().every((e,n)=>t[n]===e)?`read-only`:`custom`}function u(e){return e.split(/[\\/]/).filter(Boolean).at(-1)||e}var d=80;function f(e){let t=e.replace(/\s+/g,` `).trim(),n=[...t];return n.length>d?`${n.slice(0,d).join(``)}…`:t}function p(e,{expanded:t,currentId:n}){let r=e=>e.activity?.needsYou?0:e.activity?.status===`running`?1:2,i=e.map((e,t)=>({bot:e,index:t})).sort((e,t)=>r(e.bot)-r(t.bot)||e.index-t.index).map(e=>e.bot);if(t||i.length<=3)return{shown:i,hidden:0};let a=i.filter((e,t)=>t<3||n!==void 0&&e.id===n);return{shown:a,hidden:i.length-a.length}}function m(e){return e.activity?.needsYou?`need`:e.activity?.status===`running`?`running`:`idle`}function h(e,t){if(!t.enabled)return e(`bots:activity.paused`);let n=t.activity,r=n?.working?n.current?e(`bots:activity.workingOn`,{count:n.working,task:n.current}):e(`bots:activity.working`,{count:n.working}):``;return n?.waiting===`approval`?r?`${e(`bots:activity.approval`)} · ${r}`:e(`bots:activity.approval`):n?.waiting===`question`?r?`${e(`bots:activity.question`)} · ${r}`:e(`bots:activity.question`):r||(n?.status===`running`?e(`bots:activity.busy`):e(`bots:activity.idle`))}var g=e(t(),1),_=[`fast`,`standard`,`strong`],v=[`off`,`minimal`,`low`,`medium`,`high`,`xhigh`],y=[1,3,6,12,24];function b(e){let t=e&&typeof e==`object`?e:{},n=y.find(e=>e===t.everyHours)??6;return{enabled:t.enabled===!0,everyHours:n,brief:t.brief===!0,briefAt:typeof t.briefAt==`string`&&/^\d{2}:\d{2}$/.test(t.briefAt)?t.briefAt:`09:00`}}var x=[`feishu`,`weixin`,`qq`,`telegram`];function te(e){return Array.isArray(e)?e.flatMap(e=>{let t=e&&typeof e==`object`?e:{};if(!x.includes(t.platform))return[];let n=e=>Array.isArray(e)?e.filter(e=>typeof e==`string`):[];return[{platform:t.platform,chatType:t.chatType===`group`?`group`:`p2p`,peerIds:Array.isArray(t.peerIds)?n(t.peerIds):null,senderIds:n(t.senderIds)}]}):[]}function S(e){if(!e||typeof e!=`object`||Array.isArray(e))throw a();return e}function C(e,t=``){return typeof e==`string`?e:t}function w(e){if(!e||typeof e!=`object`)return null;let t=e,n=t.waiting===`approval`||t.waiting===`question`?t.waiting:null,r=Number(t.working);return{status:t.status===`running`?`running`:`idle`,waiting:n,needsYou:t.needsYou===!0||n!==null,working:Number.isInteger(r)&&r>0?r:0,current:typeof t.current==`string`?t.current.slice(0,120):``}}function T(e){let t=S(e),n=S(t.avatar??{}),r=S(t.workspace??{});if(typeof t.id!=`string`||typeof t.name!=`string`)throw a();return{id:t.id,name:t.name,avatar:{character:s(n.character)?n.character:`blob`,color:ee(n.color)?n.color:`blue`},enabled:t.enabled!==!1,instructions:C(t.instructions),executionMode:t.executionMode===`workspace-write`||t.executionMode===`full-access`?t.executionMode:`approval-required`,model:E(t.model),thinking:v.find(e=>e===t.thinking)??null,channels:te(t.channels),tools:Array.isArray(t.tools)?t.tools.filter(e=>typeof e==`string`):null,workspace:{environmentId:C(r.environmentId,`local`),cwd:C(r.cwd)},threadSessionId:C(t.threadSessionId),activity:w(t.activity),maxParallelAgents:Number.isInteger(t.maxParallelAgents)&&Number(t.maxParallelAgents)>=1&&Number(t.maxParallelAgents)<=6?Number(t.maxParallelAgents):3,readGlobalMemory:t.readGlobalMemory!==!1,proactive:b(t.proactive)}}function E(e){let t=S(e??{});return typeof t.ref==`string`&&t.ref.includes(`/`)?{ref:t.ref}:{tier:_.find(e=>e===t.tier)??`standard`}}async function D(){let e=S(await i(`config`));return(Array.isArray(e.providers)?e.providers:[]).flatMap(e=>{let t=S(e);if(typeof t.id!=`string`||!t.configured||t.enabled===!1)return[];let n=C(t.name,t.id);return(Array.isArray(t.models)?t.models:[]).flatMap(e=>{let r=S(e);return typeof r.id!=`string`||r.kind!==`chat`?[]:[{ref:`${t.id}/${r.id}`,name:C(r.name,r.id),providerName:n}]})})}function O(e,t){return n=>t(S(n)[e])}function k(e){return o(`/api/bots`,{signal:e,parse:e=>{let t=S(e).bots;if(!Array.isArray(t))throw a();return t.map(T)}})}function A(e){return o(`/api/bots`,{method:`POST`,data:e,parse:O(`bot`,T)})}function j(e,t){return o(`/api/bots/${encodeURIComponent(e)}`,{method:`PATCH`,data:t,parse:O(`bot`,T)})}function M(e){return o(`/api/bots/${encodeURIComponent(e)}/session`,{method:`POST`,data:{},parse:e=>{let t=S(e).sessionId;if(typeof t!=`string`||!t)throw a();return t}})}function N(e){let t=e&&typeof e==`object`?e:{};return{enabled:t.enabled===!0,endpoints:Array.isArray(t.endpoints)?t.endpoints.filter(e=>typeof e==`string`&&/^https:\/\//.test(e)):[],fingerprint:typeof t.fingerprint==`string`?t.fingerprint:null}}function P(e){let t=S(e);if(typeof t.id!=`string`||!t.id)throw a();let n=t.capabilities&&typeof t.capabilities==`object`?t.capabilities:{};return{id:t.id,kind:t.kind===`node`?`node`:`local`,name:C(t.name),online:t.online===!0,roots:Array.isArray(t.roots)?t.roots.filter(e=>typeof e==`string`):[],shell:n.shell===!0,usedBy:Array.isArray(t.usedBy)?t.usedBy.flatMap(e=>{let t=e&&typeof e==`object`?e:{};return typeof t.id==`string`&&typeof t.name==`string`?[{id:t.id,name:t.name}]:[]}):[],lastSeenAt:typeof t.lastSeenAt==`string`?t.lastSeenAt:null}}function F(e){return o(`/api/environments`,{signal:e,parse:e=>{let t=S(e);if(!Array.isArray(t.environments))throw a();return{environments:t.environments.map(P),remote:N(t.remote)}}})}function I(){return o(`/api/environments/pairing`,{method:`POST`,data:{},parse:e=>{let t=S(e),n=S(t.pairing);if(typeof n.code!=`string`)throw a();return{code:n.code,expiresAt:C(n.expiresAt),remote:N(t.remote)}}})}function L(e){return o(`/api/environments/${encodeURIComponent(e)}`,{method:`DELETE`,parse:()=>void 0})}function ne(e,t){let n=S(e).tasks;if(!Array.isArray(n))throw a();return n.flatMap(e=>{let n=e&&typeof e==`object`?e:{};if(n.targetType!==`bot`||n.botId!==t||typeof n.id!=`string`)return[];let r=[`once`,`interval`,`daily`,`weekly`,`monthly`].includes(String(n.frequency))?n.frequency:`daily`;return[{id:n.id,enabled:n.enabled!==!1,botMessage:C(n.botMessage),frequency:r,time:C(n.time),date:C(n.date),dayOfWeek:Number(n.dayOfWeek)||0,nextRunAt:typeof n.nextRunAt==`string`?n.nextRunAt:null}]})}function R(e,t){return o(`/api/schedules`,{signal:t,parse:t=>ne(t,e)})}function z(e){return o(`/api/schedules`,{method:`POST`,data:{...e,targetType:`bot`,enabled:!0},parse:()=>void 0})}function B(e,t){return o(`/api/schedules/${encodeURIComponent(e)}`,{method:`PATCH`,data:{enabled:t},parse:()=>void 0})}function V(e){return o(`/api/schedules/${encodeURIComponent(e)}`,{method:`DELETE`,parse:()=>void 0})}var H=[`told`,`correction`,`review`,`proactive`,`manual`,`tidy`];function U(e){if(!e||typeof e!=`object`)return null;let t=e;return typeof t.id!=`string`||typeof t.text!=`string`||!t.text?null:{id:t.id,text:t.text.slice(0,500),source:H.find(e=>e===t.source)??`told`,updatedAt:C(t.updatedAt)}}function W(e){let t=U(S(e).entry);if(!t)throw a();return t}function G(e,t){return o(`/api/bots/${encodeURIComponent(e)}/memory`,{signal:t,parse:e=>{let t=S(e).entries;return Array.isArray(t)?t.map(U).filter(e=>!!e):[]}})}function K(e,t){return o(`/api/bots/${encodeURIComponent(e)}/memory`,{method:`POST`,data:{text:t},parse:W})}function q(e,t,n){return o(`/api/bots/${encodeURIComponent(e)}/memory/${encodeURIComponent(t)}`,{method:`PATCH`,data:{text:n},parse:W})}function J(e,t){return o(`/api/bots/${encodeURIComponent(e)}/memory/${encodeURIComponent(t)}`,{method:`DELETE`,parse:()=>void 0})}function Y(e){let t=S(e);return typeof t.name!=`string`||!t.name?null:{name:t.name.slice(0,64),description:C(t.description).slice(0,1024),updatedAt:C(t.updatedAt)}}function X(e,t){return o(`/api/bots/${encodeURIComponent(e)}/skills`,{signal:t,parse:e=>{let t=S(e).skills;return Array.isArray(t)?t.map(Y).filter(e=>!!e):[]}})}function Z(e,t,n){return o(`/api/bots/${encodeURIComponent(e)}/skills/${encodeURIComponent(t)}`,{signal:n,parse:e=>{let t=S(S(e).skill),n=Y(t);if(!n)throw Error(`Invalid skill response.`);return{...n,body:C(t.body).slice(0,2e4)}}})}function re(e,t){return o(`/api/bots/${encodeURIComponent(e)}/skills/${encodeURIComponent(t)}`,{method:`DELETE`,parse:()=>void 0})}var Q=null,$=r()((e,t)=>({bots:[],loaded:!1,error:``,load:()=>(Q??=k().then(t=>e({bots:t,loaded:!0,error:``})).catch(t=>e({loaded:!0,error:t instanceof Error?t.message:String(t)})).finally(()=>{Q=null}),Q),upsert:n=>{let r=t().bots;e({bots:r.findIndex(e=>e.id===n.id)<0?[...r,n]:r.map(e=>e.id===n.id?{...n,activity:e.activity}:e)})}}));function ie(e){let t=$(e=>e.load),n=$(e=>e.bots.some(e=>e.activity?.status===`running`));(0,g.useEffect)(()=>{if(!e)return;t();let r=window.setInterval(()=>{document.visibilityState===`visible`&&t()},n?3e3:1e4);return()=>window.clearInterval(r)},[e,n,t])}export{l as A,B as C,m as D,h as E,f as O,L as S,c as T,R as _,y as a,F as b,A as c,J as d,V as f,D as g,G as h,x as i,p as j,u as k,z as l,q as m,$ as n,v as o,re as p,_ as r,K as s,ie as t,I as u,Z as v,j as w,M as x,X as y};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{i as e,n as t}from"./startup-queries-BlA4Hayt.js";import{t as n}from"./event-stream-Dh7h5sXJ.js";import{i as r,n as i,t as a}from"./http-Bp65Kb4t.js";import{r as o}from"./api-AeFmYDtL.js";var s=[`system`,`project`,`skills`,`tools`,`mcp`,`messages`,`toolResults`];function c(e){return e&&typeof e==`object`?e:{}}function l(e){let t=Number(e);return Number.isFinite(t)&&t>0?t:0}function u(e){let t=c(e),n=new Map((Array.isArray(t.categories)?t.categories:[]).map(e=>[c(e).id,c(e)])),r=Number(t.compactAtPercent);return{contextWindow:l(t.contextWindow),usedTokens:l(t.usedTokens),freeTokens:l(t.freeTokens),totalKnown:t.totalKnown===!0,prefixKnown:t.prefixKnown===!0,compactAtPercent:t.compactAtPercent!=null&&r>0&&r<=100?r:null,categories:s.map(e=>{let t=n.get(e)??{};return{id:e,tokens:l(t.tokens),count:t.count==null?null:l(t.count),deferred:l(t.deferred),calls:l(t.calls),servers:(Array.isArray(t.servers)?t.servers:[]).map(e=>{let t=c(e);return{name:typeof t.name==`string`?t.name:``,tools:l(t.tools),calls:l(t.calls),tokens:l(t.tokens)}})}})}}function d(e,t){if(!t||e<=0)return`0%`;let n=e/t*100;return n<1?`<1%`:`${Math.round(n)}%`}var f=e=>`/api/sessions/${encodeURIComponent(e)}`;async function p(t,n={}){let r=await i(t,n);return n.method&&n.method!==`GET`&&(/^\/api\/sessions(?:$|\/[^/]+(?:\/(?:derive|model|cwd|execution-mode|run-mode|thinking-level|goal|tree\/navigate))?$)/.test(t)&&e(`sessions`),t===`/api/settings/compaction`&&e(`config`)),r}var m={listSessions:({refresh:e=!0}={})=>t(`sessions`,e),searchSessionTreeLabels:(e,t=20,n)=>p(`/api/session-labels?${new URLSearchParams({query:e,limit:String(t)})}`,{signal:n}),listSessionTreeLabels:(e=500)=>p(`/api/session-labels?limit=${e}`),createSession:(e,t=``,n={})=>p(`/api/sessions`,{method:`POST`,...n.machine?{timeout:4e4}:{},data:{name:e,...n.machine?{machine:n.machine}:{},...n.projectless?{projectless:!0}:t?{cwd:t}:{}}}),getContextBreakdown:(e,t)=>p(`${f(e)}/context-breakdown`,{signal:t}).then(u),deriveSession:(e,t,n)=>p(`${f(e)}/derive`,{method:`POST`,data:{boundaryEntryId:t,name:n}}),getSessionTree:e=>p(`${f(e)}/tree`),navigateSessionTree:(e,t,n)=>p(`${f(e)}/tree/navigate`,{method:`POST`,data:{targetEntryId:t,summarize:n},timeout:18e4}),navigateSessionTreeTarget:(e,t)=>p(`${f(e)}/tree/navigate`,{method:`POST`,data:{targetEntryId:t,summarize:!1,includeTree:!1},timeout:18e4}),previewFileRewind:(e,t)=>p(`${f(e)}/tree/${encodeURIComponent(t)}/file-rewind`),rewindFiles:(e,t)=>p(`${f(e)}/tree/${encodeURIComponent(t)}/file-rewind`,{method:`POST`,timeout:18e4}),setSessionTreeLabel:(e,t,n)=>p(`${f(e)}/tree/labels/${encodeURIComponent(t)}`,{method:`PUT`,data:{label:n}}),getSessionCommands:e=>p(`${f(e)}/commands`),getWorkspaceCommands:e=>p(`/api/commands?cwd=${encodeURIComponent(e)}`),getConfig:({refresh:e=!1}={})=>t(`config`,e),updateCompactionPreference:e=>p(`/api/settings/compaction`,{method:`PATCH`,data:{thresholdPercent:e}}),getLiveSession:(e,t={})=>p(`${f(e)}/live`,t),getMessages:(e,t)=>{let n=new URLSearchParams({limit:String(t.limit)});return t.before&&n.set(`before`,t.before),p(`${f(e)}/messages?${n}`)},openStream:async(e,t,{signal:n}={})=>{await o({open:async()=>(await r(),fetch(`/api/chat`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e),signal:n})),resume:async(e,t)=>(await r(),fetch(`/api/runs/${encodeURIComponent(e)}/events?after=${t}`,{signal:n})),onEvent:t,signal:n})},askSideQuestion:async(e,t,{signal:i,onDelta:a}={})=>{await r();let o=await fetch(`${f(e)}/side-question`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({question:t}),signal:i}),s=null;if(await n(o,(e,t)=>{if(e===`delta`&&typeof t.text==`string`)a?.(t.text);else if(e===`error`)throw Error(String(t.message||``));else if(e===`done`)return s={text:typeof t.text==`string`?t.text:``,toolCallIgnored:t.toolCallIgnored===!0},!1}),!s)throw Error(`side question ended before completion`);return s},retryLastTurn:async(e,t,{signal:n}={})=>{await o({open:async()=>(await r(),fetch(`${f(e)}/retry`,{method:`POST`,signal:n})),resume:async(e,t)=>(await r(),fetch(`/api/runs/${encodeURIComponent(e)}/events?after=${t}`,{signal:n})),onEvent:t,signal:n})},queueInput:(e,t,n,r)=>p(`${f(e)}/input`,{method:`POST`,data:{message:t,attachments:n,behavior:r}}),sendQueuedInputNow:(e,t)=>p(`${f(e)}/input/${encodeURIComponent(t)}/send-now`,{method:`POST`,data:{}}),withdrawQueuedInput:(e,t)=>p(`${f(e)}/input/${encodeURIComponent(t)}`,{method:`DELETE`}),compactSession:e=>p(`${f(e)}/compact`,{method:`POST`,data:{},timeout:18e4}),getSessionWorkflowRuns:e=>p(`${f(e)}/workflow-runs`),resolveWorkflowApproval:(e,t,n)=>p(`/api/workflow-runs/${encodeURIComponent(e)}/approvals/${encodeURIComponent(t)}`,{method:`POST`,data:{approved:n}}),stopWorkflowRun:e=>p(`/api/workflow-runs/${encodeURIComponent(e)}/stop`,{method:`POST`,data:{}}),abort:e=>p(`${f(e)}/abort`,{method:`POST`,data:{}}),resolveMobileOperation:(e,t,n)=>p(`${f(e)}/mobile-operations/${encodeURIComponent(t)}`,{method:`POST`,data:n}),pauseGoal:e=>p(`${f(e)}/goal`,{method:`PATCH`,data:{action:`pause`}}),setGoalBudget:(e,t)=>p(`${f(e)}/goal`,{method:`PATCH`,data:{action:`set-budget`,tokenBudget:t}}),getGitChanges:e=>p(`${f(e)}/git/changes`),commitGitChanges:(e,t)=>p(`${f(e)}/git/commit`,{method:`POST`,data:{message:t},timeout:6e4}),pushGitChanges:e=>p(`${f(e)}/git/push`,{method:`POST`,data:{},timeout:15e4}),revertGitChanges:e=>p(`${f(e)}/git/revert`,{method:`POST`,data:{},timeout:6e4}),getVcsChanges:(e,t={})=>p(`${f(e)}/vcs/changes`,t),getFileDiff:(e,t,{preferSession:n=!1,...r}={})=>p(`${f(e)}/vcs/file-diff?path=${encodeURIComponent(t)}${n?`&prefer=session`:``}`,r),commitVcsChanges:(e,t)=>p(`${f(e)}/vcs/commit`,{method:`POST`,data:{message:t},timeout:15e4}),pushVcsChanges:e=>p(`${f(e)}/vcs/push`,{method:`POST`,data:{},timeout:15e4}),revertVcsChanges:e=>p(`${f(e)}/vcs/revert`,{method:`POST`,data:{},timeout:6e4}),createHtmlPreview:(e,t)=>p(`${f(e)}/html-preview`,{method:`POST`,body:JSON.stringify({path:t})}),getSessionFileChanges:(e,t={})=>p(`${f(e)}/file-changes`,t),getSessionFileChangeDiff:(e,t,n={})=>p(`${f(e)}/file-changes/diff?path=${encodeURIComponent(t)}`,n),revertSessionFileChanges:(e,t=``)=>p(`${f(e)}/file-changes/revert`,{method:`POST`,data:{path:t},timeout:6e4}),approveSessionFileChanges:(e,t=``)=>p(`${f(e)}/file-changes/approve`,{method:`POST`,data:{path:t}}),updateModel:(e,t,n)=>p(`${f(e)}/model`,{method:`PUT`,data:{provider:t,model:n}}),getThinkingLevel:e=>p(`${f(e)}/thinking-level`),setThinkingLevel:(e,t)=>p(`${f(e)}/thinking-level`,{method:`PUT`,data:{level:t}}),updateExecutionMode:(e,t)=>p(`${f(e)}/execution-mode`,{method:`PUT`,data:{mode:t}}),updateRunMode:(e,t)=>p(`${f(e)}/run-mode`,{method:`PUT`,data:{mode:t}}),resolveApproval:(e,t,n)=>p(`${f(e)}/approvals/${encodeURIComponent(t)}`,{method:`POST`,data:{approved:n}}),answerQuestion:(e,t,n)=>p(`${f(e)}/questions/${encodeURIComponent(t)}`,{method:`POST`,data:n}),startQueuedSession:e=>p(`${f(e)}/queue/start`,{method:`POST`,data:{}}),exportSessionMarkdown:(e,t)=>a(`${f(e)}/export?format=markdown&lang=${t===`en-US`?`en-US`:`zh-CN`}`,{timeout:6e4}),updateCwd:(e,t)=>p(`${f(e)}/cwd`,{method:`PUT`,data:{cwd:t}}),renameSession:(e,t)=>p(f(e),{method:`PATCH`,data:{name:t}})};export{d as n,m as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as e}from"./vendor-state-GkUciC5H.js";import{t}from"./api-
|
|
1
|
+
import{o as e}from"./vendor-state-GkUciC5H.js";import{t}from"./api-AeFmYDtL.js";function n(){return typeof window<`u`&&window.__PISPER_MOBILE_APP__===!0}var r=null,i=!1,a=e()(e=>({client:n()?`mobile-app`:`web`,loaded:n(),load:({refresh:a=!0}={})=>r||(!a&&i?Promise.resolve():(r=(async()=>{let r=n();r&&e({client:`mobile-app`,loaded:!0});try{let n=await t(`/api/client-info`);e({client:r||n.client===`mobile-app`?`mobile-app`:`web`,loaded:!0})}catch{e({client:r?`mobile-app`:`web`,loaded:!0})}})().finally(()=>{i=!0,r=null}),r))}));function o(){return a(e=>e.client===`mobile-app`)}export{o as n,a as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as e}from"./rolldown-runtime-B0Z9INg1.js";import{i as t}from"./vendor-react-DwNgTV1j.js";import{d as n}from"./i18n-Cl3sIF9G.js";import{i as r,r as i,t as a}from"./runtime-capabilities-CHYOF_hE.js";var o=e(t(),1),s=`section`,c={models:`config:configPage.models`,notifications:`config:configPage.notifications`,interface:`config:configPage.interface`,shortcuts:`config:configPage.shortcuts`,"desktop-pet":`config:configPage.desktopPet`,updates:`config:configPage.appUpdates`,labs:`config:configPage.labs`,about:`config:configPage.about`,"remote-access":`config:configPage.remoteAccess`,"mobile-server":`config:configPage.mobileServer`},l=[{id:`sec-models`,section:`models`,card:s,titleKey:`config:configPage.models`,keywords:[`model`,`provider`,`llm`,`api`,`模型`,`供应商`,`大模型`]},{id:`sec-notifications`,section:`notifications`,card:s,titleKey:`config:configPage.notifications`,keywords:[`notification`,`push`,`alert`,`通知`,`推送`,`提醒`]},{id:`sec-interface`,section:`interface`,card:s,titleKey:`config:configPage.interface`,keywords:[`interface`,`theme`,`appearance`,`display`,`界面`,`主题`,`外观`,`显示`]},{id:`sec-shortcuts`,section:`shortcuts`,card:s,titleKey:`config:configPage.shortcuts`,keywords:[`keyboard`,`shortcut`,`hotkey`,`keybinding`,`voice`,`push to talk`,`快捷键`,`按键`,`键盘`,`语音`,`长按`]},{id:`sec-desktop-pet`,section:`desktop-pet`,card:s,titleKey:`config:configPage.desktopPet`,keywords:[`pet`,`petdex`,`宠物`,`桌宠`]},{id:`sec-updates`,section:`updates`,card:s,titleKey:`config:configPage.appUpdates`,keywords:[`update`,`upgrade`,`version`,`更新`,`升级`,`版本`]},{id:`sec-labs`,section:`labs`,card:s,titleKey:`config:configPage.labs`,keywords:[`labs`,`beta`,`experimental`,`preview`,`实验`,`测试版`,`尝鲜`,`内测`]},{id:`sec-about`,section:`about`,card:s,titleKey:`config:configPage.about`,keywords:[`about`,`info`,`license`,`关于`,`信息`,`许可`]},{id:`sec-remote-access`,section:`remote-access`,card:s,titleKey:`config:configPage.remoteAccess`,keywords:[`remote`,`network`,`phone`,`远程`,`网络`,`手机`]},{id:`sec-mobile-server`,section:`mobile-server`,card:s,titleKey:`config:configPage.mobileServer`,keywords:[`server`,`remote`,`network`,`服务器`,`远程`,`网络`]},{id:`models-current-model`,section:`models`,card:`models-current-model`,targetId:`models-connections`,titleKey:`config:configPage.currentChatModel`,keywords:[`model`,`provider`,`quick setup`,`模型`,`供应商`,`快速配置`,`对话模型`]},{id:`models-connections`,section:`models`,card:`models-connections`,titleKey:`config:configPage.manageConnections`,keywords:[`provider`,`connection`,`api key`,`import`,`连接`,`供应商`,`导入`,`密钥`]},{id:`models-runtime-policy`,section:`models`,card:`models-current-model`,targetId:`models-runtime-policy`,titleKey:`config:configPage.agentRuntimePolicy`,keywords:[`runtime`,`agent`,`policy`,`thinking`,`tools`,`运行策略`,`运行时`,`执行策略`,`思考强度`,`可用工具`]},{id:`models-fallback`,section:`models`,card:`models-current-model`,targetId:`models-runtime-policy`,titleKey:`config:providerWorkbench.fallbackModels`,keywords:[`fallback`,`backup`,`failover`,`quota`,`备用模型`,`备选`,`额度`,`切换模型`]},{id:`models-auxiliary`,section:`models`,card:`models-current-model`,targetId:`models-runtime-policy`,titleKey:`config:providerWorkbench.auxiliaryModel`,keywords:[`auxiliary`,`helper model`,`title`,`compaction`,`summary`,`辅助模型`,`标题`,`压缩`,`摘要`,`记忆`]},{id:`models-subagents`,section:`models`,card:`models-subagents`,targetId:`models-subagents`,titleKey:`config:subagents.title`,keywords:[`subagent`,`agent definition`,`tier`,`fast`,`strong`,`子代理`,`子 Agent`,`档位`,`便宜模型`,`.pisper/agents`]},{id:`models-permission-rules`,section:`models`,card:`models-permission-rules`,targetId:`models-permission-rules`,titleKey:`config:permissionRules.title`,keywords:[`permission`,`allow`,`deny`,`approval`,`rule`,`权限`,`审批`,`允许`,`禁止`,`规则`]},{id:`models-visual`,section:`models`,card:`models-visual`,targetId:`models-visual`,expandGroup:`models-advanced`,titleKey:`config:configPage.currentVisualModel`,keywords:[`image`,`video`,`visual`,`图片`,`图像`,`视频`,`视觉`,`生图`]},{id:`notifications-browser`,section:`notifications`,card:`notifications-browser`,titleKey:`config:notificationSettings.notification`,keywords:[`browser`,`system`,`push`,`浏览器通知`,`系统通知`,`推送`]},{id:`notifications-templates`,section:`notifications`,card:`notifications-templates`,titleKey:`config:notificationSettings.notificationTemplates`,keywords:[`template`,`模板`,`通知模板`]},{id:`interface-custom-ui`,section:`interface`,card:`interface-custom-ui`,titleKey:`navigation:shell.components`,sectionTitleKey:`custom-ui:moved.title`,keywords:[`custom ui`,`standalone widgets`,`component`,`native`,`manifest`,`独立组件`,`自定义组件`,`组件`]},{id:`interface-appearance`,section:`interface`,card:`interface-appearance`,titleKey:`config:interfaceSettings.appearance`,keywords:[`theme`,`dark`,`light`,`accent`,`主题`,`深色`,`浅色`,`强调色`,`外观`]},{id:`interface-style`,section:`interface`,card:`interface-style`,expandGroup:`interface-advanced`,titleKey:`config:interfaceSettings.interfaceStyle`,keywords:[`font`,`corner`,`radius`,`字体`,`字号`,`圆角`]},{id:`interface-motion`,section:`interface`,card:`interface-motion`,expandGroup:`interface-advanced`,titleKey:`config:interfaceSettings.displayAndMotion`,keywords:[`motion`,`density`,`animation`,`动效`,`动画`,`密度`,`显示`]},{id:`interface-language`,section:`interface`,card:`interface-language`,titleKey:`config:languageSettings.displayLanguage`,keywords:[`language`,`chinese`,`english`,`语言`,`中文`,`英文`,`英语`]},{id:`desktop-pet-settings`,section:`desktop-pet`,card:`desktop-pet-settings`,titleKey:`config:desktopPetSettings.title`,keywords:[`pet`,`宠物`,`桌宠`,`宠物设置`]},{id:`desktop-pet-install`,section:`desktop-pet`,card:`desktop-pet-install`,titleKey:`config:desktopPetSettings.installTitle`,keywords:[`petdex`,`install`,`宠物安装`,`添加宠物`]},{id:`desktop-pet-installed`,section:`desktop-pet`,card:`desktop-pet-installed`,titleKey:`config:desktopPetSettings.installedTitle`,keywords:[`installed`,`已安装`,`宠物列表`]},{id:`mobile-server-main`,section:`mobile-server`,card:`mobile-server-main`,titleKey:`config:mobileServer.title`,keywords:[`server`,`remote`,`服务器`,`远程`,`手机访问`]},{id:`mobile-server-local`,section:`mobile-server`,card:`mobile-server-local`,titleKey:`config:mobileServer.localTitle`,keywords:[`local`,`on-device`,`本机`,`本地运行`]},{id:`remote-workspaces`,section:`remote-access`,card:`remote-workspaces`,titleKey:`config:remoteWorkspace.title`,keywords:[`linux`,`remote workspace`,`服务器`,`远程工作区`]},{id:`remote-access-main`,section:`remote-access`,card:`remote-access-main`,titleKey:`config:remoteAccess.title`,keywords:[`remote`,`network`,`phone`,`远程`,`网络`,`手机`]},{id:`remote-access-pairing`,section:`remote-access`,card:`remote-access-pairing`,titleKey:`config:remoteAccess.pairing`,keywords:[`pairing`,`qr`,`配对`,`二维码`]},{id:`remote-access-devices`,section:`remote-access`,card:`remote-access-devices`,titleKey:`config:remoteAccess.devices`,keywords:[`device`,`paired`,`设备`,`已配对`,`授权`]},{id:`updates-main`,section:`updates`,card:`updates-main`,titleKey:`config:updateSettings.pisperAppUpdates`,keywords:[`update`,`version`,`channel`,`更新`,`版本`,`升级`,`渠道`]},{id:`updates-components`,section:`updates`,card:`updates-components`,titleKey:`config:updateSettings.appComponents`,keywords:[`component`,`runtime`,`sidecar`,`组件`,`运行时`]},{id:`updates-cli`,section:`updates`,card:`updates-cli`,titleKey:`config:cliSettings.title`,keywords:[`cli`,`terminal`,`command`,`命令行`,`终端`,`命令`]},{id:`about-project`,section:`about`,card:`about-project`,titleKey:`config:aboutSettings.projectInformation`,keywords:[`project`,`version`,`license`,`项目`,`版本`,`许可`]},{id:`about-support`,section:`about`,card:`about-support`,titleKey:`config:aboutSettings.supportPisper`,keywords:[`support`,`donate`,`sponsor`,`支持`,`捐赠`,`赞助`]}],u={provider:[`sec-models`,`models-current-model`,`models-connections`],供应商:[`sec-models`,`models-current-model`,`models-connections`],model:[`sec-models`,`models-current-model`,`models-connections`],模型:[`sec-models`,`models-current-model`,`models-connections`],theme:[`sec-interface`,`interface-appearance`],主题:[`sec-interface`,`interface-appearance`],interface:[`sec-interface`,`interface-appearance`],界面:[`sec-interface`,`interface-appearance`,`interface-language`],diy:[`interface-custom-ui`],components:[`interface-custom-ui`],widgets:[`interface-custom-ui`],组件:[`interface-custom-ui`],pet:[`sec-desktop-pet`,`desktop-pet-settings`,`desktop-pet-install`,`desktop-pet-installed`],宠物:[`sec-desktop-pet`,`desktop-pet-settings`,`desktop-pet-install`,`desktop-pet-installed`],update:[`sec-updates`,`updates-main`,`updates-components`],更新:[`sec-updates`,`updates-main`,`updates-components`],network:[`sec-remote-access`,`sec-mobile-server`,`remote-access-main`],网络:[`sec-remote-access`,`sec-mobile-server`,`remote-access-main`],remote:[`sec-remote-access`,`sec-mobile-server`,`remote-access-main`],远程:[`sec-remote-access`,`sec-mobile-server`,`remote-access-main`],notification:[`sec-notifications`,`notifications-browser`,`notifications-templates`],通知:[`sec-notifications`,`notifications-browser`,`notifications-templates`],language:[`interface-language`],语言:[`interface-language`]},d=12;function f(e){return[n(e.titleKey,`zh-CN`).toLowerCase(),n(e.titleKey,`en-US`).toLowerCase()]}function p(e,t,{capabilities:o=a,mobileApp:s}={}){let p=e.trim().toLowerCase();if(!p)return[];let m=new Set(u[p]||[]);for(let e of p.split(/\s+/))for(let t of u[e]||[])m.add(t);let h=[];for(let e of l){if(!i(o,e.section)||e.id===`models-visual`&&!r(o,`visualGeneration`)||s!==void 0&&(e.section===`mobile-server`&&!s||e.section===`remote-access`&&s)||typeof window<`u`&&(e.id===`remote-workspaces`&&!window.pisperDesktop?.remoteWorkspaces||e.id===`remote-access-main`&&window.__PISPER_REMOTE_WORKSPACE__))continue;let[t,n]=f(e),a=0;m.has(e.id)?a=100:t===p||n===p?a=90:t.startsWith(p)||n.startsWith(p)?a=80:t.includes(p)||n.includes(p)?a=65:(e.keywords||[]).some(e=>{let t=e.toLowerCase();return t.includes(p)?p.length>=2||/[\u4e00-\u9fff]/.test(p):/[\u4e00-\u9fff]/.test(t)&&t.includes(p)})&&(a=40),a>0&&h.push({entry:e,score:a})}h.sort((e,t)=>t.score-e.score);let g=new Set,_=[];for(let{entry:e}of h){let r={entry:e,title:n(e.titleKey,t),sectionTitle:n(e.sectionTitleKey||c[e.section],t)},i=`${e.section}|${r.title}`;if(!g.has(i)&&(g.add(i),_.push(r),_.length>=d))break}return _}var m=`pisper:config-card-highlight`,h=null,g=0,_=new Set;function v(){for(let e of _)e()}function y(e){return _.add(e),()=>{_.delete(e)}}function b(e,t,n={}){h={card:e,section:t,...n,targetId:n.targetId||e,navigationKey:++g},v(),window.dispatchEvent(new Event(m))}function x(e){let t=(0,o.useSyncExternalStore)(y,()=>h,()=>null);return(0,o.useEffect)(()=>{if(!t||t.section!==e)return;let n=0,r=()=>{cancelAnimationFrame(n),n=requestAnimationFrame(()=>{if(h?.navigationKey!==t.navigationKey)return;let e=Array.from(document.querySelectorAll(`[data-config-target], [data-config-card]`)).find(e=>e.dataset.configTarget===t.targetId||e.dataset.configCard===t.targetId);if(!e||!e.getClientRects().length)return;let n=e.querySelector(`input:not([disabled]), button:not([disabled]), select:not([disabled]), [tabindex="0"]`)||e;!n.hasAttribute(`tabindex`)&&n===e&&(n.tabIndex=-1),n.focus({preventScroll:!0}),e.scrollIntoView({block:`center`}),i.disconnect(),h=null,v()})},i=new MutationObserver(r);return i.observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[`hidden`,`style`,`data-state`]}),r(),()=>{cancelAnimationFrame(n),i.disconnect()}},[t,e]),t?.section===e?t:null}export{x as i,b as n,p as r,s as t};
|
|
1
|
+
import{a as e}from"./rolldown-runtime-B0Z9INg1.js";import{i as t}from"./vendor-react-DwNgTV1j.js";import{d as n}from"./i18n-D80GstlU.js";import{i as r,r as i,t as a}from"./runtime-capabilities-B7qveLBm.js";var o=e(t(),1),s=`section`,c={models:`config:configPage.models`,notifications:`config:configPage.notifications`,interface:`config:configPage.interface`,shortcuts:`config:configPage.shortcuts`,"desktop-pet":`config:configPage.desktopPet`,updates:`config:configPage.appUpdates`,labs:`config:configPage.labs`,about:`config:configPage.about`,"remote-access":`config:configPage.remoteAccess`,"mobile-server":`config:configPage.mobileServer`},l=[{id:`sec-models`,section:`models`,card:s,titleKey:`config:configPage.models`,keywords:[`model`,`provider`,`llm`,`api`,`模型`,`供应商`,`大模型`]},{id:`sec-notifications`,section:`notifications`,card:s,titleKey:`config:configPage.notifications`,keywords:[`notification`,`push`,`alert`,`通知`,`推送`,`提醒`]},{id:`sec-interface`,section:`interface`,card:s,titleKey:`config:configPage.interface`,keywords:[`interface`,`theme`,`appearance`,`display`,`界面`,`主题`,`外观`,`显示`]},{id:`sec-shortcuts`,section:`shortcuts`,card:s,titleKey:`config:configPage.shortcuts`,keywords:[`keyboard`,`shortcut`,`hotkey`,`keybinding`,`voice`,`push to talk`,`快捷键`,`按键`,`键盘`,`语音`,`长按`]},{id:`sec-desktop-pet`,section:`desktop-pet`,card:s,titleKey:`config:configPage.desktopPet`,keywords:[`pet`,`petdex`,`宠物`,`桌宠`]},{id:`sec-updates`,section:`updates`,card:s,titleKey:`config:configPage.appUpdates`,keywords:[`update`,`upgrade`,`version`,`更新`,`升级`,`版本`]},{id:`sec-labs`,section:`labs`,card:s,titleKey:`config:configPage.labs`,keywords:[`labs`,`beta`,`experimental`,`preview`,`实验`,`测试版`,`尝鲜`,`内测`]},{id:`sec-about`,section:`about`,card:s,titleKey:`config:configPage.about`,keywords:[`about`,`info`,`license`,`关于`,`信息`,`许可`]},{id:`sec-remote-access`,section:`remote-access`,card:s,titleKey:`config:configPage.remoteAccess`,keywords:[`remote`,`network`,`phone`,`远程`,`网络`,`手机`]},{id:`sec-mobile-server`,section:`mobile-server`,card:s,titleKey:`config:configPage.mobileServer`,keywords:[`server`,`remote`,`network`,`服务器`,`远程`,`网络`]},{id:`models-current-model`,section:`models`,card:`models-current-model`,targetId:`models-connections`,titleKey:`config:configPage.currentChatModel`,keywords:[`model`,`provider`,`quick setup`,`模型`,`供应商`,`快速配置`,`对话模型`]},{id:`models-connections`,section:`models`,card:`models-connections`,titleKey:`config:configPage.manageConnections`,keywords:[`provider`,`connection`,`api key`,`import`,`连接`,`供应商`,`导入`,`密钥`]},{id:`models-runtime-policy`,section:`models`,card:`models-current-model`,targetId:`models-runtime-policy`,titleKey:`config:configPage.agentRuntimePolicy`,keywords:[`runtime`,`agent`,`policy`,`thinking`,`tools`,`运行策略`,`运行时`,`执行策略`,`思考强度`,`可用工具`]},{id:`models-fallback`,section:`models`,card:`models-current-model`,targetId:`models-runtime-policy`,titleKey:`config:providerWorkbench.fallbackModels`,keywords:[`fallback`,`backup`,`failover`,`quota`,`备用模型`,`备选`,`额度`,`切换模型`]},{id:`models-auxiliary`,section:`models`,card:`models-current-model`,targetId:`models-runtime-policy`,titleKey:`config:providerWorkbench.auxiliaryModel`,keywords:[`auxiliary`,`helper model`,`title`,`compaction`,`summary`,`辅助模型`,`标题`,`压缩`,`摘要`,`记忆`]},{id:`models-subagents`,section:`models`,card:`models-subagents`,targetId:`models-subagents`,titleKey:`config:subagents.title`,keywords:[`subagent`,`agent definition`,`tier`,`fast`,`strong`,`子代理`,`子 Agent`,`档位`,`便宜模型`,`.pisper/agents`]},{id:`models-permission-rules`,section:`models`,card:`models-permission-rules`,targetId:`models-permission-rules`,titleKey:`config:permissionRules.title`,keywords:[`permission`,`allow`,`deny`,`approval`,`rule`,`权限`,`审批`,`允许`,`禁止`,`规则`]},{id:`models-visual`,section:`models`,card:`models-visual`,targetId:`models-visual`,expandGroup:`models-advanced`,titleKey:`config:configPage.currentVisualModel`,keywords:[`image`,`video`,`visual`,`图片`,`图像`,`视频`,`视觉`,`生图`]},{id:`notifications-browser`,section:`notifications`,card:`notifications-browser`,titleKey:`config:notificationSettings.notification`,keywords:[`browser`,`system`,`push`,`浏览器通知`,`系统通知`,`推送`]},{id:`notifications-templates`,section:`notifications`,card:`notifications-templates`,titleKey:`config:notificationSettings.notificationTemplates`,keywords:[`template`,`模板`,`通知模板`]},{id:`interface-custom-ui`,section:`interface`,card:`interface-custom-ui`,titleKey:`navigation:shell.components`,sectionTitleKey:`custom-ui:moved.title`,keywords:[`custom ui`,`standalone widgets`,`component`,`native`,`manifest`,`独立组件`,`自定义组件`,`组件`]},{id:`interface-appearance`,section:`interface`,card:`interface-appearance`,titleKey:`config:interfaceSettings.appearance`,keywords:[`theme`,`dark`,`light`,`accent`,`主题`,`深色`,`浅色`,`强调色`,`外观`]},{id:`interface-style`,section:`interface`,card:`interface-style`,expandGroup:`interface-advanced`,titleKey:`config:interfaceSettings.interfaceStyle`,keywords:[`font`,`corner`,`radius`,`字体`,`字号`,`圆角`]},{id:`interface-motion`,section:`interface`,card:`interface-motion`,expandGroup:`interface-advanced`,titleKey:`config:interfaceSettings.displayAndMotion`,keywords:[`motion`,`density`,`animation`,`动效`,`动画`,`密度`,`显示`]},{id:`interface-language`,section:`interface`,card:`interface-language`,titleKey:`config:languageSettings.displayLanguage`,keywords:[`language`,`chinese`,`english`,`语言`,`中文`,`英文`,`英语`]},{id:`desktop-pet-settings`,section:`desktop-pet`,card:`desktop-pet-settings`,titleKey:`config:desktopPetSettings.title`,keywords:[`pet`,`宠物`,`桌宠`,`宠物设置`]},{id:`desktop-pet-install`,section:`desktop-pet`,card:`desktop-pet-install`,titleKey:`config:desktopPetSettings.installTitle`,keywords:[`petdex`,`install`,`宠物安装`,`添加宠物`]},{id:`desktop-pet-installed`,section:`desktop-pet`,card:`desktop-pet-installed`,titleKey:`config:desktopPetSettings.installedTitle`,keywords:[`installed`,`已安装`,`宠物列表`]},{id:`mobile-server-main`,section:`mobile-server`,card:`mobile-server-main`,titleKey:`config:mobileServer.title`,keywords:[`server`,`remote`,`服务器`,`远程`,`手机访问`]},{id:`mobile-server-local`,section:`mobile-server`,card:`mobile-server-local`,titleKey:`config:mobileServer.localTitle`,keywords:[`local`,`on-device`,`本机`,`本地运行`]},{id:`remote-workspaces`,section:`remote-access`,card:`remote-workspaces`,titleKey:`config:remoteWorkspace.title`,keywords:[`linux`,`remote workspace`,`服务器`,`远程工作区`]},{id:`remote-access-main`,section:`remote-access`,card:`remote-access-main`,titleKey:`config:remoteAccess.title`,keywords:[`remote`,`network`,`phone`,`远程`,`网络`,`手机`]},{id:`remote-access-pairing`,section:`remote-access`,card:`remote-access-pairing`,titleKey:`config:remoteAccess.pairing`,keywords:[`pairing`,`qr`,`配对`,`二维码`]},{id:`remote-access-devices`,section:`remote-access`,card:`remote-access-devices`,titleKey:`config:remoteAccess.devices`,keywords:[`device`,`paired`,`设备`,`已配对`,`授权`]},{id:`updates-main`,section:`updates`,card:`updates-main`,titleKey:`config:updateSettings.pisperAppUpdates`,keywords:[`update`,`version`,`channel`,`更新`,`版本`,`升级`,`渠道`]},{id:`updates-components`,section:`updates`,card:`updates-components`,titleKey:`config:updateSettings.appComponents`,keywords:[`component`,`runtime`,`sidecar`,`组件`,`运行时`]},{id:`updates-cli`,section:`updates`,card:`updates-cli`,titleKey:`config:cliSettings.title`,keywords:[`cli`,`terminal`,`command`,`命令行`,`终端`,`命令`]},{id:`about-project`,section:`about`,card:`about-project`,titleKey:`config:aboutSettings.projectInformation`,keywords:[`project`,`version`,`license`,`项目`,`版本`,`许可`]},{id:`about-support`,section:`about`,card:`about-support`,titleKey:`config:aboutSettings.supportPisper`,keywords:[`support`,`donate`,`sponsor`,`支持`,`捐赠`,`赞助`]}],u={provider:[`sec-models`,`models-current-model`,`models-connections`],供应商:[`sec-models`,`models-current-model`,`models-connections`],model:[`sec-models`,`models-current-model`,`models-connections`],模型:[`sec-models`,`models-current-model`,`models-connections`],theme:[`sec-interface`,`interface-appearance`],主题:[`sec-interface`,`interface-appearance`],interface:[`sec-interface`,`interface-appearance`],界面:[`sec-interface`,`interface-appearance`,`interface-language`],diy:[`interface-custom-ui`],components:[`interface-custom-ui`],widgets:[`interface-custom-ui`],组件:[`interface-custom-ui`],pet:[`sec-desktop-pet`,`desktop-pet-settings`,`desktop-pet-install`,`desktop-pet-installed`],宠物:[`sec-desktop-pet`,`desktop-pet-settings`,`desktop-pet-install`,`desktop-pet-installed`],update:[`sec-updates`,`updates-main`,`updates-components`],更新:[`sec-updates`,`updates-main`,`updates-components`],network:[`sec-remote-access`,`sec-mobile-server`,`remote-access-main`],网络:[`sec-remote-access`,`sec-mobile-server`,`remote-access-main`],remote:[`sec-remote-access`,`sec-mobile-server`,`remote-access-main`],远程:[`sec-remote-access`,`sec-mobile-server`,`remote-access-main`],notification:[`sec-notifications`,`notifications-browser`,`notifications-templates`],通知:[`sec-notifications`,`notifications-browser`,`notifications-templates`],language:[`interface-language`],语言:[`interface-language`]},d=12;function f(e){return[n(e.titleKey,`zh-CN`).toLowerCase(),n(e.titleKey,`en-US`).toLowerCase()]}function p(e,t,{capabilities:o=a,mobileApp:s}={}){let p=e.trim().toLowerCase();if(!p)return[];let m=new Set(u[p]||[]);for(let e of p.split(/\s+/))for(let t of u[e]||[])m.add(t);let h=[];for(let e of l){if(!i(o,e.section)||e.id===`models-visual`&&!r(o,`visualGeneration`)||s!==void 0&&(e.section===`mobile-server`&&!s||e.section===`remote-access`&&s)||typeof window<`u`&&(e.id===`remote-workspaces`&&!window.pisperDesktop?.remoteWorkspaces||e.id===`remote-access-main`&&window.__PISPER_REMOTE_WORKSPACE__))continue;let[t,n]=f(e),a=0;m.has(e.id)?a=100:t===p||n===p?a=90:t.startsWith(p)||n.startsWith(p)?a=80:t.includes(p)||n.includes(p)?a=65:(e.keywords||[]).some(e=>{let t=e.toLowerCase();return t.includes(p)?p.length>=2||/[\u4e00-\u9fff]/.test(p):/[\u4e00-\u9fff]/.test(t)&&t.includes(p)})&&(a=40),a>0&&h.push({entry:e,score:a})}h.sort((e,t)=>t.score-e.score);let g=new Set,_=[];for(let{entry:e}of h){let r={entry:e,title:n(e.titleKey,t),sectionTitle:n(e.sectionTitleKey||c[e.section],t)},i=`${e.section}|${r.title}`;if(!g.has(i)&&(g.add(i),_.push(r),_.length>=d))break}return _}var m=`pisper:config-card-highlight`,h=null,g=0,_=new Set;function v(){for(let e of _)e()}function y(e){return _.add(e),()=>{_.delete(e)}}function b(e,t,n={}){h={card:e,section:t,...n,targetId:n.targetId||e,navigationKey:++g},v(),window.dispatchEvent(new Event(m))}function x(e){let t=(0,o.useSyncExternalStore)(y,()=>h,()=>null);return(0,o.useEffect)(()=>{if(!t||t.section!==e)return;let n=0,r=()=>{cancelAnimationFrame(n),n=requestAnimationFrame(()=>{if(h?.navigationKey!==t.navigationKey)return;let e=Array.from(document.querySelectorAll(`[data-config-target], [data-config-card]`)).find(e=>e.dataset.configTarget===t.targetId||e.dataset.configCard===t.targetId);if(!e||!e.getClientRects().length)return;let n=e.querySelector(`input:not([disabled]), button:not([disabled]), select:not([disabled]), [tabindex="0"]`)||e;!n.hasAttribute(`tabindex`)&&n===e&&(n.tabIndex=-1),n.focus({preventScroll:!0}),e.scrollIntoView({block:`center`}),i.disconnect(),h=null,v()})},i=new MutationObserver(r);return i.observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[`hidden`,`style`,`data-state`]}),r(),()=>{cancelAnimationFrame(n),i.disconnect()}},[t,e]),t?.section===e?t:null}export{x as i,b as n,p as r,s as t};
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import{t as e}from"./event-stream-Dh7h5sXJ.js";import{i as t,r as n,t as r}from"./session-web-preview-guvsmkWE.js";import{i}from"./web-preview-C7DdG9JP.js";import{t as a}from"./useNativeBrowser-C0j3zafh.js";var o=`pisper-agent-overlay`,s=28,c=`124, 92, 255`,l=`a,button,input,textarea,select,summary,label,[role="button"],[role="link"],[role="tab"],[role="menuitem"],[contenteditable="true"]`,u=`
|
|
2
|
+
const done = (value) => JSON.stringify({ ok: true, ...value });
|
|
3
|
+
const pageInfo = () => ({ url: location.href, title: document.title });
|
|
4
|
+
const isVisible = (element) => {
|
|
5
|
+
const style = getComputedStyle(element);
|
|
6
|
+
const rect = element.getBoundingClientRect();
|
|
7
|
+
return style.visibility !== 'hidden' && style.display !== 'none' && rect.width > 0 && rect.height > 0;
|
|
8
|
+
};
|
|
9
|
+
const labelOf = (element) => String(element.innerText || element.value || element.getAttribute('aria-label') || element.getAttribute('placeholder') || '').replace(/\\s+/g, ' ').trim();
|
|
10
|
+
const find = (selector) => {
|
|
11
|
+
if (selector.startsWith('text=')) {
|
|
12
|
+
const wanted = selector.slice(5).replace(/^["']|["']$/g, '').trim().toLowerCase();
|
|
13
|
+
const candidates = [...document.querySelectorAll(${JSON.stringify(l)})].filter(isVisible);
|
|
14
|
+
return candidates.find((element) => labelOf(element).toLowerCase() === wanted) || candidates.find((element) => labelOf(element).toLowerCase().includes(wanted)) || null;
|
|
15
|
+
}
|
|
16
|
+
const matches = [...document.querySelectorAll(selector)];
|
|
17
|
+
return matches.find(isVisible) || matches[0] || null;
|
|
18
|
+
};
|
|
19
|
+
const center = (element) => {
|
|
20
|
+
const rect = element.getBoundingClientRect();
|
|
21
|
+
return { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 };
|
|
22
|
+
};
|
|
23
|
+
const overlayRoot = () => document.getElementById(${JSON.stringify(o)})?.shadowRoot || null;
|
|
24
|
+
`;function d(e,t){return`(() => { try { const args = ${JSON.stringify(e)}; ${u} ${t} } catch (error) { return JSON.stringify({ ok: false, error: String(error && error.message || error) }); } })()`}function f(){return d({},`return done({ ready: document.readyState !== 'loading', ...pageInfo() });`)}function p({maxElements:e,maxText:t}){return d({maxElements:e,maxText:t},`
|
|
25
|
+
const unique = (selector) => { try { return document.querySelectorAll(selector).length === 1 } catch { return false } };
|
|
26
|
+
const selectorFor = (element) => {
|
|
27
|
+
const tag = element.tagName.toLowerCase();
|
|
28
|
+
const candidates = [
|
|
29
|
+
element.id && '#' + CSS.escape(element.id),
|
|
30
|
+
element.getAttribute('data-testid') && '[data-testid=' + JSON.stringify(element.getAttribute('data-testid')) + ']',
|
|
31
|
+
element.getAttribute('name') && tag + '[name=' + JSON.stringify(element.getAttribute('name')) + ']',
|
|
32
|
+
element.getAttribute('aria-label') && tag + '[aria-label=' + JSON.stringify(element.getAttribute('aria-label')) + ']',
|
|
33
|
+
].filter(Boolean);
|
|
34
|
+
const direct = candidates.find(unique);
|
|
35
|
+
if (direct) return direct;
|
|
36
|
+
// 没有能唯一定位的属性就用层级路径,否则模型拿到的 "button" 只会点到第一个。
|
|
37
|
+
const path = [];
|
|
38
|
+
for (let node = element; node && node.nodeType === 1 && node !== document.documentElement; node = node.parentElement) {
|
|
39
|
+
if (node.id && unique('#' + CSS.escape(node.id))) { path.unshift('#' + CSS.escape(node.id)); break; }
|
|
40
|
+
const sameTag = node.parentElement ? [...node.parentElement.children].filter((child) => child.tagName === node.tagName) : [node];
|
|
41
|
+
const name = node.tagName.toLowerCase();
|
|
42
|
+
path.unshift(sameTag.length > 1 ? name + ':nth-of-type(' + (sameTag.indexOf(node) + 1) + ')' : name);
|
|
43
|
+
}
|
|
44
|
+
return path.join(' > ');
|
|
45
|
+
};
|
|
46
|
+
const elements = [...document.querySelectorAll(${JSON.stringify(l)})].filter(isVisible).slice(0, args.maxElements).map((element) => ({
|
|
47
|
+
selector: selectorFor(element),
|
|
48
|
+
tag: element.tagName.toLowerCase(),
|
|
49
|
+
role: element.getAttribute('role') || '',
|
|
50
|
+
text: labelOf(element).slice(0, 240),
|
|
51
|
+
href: element.href || '',
|
|
52
|
+
type: element.getAttribute('type') || '',
|
|
53
|
+
disabled: Boolean(element.disabled),
|
|
54
|
+
}));
|
|
55
|
+
return done({ ...pageInfo(), text: String(document.body && document.body.innerText || '').slice(0, args.maxText), elements });
|
|
56
|
+
`)}function m(e){return d({selector:e},`
|
|
57
|
+
const element = find(args.selector);
|
|
58
|
+
if (!element || !isVisible(element)) return done({ found: false });
|
|
59
|
+
element.scrollIntoView({ block: 'center', inline: 'center', behavior: 'instant' });
|
|
60
|
+
return done({ found: true, ...center(element) });
|
|
61
|
+
`)}function h(e){return d({selector:e},`
|
|
62
|
+
const element = find(args.selector);
|
|
63
|
+
if (!element) throw new Error('No element matches ' + args.selector);
|
|
64
|
+
const point = center(element);
|
|
65
|
+
const hit = document.elementFromPoint(point.x, point.y);
|
|
66
|
+
const target = hit && (element.contains(hit) || hit.contains(element)) ? hit : element;
|
|
67
|
+
const init = { bubbles: true, cancelable: true, composed: true, view: window, clientX: point.x, clientY: point.y, button: 0 };
|
|
68
|
+
const press = { ...init, buttons: 1 };
|
|
69
|
+
target.dispatchEvent(new PointerEvent('pointerover', init));
|
|
70
|
+
target.dispatchEvent(new MouseEvent('mouseover', init));
|
|
71
|
+
target.dispatchEvent(new PointerEvent('pointermove', init));
|
|
72
|
+
target.dispatchEvent(new MouseEvent('mousemove', init));
|
|
73
|
+
target.dispatchEvent(new PointerEvent('pointerdown', press));
|
|
74
|
+
target.dispatchEvent(new MouseEvent('mousedown', press));
|
|
75
|
+
if (typeof element.focus === 'function') element.focus({ preventScroll: true });
|
|
76
|
+
target.dispatchEvent(new PointerEvent('pointerup', init));
|
|
77
|
+
target.dispatchEvent(new MouseEvent('mouseup', init));
|
|
78
|
+
target.dispatchEvent(new MouseEvent('click', init));
|
|
79
|
+
return done({ ...pageInfo() });
|
|
80
|
+
`)}function g(e,t,n){return d({selector:e,text:t,submit:n},`
|
|
81
|
+
const element = find(args.selector);
|
|
82
|
+
if (!element) throw new Error('No element matches ' + args.selector);
|
|
83
|
+
if (element.disabled || element.readOnly) throw new Error('The element is not editable: ' + args.selector);
|
|
84
|
+
element.focus({ preventScroll: true });
|
|
85
|
+
const notify = (name) => element.dispatchEvent(new Event(name, { bubbles: true, composed: true }));
|
|
86
|
+
if (element.tagName === 'SELECT') {
|
|
87
|
+
const wanted = args.text.trim().toLowerCase();
|
|
88
|
+
const option = [...element.options].find((item) => item.value.toLowerCase() === wanted || item.text.trim().toLowerCase() === wanted);
|
|
89
|
+
if (!option) throw new Error('No option matches ' + args.text);
|
|
90
|
+
element.value = option.value;
|
|
91
|
+
notify('input');
|
|
92
|
+
notify('change');
|
|
93
|
+
} else if (element.tagName === 'INPUT' || element.tagName === 'TEXTAREA') {
|
|
94
|
+
// insertText 走的是浏览器的编辑流程,React 这类受控输入框能感知到;不行再用原生 setter。
|
|
95
|
+
if (typeof element.select === 'function') element.select();
|
|
96
|
+
let inserted = false;
|
|
97
|
+
try { inserted = args.text ? document.execCommand('insertText', false, args.text) : false; } catch {}
|
|
98
|
+
if (!inserted || element.value !== args.text) {
|
|
99
|
+
const prototype = element.tagName === 'TEXTAREA' ? HTMLTextAreaElement.prototype : HTMLInputElement.prototype;
|
|
100
|
+
Object.getOwnPropertyDescriptor(prototype, 'value').set.call(element, args.text);
|
|
101
|
+
notify('input');
|
|
102
|
+
}
|
|
103
|
+
notify('change');
|
|
104
|
+
} else if (element.isContentEditable) {
|
|
105
|
+
const selection = getSelection();
|
|
106
|
+
const range = document.createRange();
|
|
107
|
+
range.selectNodeContents(element);
|
|
108
|
+
selection.removeAllRanges();
|
|
109
|
+
selection.addRange(range);
|
|
110
|
+
if (!document.execCommand('insertText', false, args.text)) {
|
|
111
|
+
element.textContent = args.text;
|
|
112
|
+
notify('input');
|
|
113
|
+
}
|
|
114
|
+
} else {
|
|
115
|
+
throw new Error('The element is not editable: ' + args.selector);
|
|
116
|
+
}
|
|
117
|
+
if (args.submit) {
|
|
118
|
+
const key = { key: 'Enter', code: 'Enter', keyCode: 13, which: 13, bubbles: true, cancelable: true, composed: true };
|
|
119
|
+
const allowed = element.dispatchEvent(new KeyboardEvent('keydown', key));
|
|
120
|
+
element.dispatchEvent(new KeyboardEvent('keypress', key));
|
|
121
|
+
element.dispatchEvent(new KeyboardEvent('keyup', key));
|
|
122
|
+
if (allowed && element.form && typeof element.form.requestSubmit === 'function') element.form.requestSubmit();
|
|
123
|
+
}
|
|
124
|
+
return done({ ...pageInfo() });
|
|
125
|
+
`)}function _({x:e,y:t,label:n}){return d({x:e,y:t,label:n,size:s,accent:c},`
|
|
126
|
+
if (document.getElementById(${JSON.stringify(o)})) return done({ created: false });
|
|
127
|
+
const parent = document.documentElement;
|
|
128
|
+
if (!parent) return done({ created: false });
|
|
129
|
+
const host = document.createElement('div');
|
|
130
|
+
host.id = ${JSON.stringify(o)};
|
|
131
|
+
host.setAttribute('aria-hidden', 'true');
|
|
132
|
+
host.style.cssText = 'all: initial !important; position: fixed !important; inset: 0 !important; z-index: 2147483647 !important; pointer-events: none !important; display: block !important;';
|
|
133
|
+
const root = host.attachShadow({ mode: 'open' });
|
|
134
|
+
const calm = matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
135
|
+
const accent = (alpha) => 'rgba(' + args.accent + ', ' + alpha + ')';
|
|
136
|
+
const box = (id, styles) => { const element = document.createElement('div'); element.id = id; Object.assign(element.style, { position: 'absolute', pointerEvents: 'none' }, styles); root.append(element); return element; };
|
|
137
|
+
|
|
138
|
+
const glow = box('glow', { inset: '0', boxShadow: 'inset 0 0 0 2px ' + accent(0.85) + ', inset 0 0 44px 6px ' + accent(0.32) });
|
|
139
|
+
const enter = host.animate([{ opacity: 0 }, { opacity: 1 }], { duration: 240, easing: 'ease-out' });
|
|
140
|
+
if (!calm) glow.animate([{ opacity: 1 }, { opacity: 0.45 }], { duration: 1400, direction: 'alternate', iterations: Infinity, easing: 'ease-in-out' });
|
|
141
|
+
|
|
142
|
+
const tag = box('tag', { left: '50%', bottom: '16px', transform: 'translateX(-50%)', padding: '5px 12px', borderRadius: '999px', font: '500 12px/1.4 -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif', color: '#fff', background: accent(0.92), boxShadow: '0 4px 16px ' + accent(0.4), whiteSpace: 'nowrap' });
|
|
143
|
+
tag.textContent = args.label;
|
|
144
|
+
|
|
145
|
+
const cursor = box('cursor', { left: '0', top: '0', width: args.size + 'px', height: args.size + 'px', transform: 'translate(' + args.x + 'px, ' + args.y + 'px)', filter: 'drop-shadow(0 2px 6px rgba(0, 0, 0, 0.35))' });
|
|
146
|
+
const halo = document.createElement('div');
|
|
147
|
+
Object.assign(halo.style, { position: 'absolute', left: '-10px', top: '-10px', width: '20px', height: '20px', borderRadius: '50%', background: accent(0.35) });
|
|
148
|
+
cursor.append(halo);
|
|
149
|
+
if (!calm) halo.animate([{ transform: 'scale(0.8)', opacity: 0.9 }, { transform: 'scale(1.5)', opacity: 0.25 }], { duration: 1100, direction: 'alternate', iterations: Infinity, easing: 'ease-in-out' });
|
|
150
|
+
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
|
|
151
|
+
svg.setAttribute('viewBox', '0 0 24 24');
|
|
152
|
+
svg.setAttribute('width', String(args.size));
|
|
153
|
+
svg.setAttribute('height', String(args.size));
|
|
154
|
+
svg.style.position = 'absolute';
|
|
155
|
+
svg.style.overflow = 'visible';
|
|
156
|
+
const arrow = document.createElementNS('http://www.w3.org/2000/svg', 'path');
|
|
157
|
+
arrow.setAttribute('d', 'M1 1 L1 18.5 L6 14 L9.4 21.5 L12.8 20 L9.4 12.8 L16 12.4 Z');
|
|
158
|
+
arrow.setAttribute('fill', 'rgb(' + args.accent + ')');
|
|
159
|
+
arrow.setAttribute('stroke', '#fff');
|
|
160
|
+
arrow.setAttribute('stroke-width', '1.6');
|
|
161
|
+
arrow.setAttribute('stroke-linejoin', 'round');
|
|
162
|
+
svg.append(arrow);
|
|
163
|
+
cursor.append(svg);
|
|
164
|
+
parent.append(host);
|
|
165
|
+
return done({ created: true });
|
|
166
|
+
`)}function v(e,t,n){return d({x:e,y:t,durationMs:n},`
|
|
167
|
+
const cursor = overlayRoot() && overlayRoot().getElementById('cursor');
|
|
168
|
+
if (!cursor) return done({});
|
|
169
|
+
const to = 'translate(' + args.x + 'px, ' + args.y + 'px)';
|
|
170
|
+
const from = getComputedStyle(cursor).transform;
|
|
171
|
+
cursor.style.transform = to;
|
|
172
|
+
if (!matchMedia('(prefers-reduced-motion: reduce)').matches) cursor.animate([{ transform: from }, { transform: to }], { duration: args.durationMs, easing: 'cubic-bezier(0.22, 0.8, 0.24, 1)' });
|
|
173
|
+
return done({});
|
|
174
|
+
`)}function y(e,t){return d({x:e,y:t,accent:c},`
|
|
175
|
+
const root = overlayRoot();
|
|
176
|
+
if (!root) return done({});
|
|
177
|
+
const ring = document.createElement('div');
|
|
178
|
+
Object.assign(ring.style, { position: 'absolute', left: (args.x - 16) + 'px', top: (args.y - 16) + 'px', width: '32px', height: '32px', borderRadius: '50%', border: '2px solid rgb(' + args.accent + ')', boxSizing: 'border-box', pointerEvents: 'none' });
|
|
179
|
+
root.append(ring);
|
|
180
|
+
ring.animate([{ transform: 'scale(0.4)', opacity: 1 }, { transform: 'scale(1.6)', opacity: 0 }], { duration: 420, easing: 'ease-out' }).onfinish = () => ring.remove();
|
|
181
|
+
return done({});
|
|
182
|
+
`)}function b(e){return d({visible:e},`
|
|
183
|
+
const host = document.getElementById(${JSON.stringify(o)});
|
|
184
|
+
if (host) host.style.setProperty('display', args.visible ? 'block' : 'none', 'important');
|
|
185
|
+
return done({});
|
|
186
|
+
`)}function x(){return d({},`
|
|
187
|
+
const host = document.getElementById(${JSON.stringify(o)});
|
|
188
|
+
if (!host) return done({});
|
|
189
|
+
host.animate([{ opacity: 1 }, { opacity: 0 }], { duration: 200, easing: 'ease-in' }).onfinish = () => host.remove();
|
|
190
|
+
return done({});
|
|
191
|
+
`)}function S(e){let t=e;for(let e=0;e<2&&typeof t==`string`;e++)try{t=JSON.parse(t)}catch{throw Error(`The page returned an unreadable result.`)}if(!t||typeof t!=`object`||Array.isArray(t))throw Error(`The page returned an unreadable result.`);let n=t;if(n.ok!==!0)throw Error(String(n.error||`The page script failed.`).slice(0,500));return n}var C=1e3,w=3e4;async function T(t,n,r,i){let a=C;for(;!n.aborted;){try{let i=await fetch(t,{signal:n});await e(i,(e,t)=>{a=C,r(e,t)})}catch{}if(i?.(),n.aborted)return;await new Promise(e=>setTimeout(e,a)),a=Math.min(w,a*2)}}function E(e,t,n){return fetch(`${e}/${encodeURIComponent(t)}`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(n)}).catch(()=>{})}var D=`/api/desktop-browser/host`,O=1e4,k=3e4,A=5e3,j=380,M=700,N=45e3,P=2e4,F=100,I={x:0,y:0,width:1280,height:800},L=e=>new Promise(t=>setTimeout(t,e));function R(e,t,n){let r,i=new Promise((e,i)=>{r=setTimeout(()=>i(Error(n)),t)});return Promise.race([e,i]).finally(()=>clearTimeout(r))}var z=e=>typeof e==`string`?e:``;function B(e){if(!e||typeof e!=`object`)return null;let t=e,n=z(t.requestId),r=z(t.sessionId),i=z(t.action);return!n||!r||!i?null:{requestId:n,sessionId:r,action:i,url:z(t.url),selector:z(t.selector),text:z(t.text),submit:t.submit===!0,waitMs:typeof t.waitMs==`number`?t.waitMs:0}}function V(e,o){let s=new Map,c=new Map,l=0,u=()=>n.getState(),d=(e,t)=>u().sessions[e]?.pages.find(e=>e.id===t),C=async(t,n)=>S(await R(e.evaluate(t,n),O,`The page did not respond in time.`)),w=e=>{e.overlayTimer&&clearInterval(e.overlayTimer),e.overlayTimer=null},T=e=>C(e.browserId,_({...e.cursor,label:o()})),B=e=>{e.lastCommandAt=Date.now(),!e.overlayTimer&&(e.overlayTimer=setInterval(()=>{if(Date.now()-e.lastCommandAt>N){w(e),C(e.browserId,x()).catch(()=>{});return}T(e).catch(()=>{})},M))},V=t=>{let n=s.get(t);if(!n)return;s.delete(t),w(n),C(n.browserId,x()).catch(()=>{});let r=d(t,n.pageId);r&&u().update(t,`browser`,{type:`browser`,id:r.id,agent:!1}),!a.has(n.browserId)&&(e.close(n.browserId).catch(()=>{}),r&&u().update(t,`browser`,{type:`resource`,id:r.id,resourceId:``}))},H=n.subscribe(n=>{for(let[r,i]of s){let a=n.sessions[r],o=a?.pages.find(e=>e.id===i.pageId);if(!o||o.resourceId!==i.browserId){s.delete(r),w(i),e.close(i.browserId).catch(()=>{});continue}let c=a&&t(a);c&&c.id!==i.pageId&&c.resourceId.startsWith(`native-popup-`)&&U(r,i,c.id,c.resourceId)}}),U=(t,n,r,i)=>{w(n),C(n.browserId,x()).catch(()=>{});let o=n.pageId;n.pageId=r;let s=n.browserId;n.browserId=i,u().update(t,`browser`,{type:`browser`,id:o,agent:!1}),u().update(t,`browser`,{type:`browser`,id:r,agent:!0}),a.has(s)||(e.close(s).catch(()=>{}),u().update(t,`browser`,{type:`resource`,id:o,resourceId:``})),a.has(i)||e.adopt(i,W(t,r)).catch(()=>{}),B(n)},W=(e,t)=>n=>{n.type===`newWindow`?r(e,n.url,n.browserId):n.type===`title`?u().update(e,`browser`,{type:`browser`,id:t,title:n.title}):n.type===`closed`?u().update(e,`browser`,{type:`close`,id:t}):u().update(e,`browser`,{type:`browser`,id:t,url:n.url,draft:n.url})},G=(e,t,n)=>{let r=z(n.url),i=d(e,t.pageId);!i||!r||(a.get(t.browserId)?.noteUrl(r),u().update(e,`browser`,{type:`browser`,id:i.id,url:r,...i.draft===i.url?{draft:r}:{},title:z(n.title)||i.title}))},K=async(e,t)=>{let n=Date.now();for(await L(200);;){let r=await C(e,f()).catch(()=>null),i=Date.now()-n;if(r?.ready===!0&&(r.url!==t||i>1500))return r;if(i>k){if(r)return r;throw Error(`The page did not finish loading in time.`)}await L(200)}},q=async(n,r)=>{let i=s.get(n);if(i&&d(n,i.pageId)){let t=await C(i.browserId,f()).catch(()=>null);return a.get(i.browserId)?.noteUrl(r),await e.navigate(i.browserId,r),u().update(n,`browser`,{type:`select`,id:i.pageId}),u().update(n,`browser`,{type:`browser`,id:i.pageId,url:r,draft:r}),{tab:i,previousUrl:z(t?.url)}}let o=`agent-browser-${++l}`,c=u().sessions[n],p=c&&t(c),m=p&&!p.url&&!p.resourceId?p:null;if(!m&&(c?.pages.length??0)>=12)throw Error(`Too many pages are open in this session. Ask the user to close one.`);let h={current:``};if((await e.open({browserId:o,url:r,bounds:I},e=>{h.current&&W(n,h.current)(e)})).status!==`opened`)throw Error(`The desktop browser is not available.`);let g=m?.id??``;if(m)u().update(n,`browser`,{type:`select`,id:m.id});else{let r=u().update(n,`browser`,{type:`open`,kind:`browser`,resourceId:o}),i=u().sessions[n];if(g=r!==`limit`&&i&&t(i)?.id||``,!g)throw e.close(o).catch(()=>{}),Error(`Too many pages are open in this session. Ask the user to close one.`)}h.current=g,u().update(n,`browser`,{type:`browser`,id:g,url:r,draft:r,agent:!0}),u().update(n,`browser`,{type:`resource`,id:g,resourceId:o});let _={pageId:g,browserId:o,cursor:{x:48,y:48},lastCommandAt:Date.now(),overlayTimer:null};return s.set(n,_),{tab:_,previousUrl:``}},J=e=>{let t=s.get(e);if(!t||!d(e,t.pageId))throw Error(`No page is open. Use the open action first.`);return t},Y=async(e,t)=>{let n=Date.now();for(;;){let r=await C(e.browserId,m(t));if(r.found===!0){let t={x:Number(r.x)||0,y:Number(r.y)||0};return await T(e).catch(()=>{}),await C(e.browserId,v(t.x,t.y,j)).catch(()=>{}),e.cursor=t,await L(j),t}if(Date.now()-n>A)throw Error(`No visible element matches ${t}. Inspect the page again.`);await L(200)}},X=async(e,t)=>(await L(Math.min(15e3,Math.max(250,t))),await C(e.browserId,f()).catch(()=>null)??{}),Z=async t=>{let{sessionId:n,action:r}=t;if(r===`open`){let e=i(t.url??``,window.location.href);if(!e)throw Error(`Browser automation only supports http and https URLs.`);let{tab:r,previousUrl:a}=await q(n,e.href);B(r);let o=await K(r.browserId,a);return await T(r).catch(()=>{}),t.waitMs&&await L(Math.min(15e3,t.waitMs)),G(n,r,o),o}if(r===`close`)return V(n),{};let a=J(n);if(B(a),await T(a).catch(()=>{}),r===`inspect`){let e=await C(a.browserId,p({maxElements:F,maxText:P}));return G(n,a,e),e}if(r===`click`){let e=t.selector??``,r=await Y(a,e);await C(a.browserId,y(r.x,r.y)).catch(()=>{}),await C(a.browserId,h(e));let i=await X(a,t.waitMs??0);return G(n,a,i),i}if(r===`type`){let e=t.selector??``;await Y(a,e),await C(a.browserId,g(e,t.text??``,t.submit===!0));let r=await X(a,t.waitMs??0);return G(n,a,r),r}if(r===`wait`){let e=Math.min(15e3,Math.max(0,t.waitMs||1e3));await L(e);let r=await C(a.browserId,f());return G(n,a,r),{...r,waitMs:e}}if(r===`screenshot`){await C(a.browserId,b(!1)).catch(()=>{});try{await L(60);let t=await R(e.capture(a.browserId),O,`The screenshot did not finish in time.`);return{...await C(a.browserId,f()),imageBase64:t}}finally{await C(a.browserId,b(!0)).catch(()=>{})}}throw Error(`Unsupported browser action: ${r}`)};return{enqueue:e=>{let t=(c.get(e.sessionId)??Promise.resolve()).then(async()=>{try{await E(D,e.requestId,{ok:!0,result:await Z(e)})}catch(t){await E(D,e.requestId,{ok:!1,error:t instanceof Error?t.message:String(t)})}});c.set(e.sessionId,t),t.finally(()=>{c.get(e.sessionId)===t&&c.delete(e.sessionId)})},cancel:e=>{let t=s.get(e);t&&(w(t),C(t.browserId,x()).catch(()=>{}))},release:V,dispose(){H();for(let e of[...s.keys()])V(e)}}}async function H(e){let t=await window.pisperDesktop?.getAppInfo().then(e=>e.platform,()=>``);return t!==`darwin`&&t!==`win32`?!1:e.close(`agent-browser-probe`).then(()=>!0,()=>!1)}function U(e){let t=window.pisperDesktop?.browser;if(!t)return()=>{};let n=V(t,e),r=new AbortController;return H(t).then(e=>{if(!(!e||r.signal.aborted))return T(D,r.signal,(e,t)=>{if(e===`command`){let e=B(t);e&&n.enqueue(e);return}let r=z(t?.sessionId);e===`cancel`&&r&&n.cancel(r),e===`release`&&r&&n.release(r)})}),()=>{r.abort(),n.dispose()}}var W=`/api/desktop-computer/host`,G=450,K=15e3,q=e=>typeof e==`number`?e:NaN,J=e=>typeof e==`string`?e:``;function Y(e){let t=q(e.x),n=q(e.y);switch(e.action){case`move`:return{type:`move`,x:t,y:n};case`click`:return{type:`click`,x:t,y:n};case`double_click`:return{type:`click`,x:t,y:n,count:2};case`right_click`:return{type:`click`,x:t,y:n,button:`right`};case`drag`:return{type:`drag`,x:t,y:n,toX:q(e.toX),toY:q(e.toY)};case`scroll`:return{type:`scroll`,x:t,y:n,direction:J(e.direction)||`down`,amount:typeof e.amount==`number`?e.amount:void 0};case`type`:return{type:`type`,text:J(e.text)};case`key`:return{type:`key`,keys:J(e.keys)};default:return null}}function X(e){return e.status===`permission_required`?`macOS needs the ${e.missingPermissions.map(e=>e===`screen`?`Screen Recording`:`Accessibility`).join(` and `)} permission for Pisper. The system prompt has been opened. Ask the user to allow it in System Settings > Privacy & Security, restart Pisper if macOS asks, then try again.`:e.reason||`Computer use is not available on this system.`}function Z(e){let t=window.pisperDesktop?.computer;if(!t)return()=>{};let n=new AbortController,r=``,i=new Set,a=Promise.resolve(),o=()=>(r=``,t.end().catch(()=>{})),s=async n=>{let a=J(n.sessionId),s=J(n.action);if(s===`finish`)return r===a&&await o(),{};if(i.has(a))throw Error(`The user stopped computer use.`);if(r!==a){let n=await t.begin(a,e(),()=>{r=``,i.add(a),fetch(`/api/sessions/${encodeURIComponent(a)}/abort`,{method:`POST`,headers:{"Content-Type":`application/json`},body:`{}`}).catch(()=>{})});if(n.status!==`started`)throw Error(X(n));r=a}if(s===`screenshot`)return t.screenshot(0);if(s===`wait`){let e=q(n.waitMs);return t.screenshot(Number.isFinite(e)?Math.min(K,e):1e3)}let c=Y(n);if(!c)throw Error(`Unsupported computer action: ${s}`);return await t.act(c),t.screenshot(G)},c=e=>{let t=J(e.requestId);a=a.then(async()=>{try{let n=await s(e);await E(W,t,{ok:!0,result:n})}catch(e){await E(W,t,{ok:!1,error:e instanceof Error?e.message:String(e)})}})};return t.end().then(()=>T(W,n.signal,(e,t)=>{let n=t&&typeof t==`object`?t:{};if(e===`command`&&J(n.requestId))c(n);else if(e===`release`||e===`cancel`){let t=J(n.sessionId);e===`release`&&i.delete(t),t===r&&o()}},()=>{r&&o()}),()=>{}),()=>{n.abort(),r&&o()}}function Q(e){let t=[U(()=>e(`common:webPreview.agentOverlay`)),Z(()=>({title:e(`common:computerUse.title`),hint:window.pisperDesktop?.platform===`win32`?e(`common:computerUse.hintEsc`):e(`common:computerUse.hintButton`),stop:e(`common:computerUse.stop`)}))];return()=>{for(let e of t)e()}}export{Q as startDesktopHosts};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as e}from"./rolldown-runtime-B0Z9INg1.js";import{i as t,r as n}from"./vendor-react-DwNgTV1j.js";import{t as r}from"./use-i18n-
|
|
1
|
+
import{a as e}from"./rolldown-runtime-B0Z9INg1.js";import{i as t,r as n}from"./vendor-react-DwNgTV1j.js";import{t as r}from"./use-i18n-BVRhlQ1v.js";import{t as i}from"./x-07u4-129.js";import{a,c as o,i as s,n as c,o as l,r as u,s as d,t as f}from"./dist-BHkR6BLP.js";import{t as p}from"./utils-C8uzG5AZ.js";import{t as m}from"./button-CCcCN8tE.js";var h=e(t(),1),g=n(),_=h.createContext(!1),v=h.createContext(null);function y({busy:e=!1,open:t,defaultOpen:n=!1,onOpenChange:r,...i}){let[a,o]=h.useState(n);return(0,g.jsx)(_.Provider,{value:e,children:(0,g.jsx)(f,{"data-slot":`dialog`,open:t??a,onOpenChange:n=>{!n&&e||(t===void 0&&o(n),r?.(n))},...i})})}function b({...e}){return(0,g.jsx)(o,{"data-slot":`dialog-trigger`,...e})}function x({...e}){return(0,g.jsx)(l,{"data-slot":`dialog-portal`,...e})}function S({...e}){return(0,g.jsx)(c,{"data-slot":`dialog-close`,...e})}function C({className:e,...t}){return(0,g.jsx)(a,{"data-slot":`dialog-overlay`,className:p(`fixed inset-0 isolate z-50 bg-[var(--overlay-scrim)] duration-[var(--duration-fast,150ms)] data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0`,e),...t})}function w({className:e,overlayClassName:t,children:n,showCloseButton:a=!0,size:o=`default`,surface:s=`default`,scrollMode:l=`content`,ref:d,onEscapeKeyDown:f,onPointerDownOutside:y,onInteractOutside:b,...S}){let{t:w}=r(),T=h.useContext(_),[E,D]=h.useState(null),O=h.useCallback(e=>{if(D(e),typeof d==`function`)return d(e);d&&(d.current=e)},[d]);return(0,g.jsxs)(x,{children:[(0,g.jsx)(C,{className:t}),(0,g.jsx)(u,{...S,ref:O,"data-slot":`dialog-content`,"data-surface":s,"data-scroll-mode":l,"aria-busy":T||S[`aria-busy`]||void 0,onEscapeKeyDown:e=>{f?.(e),T&&e.preventDefault()},onPointerDownOutside:e=>{y?.(e),T&&e.preventDefault()},onInteractOutside:e=>{b?.(e),T&&e.preventDefault()},className:p(`fixed top-1/2 left-1/2 z-50 grid max-h-[calc(100vh-2rem)] supports-[height:100dvh]:max-h-[calc(100dvh-2rem)] w-full -translate-x-1/2 -translate-y-1/2 gap-4 overflow-y-auto overscroll-contain rounded-[var(--r-lg)] bg-popover p-4 text-sm text-popover-foreground shadow-float duration-[var(--duration-fast,150ms)] outline-none data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0`,o==="default"&&`max-w-[min(92vw,520px)]`,o===`compact`&&`max-w-[min(92vw,430px)]`,o===`wide`&&`max-w-[min(92vw,600px)]`,s===`confirmation`&&`border border-stroke`,l===`body`&&`flex flex-col overflow-hidden`,e),children:(0,g.jsxs)(v.Provider,{value:E,children:[n,a&&(0,g.jsx)(c,{"data-slot":`dialog-close`,asChild:!0,children:(0,g.jsxs)(m,{variant:`ghost`,className:`absolute top-2 right-2`,size:`icon-sm`,disabled:T,children:[(0,g.jsx)(i,{}),(0,g.jsx)(`span`,{className:`sr-only`,children:w(`common:ui.closeDialog`)})]})})]})})]})}function T({className:e,...t}){return(0,g.jsx)(`div`,{"data-slot":`dialog-body`,className:p(`min-h-0 flex-1 overflow-y-auto overscroll-contain`,e),...t})}function E({className:e,...t}){return(0,g.jsx)(`div`,{"data-slot":`dialog-header`,className:p(`flex shrink-0 flex-col gap-2`,e),...t})}function D({className:e,showCloseButton:t=!1,children:n,...i}){let{t:a}=r();return(0,g.jsxs)(`div`,{"data-slot":`dialog-footer`,className:p(`-mx-4 -mb-4 flex shrink-0 flex-col-reverse gap-2 rounded-b-[var(--r-lg)] border-t border-stroke bg-surface-subtle px-4 py-3 sm:flex-row sm:justify-end`,e),...i,children:[n,t&&(0,g.jsx)(c,{asChild:!0,children:(0,g.jsx)(m,{variant:`outline`,size:`dialogAction`,children:a(`common:ui.closeDialog`)})})]})}function O({className:e,...t}){return(0,g.jsx)(d,{"data-slot":`dialog-title`,className:p(`font-heading text-[15px] leading-snug font-medium`,e),...t})}function k({className:e,...t}){return(0,g.jsx)(s,{"data-slot":`dialog-description`,className:p(`text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground`,e),...t})}export{k as a,v as c,w as i,O as l,T as n,D as o,S as r,E as s,y as t,b as u};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{n as e}from"./http-response-PZN5QIRk.js";async function t(t,n){if(!t.ok)throw await e(t);if(!t.body)throw Error(`响应不包含可读取的数据流`);let r=t.body.getReader(),i=new TextDecoder,a=``,o=`message`,s=null,c=[],l=!1,u=()=>{if(!c.length)return o=`message`,!0;let e=JSON.parse(c.join(`
|
|
2
|
+
`)),t=n(o||`message`,e,{id:s})!==!1;return o=`message`,s=null,c=[],t},d=e=>{if(!e)return u();if(e.startsWith(`:`))return!0;let t=e.indexOf(`:`),n=t<0?e:e.slice(0,t),r=t<0?``:e.slice(t+1);if(r.startsWith(` `)&&(r=r.slice(1)),n===`event`){if(c.length&&!u())return!1;o=r}else n===`data`?c.push(r):n===`id`&&(s=r||null);return!0},f=(e=!1)=>{let t=0;for(let n=0;n<a.length;n+=1){let r=a.charCodeAt(n);if(r!==10&&r!==13)continue;if(r===13&&n+1>=a.length&&!e)break;let i=a.slice(t,n);if(r===13&&a.charCodeAt(n+1)===10&&(n+=1),t=n+1,!d(i))return a=a.slice(t),!1}if(a=a.slice(t),e&&a){let e=a;if(a=``,!d(e))return!1}return!e||u()};try{for(;!l;){let{value:e,done:t}=await r.read();if(a+=i.decode(e||new Uint8Array,{stream:!t}),!f(t)){l=!0;break}if(t)break}}catch(e){throw l=!0,e}finally{l&&await r.cancel().catch(()=>{}),r.releaseLock()}}export{t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./index-
|
|
1
|
+
import{t as e}from"./index-CiRnxTh1.js";import{t}from"./storage-DtvZ_lEu.js";var n=Object.freeze([`open`,`left`,`right`,`above`,`below`]);function r(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function i(e,t=`open`,r=``){return!e||!n.includes(t)?null:{sessionId:e,disposition:t,...r?{targetEntryId:r}:{}}}function a(e){if(!e)return null;try{let t=typeof e==`string`?JSON.parse(e):e;return r(t)?i(typeof t.sessionId==`string`?t.sessionId:``,typeof t.disposition==`string`?t.disposition:`open`,typeof t.targetEntryId==`string`?t.targetEntryId:``):null}catch{return null}}var o=`pisper:task-view-will-change`,s=`pisper:session-navigation-will-change`,c=`pisper:session-selected`,l=`pisper:active-session-changed`,u=`pisper:sessions-updated`,d=`pisper:command-palette-requested`,f=`pisper:session-command`,p=`pisper:session-branch-changed`,m=`pisper:new-task-focus`;function h(e){if(!e)return null;try{let t=JSON.parse(e);return typeof t.sessionId==`string`&&typeof t.entryId==`string`?{sessionId:t.sessionId,entryId:t.entryId}:null}catch{return null}}var g=``;function _(e=``){g=typeof e==`string`?e.slice(0,200):``,window.dispatchEvent(new Event(d))}function v(){let e=g;return g=``,e}function y(e){window.dispatchEvent(new CustomEvent(f,{detail:e}))}var b=!1;function x(){b=!0,window.dispatchEvent(new Event(m))}function S(){let e=b;return b=!1,e}function C(n,r=`open`,a=``){let o=i(n,r,a);o&&(window.dispatchEvent(new Event(s)),e.setItem(t.activeSession,n),localStorage.setItem(t.sessionOpenRequest,JSON.stringify(o)),a?localStorage.setItem(t.sessionMessageTarget,JSON.stringify({sessionId:n,entryId:a})):localStorage.removeItem(t.sessionMessageTarget),window.dispatchEvent(new CustomEvent(c,{detail:o})))}function w(e){let n=h(localStorage.getItem(t.sessionMessageTarget));return n?.sessionId===e?n.entryId:``}function T(e,n){let r=h(localStorage.getItem(t.sessionMessageTarget));r?.sessionId===e&&r.entryId===n&&localStorage.removeItem(t.sessionMessageTarget)}function E(){let e=a(localStorage.getItem(t.sessionOpenRequest));return localStorage.removeItem(t.sessionOpenRequest),e}function D(){let e=a(localStorage.getItem(t.sessionOpenRequest));return e?{type:`open`,sessionId:e.sessionId}:null}function O(e,t=``){window.dispatchEvent(new CustomEvent(l,{detail:{id:e||``,model:t||``}}))}function k(e){window.dispatchEvent(e?new CustomEvent(u,{detail:e}):new Event(u))}function A(e){let t=`detail`in e?e.detail:null;if(!t||typeof t!=`object`)return null;let{id:n,pinned:r,archived:i,unread:a,needsAttention:o,attentionReason:s}=t;return typeof n!=`string`||!n||typeof r!=`boolean`||typeof i!=`boolean`||typeof a!=`boolean`||typeof o!=`boolean`||s!==null&&s!==`approval`&&s!==`failure`?null:{id:n,pinned:r,archived:i,unread:a,needsAttention:o,attentionReason:s}}function j(e,t){let n=e=>{let n=A(e);n&&t(n)};return e.addEventListener(u,n),()=>e.removeEventListener(u,n)}function M(e){let t=`detail`in e?e.detail:null;if(!t||typeof t!=`object`)return null;let{id:n,name:r}=t;return typeof n==`string`&&n.length>0&&typeof r==`string`?{id:n,name:r}:null}function N(e,t){let n=e=>{let n=M(e);n&&t(n)};return e.addEventListener(u,n),()=>e.removeEventListener(u,n)}function P(e){let t=`detail`in e?e.detail:null;if(!t||typeof t!=`object`)return null;let{id:n,cwd:r}=t;return typeof n==`string`&&n.length>0&&typeof r==`string`&&r.length>0?{id:n,cwd:r}:null}function F(e,t){let n=e=>{let n=P(e);n&&t(n)};return e.addEventListener(u,n),()=>e.removeEventListener(u,n)}function I(e){let t=`detail`in e?e.detail:null;if(!t||typeof t!=`object`)return null;let{deletedIds:n}=t;return!Array.isArray(n)||!n.length||!n.every(e=>typeof e==`string`&&e.length>0)?null:{deletedIds:[...new Set(n)]}}function L(e,t){let n=e=>{let n=I(e);n&&t(n)};return e.addEventListener(u,n),()=>e.removeEventListener(u,n)}function R(e){e&&window.dispatchEvent(new CustomEvent(p,{detail:{sessionId:e}}))}function z(e){let t=t=>{let n=`detail`in t?t.detail:null,r=n&&typeof n==`object`?n.sessionId:null;typeof r==`string`&&r&&e(r)};return window.addEventListener(p,t),()=>window.removeEventListener(p,t)}export{j as C,L as S,v as T,x as _,s as a,z as b,O as c,T as d,S as f,_ as g,D as h,f as i,R as l,w as m,d as n,c as o,E as p,m as r,o as s,l as t,k as u,y as v,N as w,F as x,C as y};
|