@michengai/dsh-agency-agents 1.0.8 → 1.0.11

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/CHANGELOG.md CHANGED
@@ -4,6 +4,19 @@
4
4
 
5
5
  This file records features and upgrade boundaries. npm and GitHub Releases remain the publication source of truth.
6
6
 
7
+ ## Unreleased
8
+
9
+ ## 1.0.11 - 2026-10-07
10
+
11
+ - Official Desktop can update this plugin in place. It no longer targets the web profile by mistake.
12
+ - A new version is marked with a warning color. Version numbers keep their normal color.
13
+ - After updating, fully quit and reopen DSH Desktop.
14
+
15
+ ## 1.0.9 - 2026-10-06
16
+
17
+ - The installed-plugin list shows “Agency Agents” and a localized description instead of the package name. The remote entry shows “Agency Agents remote”. Titles and descriptions come from `meta.title` and `meta.description` in `locale/zh.json`, `locale/en.json`, and `locale/remote/`.
18
+ - Installing from GitHub now includes the compiled runtime, so no manual build is required.
19
+
7
20
  ## 1.0.8 - 2026-10-05
8
21
 
9
22
  ### Improvements
@@ -4,6 +4,19 @@
4
4
 
5
5
  本文件记录版本功能与升级边界。正式发布状态以 npm 和 GitHub Releases 为准。
6
6
 
7
+ ## 未发布
8
+
9
+ ## 1.0.11 - 2026-10-07
10
+
11
+ - 官方桌面版可以在线更新这个插件,不再误装到 web profile。
12
+ - 发现新版本时,提示文字会标成提醒色;版本号颜色不变。
13
+ - 更新完成后需要完全退出并重新打开 DSH Desktop。
14
+
15
+ ## 1.0.9 - 2026-10-06
16
+
17
+ - 已安装插件列表显示「Agency Agents」和中文简介,不再只用包名。远程入口显示「Agency Agents 接口」。显示名来自 `locale/zh.json`、`locale/en.json` 和 `locale/remote/` 的 `meta.title`、`meta.description`。
18
+ - 从 GitHub 安装时已包含运行文件,不必再手动构建。
19
+
7
20
  ## 1.0.8 - 2026-10-05
8
21
 
9
22
  ### 体验优化
package/README.md CHANGED
@@ -69,7 +69,7 @@ Retain `list_experts`, `summon_expert`, and `summon_experts`. Add `list_expert_t
69
69
  - Team configuration lives in the host `agency-agents` settings namespace. Keep drafts on edit conflicts and review the latest configuration. Disabling or deleting teams does not disable experts or delete historical conversations.
70
70
  - Experts cannot summon further experts or automatically add analysis rounds. Cancellation prevents queued starts; completed results and failures are reported separately.
71
71
 
72
- > This README describes version 1.0.8; npm and GitHub Releases determine publication status. See the [changelog](CHANGELOG.md) for the full changes and [release notes](RELEASE_NOTES.md) for the bilingual release description. Upgrades retain expert settings. Back up settings before downgrading because older versions do not support teams.
72
+ > This README describes version 1.0.11; npm and GitHub Releases determine publication status. See the [changelog](CHANGELOG.md) for the full changes and [release notes](RELEASE_NOTES.md) for the bilingual release description. Upgrades retain expert settings. Back up settings before downgrading because older versions do not support teams.
73
73
  ## Screenshots
74
74
 
75
75
  The screenshots below show the 1.0.0 interface in Chinese. Experts and expert teams share the same settings page.
@@ -752,7 +752,7 @@ Set `AGENCY_AGENTS_ROOT` to use an external expert directory. Persona bodies fro
752
752
 
753
753
  ## Secondary development
754
754
 
755
- `lib` is not tracked in Git. Run `pnpm build` before using a source checkout. The release gate builds and verifies `lib`; npm packages still include the compiled runtime.
755
+ Both GitHub and npm include a ready-to-run `lib`. After changing the source in a clone, run `pnpm build` before committing, or a source install keeps the previous runtime.
756
756
 
757
757
 
758
758
  ### Install from source
package/README.zh-CN.md CHANGED
@@ -69,7 +69,7 @@
69
69
  - 团队配置保存在宿主 `agency-agents` 命名空间。编辑冲突保留草稿并提示核对最新配置;停用或删除团队不会停用专家,也不会删除历史会话。
70
70
  - 专家不得继续召唤专家或自动追加分析轮次。取消会停止未启动任务;已有结果和失败原因分别报告。
71
71
 
72
- > 本 README 描述 1.0.8,正式发行以 npm 和 GitHub Releases 为准。完整改动见[更新日志](CHANGELOG.zh-CN.md),双语版本说明见[发行说明](RELEASE_NOTES.md)。升级保留已有专家配置;回退旧版前先备份设置,旧版不具备团队功能。
72
+ > 本 README 描述 1.0.11,正式发行以 npm 和 GitHub Releases 为准。完整改动见[更新日志](CHANGELOG.zh-CN.md),双语版本说明见[发行说明](RELEASE_NOTES.md)。升级保留已有专家配置;回退旧版前先备份设置,旧版不具备团队功能。
73
73
  ## 界面预览
74
74
 
75
75
  以下为 1.0.0 中文界面截图,专家与专家团共用同一个设置页面。
@@ -752,7 +752,7 @@ dsh --profile web --dump-config
752
752
 
753
753
  ## 二次开发
754
754
 
755
- `lib` 不提交到 GitHub;从源码使用前运行 `pnpm build`。发布门禁生成并验证 `lib`,npm 包仍包含可直接运行的编译产物。
755
+ GitHub 与 npm 都包含可直接运行的 `lib`。克隆后如果改了源码,提交前运行 `pnpm build`,否则源码安装仍是旧的运行文件。
756
756
 
757
757
 
758
758
  ### 从源码安装
package/RELEASE_NOTES.md CHANGED
@@ -1,15 +1,11 @@
1
1
  ## 中文说明
2
2
 
3
- ### 体验优化
4
-
5
- - 同时启用 MCP 连接器时,打开和切换会话更顺畅。
6
- - 专家团工具会跟随当前语言,切换中英文后仍然即时更新。
3
+ - 已安装插件列表显示「Agency Agents」和中文简介,不再只用包名。远程入口显示「Agency Agents 接口」。显示名来自 `locale/zh.json`、`locale/en.json` 和 `locale/remote/` 的 `meta.title`、`meta.description`。
4
+ - 从 GitHub 安装时已包含运行文件,不必再手动构建。
7
5
 
8
6
  ---
9
7
 
10
8
  ## English
11
9
 
12
- ### Improvements
13
-
14
- - Opening and switching sessions stays smoother when the MCP connector is also enabled.
15
- - Expert team tools follow the current language and still update immediately when switching between Chinese and English.
10
+ - The installed-plugin list shows “Agency Agents” and a localized description instead of the package name. The remote entry shows “Agency Agents remote”. Titles and descriptions come from `meta.title` and `meta.description` in `locale/zh.json`, `locale/en.json`, and `locale/remote/`.
11
+ - Installing from GitHub now includes the compiled runtime, so no manual build is required.
package/lib/client.js CHANGED
@@ -426,10 +426,10 @@ Approach
426
426
  Understand the context and goals first. Ask when information is missing.
427
427
 
428
428
  Output
429
- Provide conclusions, evidence and actionable next steps. Do not invent facts.`},TE={...CE,"discovery.search":`搜索名称、领域或关键词`,"discovery.refine":`仅显示最相关的 8 位专家,请补充关键词缩小范围。`,"discovery.working":`正在处理…`,"discovery.exampleFailed":`专家已选择,但示例未能填入,请直接输入任务。`,"discovery.conflict":`名称冲突`,"discovery.enableSelect":`启用并选择`,"discovery.noResults":`没有匹配的专家,请尝试其他关键词。`,"discovery.empty":`暂无已启用专家,输入关键词查找。`,"discovery.enabledInsertFailed":`专家已启用,但未能插入标签,请重试选择。`,"settings.nav":`专家`,"settings.title":`专家`,"settings.loading":`正在加载专家…`,"settings.viewProject":`GitHub`,"settings.feedback":`问题反馈`,"settings.enabled":`已启用`,"settings.disabled":`已停用`,"settings.filter.source":`来源`,"settings.filter.category":`分类`,"settings.filter.status":`状态`,"settings.filter.allStatuses":`全部状态`,"settings.filter.allSources":`全部来源`,"settings.filter.allCategories":`全部分类`,"settings.search":`搜索`,"settings.search.placeholder":`搜索专家、职责或领域`,"settings.search.clear":`清除搜索`,"settings.viewPrompt":`查看`,"settings.copyPrompt":`复制`,"settings.viewPromptTitle":`查看提示词`,"settings.copyPromptTitle":`复制提示词`,"settings.copySuccess":`已复制`,"settings.promptTitle":`{name} 的提示词`,"settings.promptClose":`关闭`,"error.promptCopy":`无法复制提示词,请检查浏览器剪贴板权限。`,"settings.empty":`没有匹配的专家。试试其他关键词,或切换到「{all}」。`,"settings.empty.reset":`清除筛选`,"error.conflict":`配置已被其他窗口修改。`,"error.conflict.refreshed":`配置已被其他窗口修改,已为您刷新。`,"error.conflict.refreshFailed":`配置已被其他窗口修改,但刷新失败,请手动刷新。`,"error.insertFailed":`未能插入专家标签,请重试。`,"btn.refresh":`刷新`,"summary.total.one":`位专家`,"summary.total.other":`位专家`,"summary.enabledPrefix":`已启用`,"button.title":`召唤专家`,"division.academic":gv.academic,"division.company":gv.company,"division.design":gv.design,"division.engineering":gv.engineering,"division.finance":gv.finance,"division.game-development":gv[`game-development`],"division.gis":gv.gis,"division.healthcare":gv.healthcare,"division.hr":gv.hr,"division.legal":gv.legal,"division.marketing":gv.marketing,"division.paid-media":gv[`paid-media`],"division.product":gv.product,"division.project-management":gv[`project-management`],"division.research":gv.research,"division.sales":gv.sales,"division.security":gv.security,"division.spatial-computing":gv[`spatial-computing`],"division.specialized":gv.specialized,"division.support":gv.support,"division.supply-chain":gv[`supply-chain`],"division.testing":gv.testing},EE={...wE,"discovery.search":`Search names, fields or keywords`,"discovery.refine":`Showing the 8 most relevant experts. Add keywords to narrow the results.`,"discovery.working":`Working…`,"discovery.exampleFailed":`The expert is selected, but the example could not be inserted. Please enter your task.`,"discovery.conflict":`Name conflict`,"discovery.enableSelect":`Enable and select`,"discovery.noResults":`No matching experts. Try a different keyword.`,"discovery.empty":`No enabled experts yet. Type a keyword to find one.`,"discovery.enabledInsertFailed":`The expert is enabled, but its reference could not be inserted. Try selecting it again.`,"settings.nav":`Experts`,"settings.title":`Experts`,"settings.loading":`Loading experts…`,"settings.viewProject":`GitHub`,"settings.feedback":`Issues`,"settings.enabled":`Enabled`,"settings.disabled":`Disabled`,"settings.filter.source":`Source`,"settings.filter.category":`Category`,"settings.filter.status":`Status`,"settings.filter.allStatuses":`All statuses`,"settings.filter.allSources":`All sources`,"settings.filter.allCategories":`All categories`,"settings.search":`Search`,"settings.search.placeholder":`Search experts, roles, or domains`,"settings.search.clear":`Clear search`,"settings.viewPrompt":`View`,"settings.copyPrompt":`Copy`,"settings.viewPromptTitle":`View prompt`,"settings.copyPromptTitle":`Copy prompt`,"settings.copySuccess":`Copied`,"settings.promptTitle":`Prompt for {name}`,"settings.promptClose":`Close`,"error.promptCopy":`Could not copy the prompt. Check browser clipboard permissions.`,"settings.empty":`No matching experts. Try another keyword, or switch to {all}.`,"settings.empty.reset":`Clear filters`,"error.conflict":`Settings were changed in another window.`,"error.conflict.refreshed":`Settings were changed in another window and have been refreshed.`,"error.conflict.refreshFailed":`Settings were changed in another window, but refresh failed. Please refresh manually.`,"error.insertFailed":`The expert reference could not be inserted. Please try again.`,"btn.refresh":`Refresh`,"summary.total.one":`expert`,"summary.total.other":`experts`,"summary.enabledPrefix":`Enabled`,"button.title":`Summon expert`,"division.academic":_v.academic,"division.company":_v.company,"division.design":_v.design,"division.engineering":_v.engineering,"division.finance":_v.finance,"division.game-development":_v[`game-development`],"division.gis":_v.gis,"division.healthcare":_v.healthcare,"division.hr":_v.hr,"division.legal":_v.legal,"division.marketing":_v.marketing,"division.paid-media":_v[`paid-media`],"division.product":_v.product,"division.project-management":_v[`project-management`],"division.research":_v.research,"division.sales":_v.sales,"division.security":_v.security,"division.spatial-computing":_v[`spatial-computing`],"division.specialized":_v.specialized,"division.support":_v.support,"division.supply-chain":_v[`supply-chain`],"division.testing":_v.testing},DE=`🧩`,OE=/^custom-[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/u,kE=new Intl.Segmenter(void 0,{granularity:`grapheme`});function AE(e){return e.length<=32&&[...kE.segment(e)].length===1&&/\p{Extended_Pictographic}|\p{Regional_Indicator}|\p{Emoji_Presentation}|[0-9#*]\uFE0F?\u20E3/u.test(e)}let jE=iw().trim().min(1).max(40).refine(e=>!/[@\r\n\u0000-\u001f\u007f]/u.test(e)),ME=Rw({slug:iw().regex(OE).optional(),name:jE,description:iw().trim().min(1).max(160),division:iw().regex(/^[a-z][a-z0-9-]{0,63}$/u),emoji:iw().default(DE).transform(e=>{let t=e.trim();return t!==``&&AE(t)?t:DE}),avatar:Ew().int().min(0).max(35).default(0),prompt:iw().trim().min(1).max(2e4)}).strict(),NE=ME.extend({slug:iw().regex(OE),deleted:Aw().optional(),wasEnabled:Aw().optional()}),PE=Rw({experts:Iw(Rw({slug:iw(),name:iw(),nameEn:iw(),description:iw(),descriptionEn:iw(),emoji:iw(),division:iw(),divisionZh:iw(),conflict:Aw().optional(),custom:Aw().default(!1),avatar:Ew().int().min(0).max(35).optional()})),enabled:Iw(iw()),revision:Ew().int().min(0)}),FE=NE.omit({deleted:!0,wasEnabled:!0}),IE={invalid:[`请检查名称、简介、分类和提示词。`,`Check the name, description, category and prompt.`],duplicate:[`专家名称已被使用,请换一个名称。`,`This expert name is already in use. Choose another name.`],unavailable:[`所选专家不存在、已删除或名称冲突,请刷新后重新选择。`,`An expert is missing, deleted or has a name conflict. Refresh and choose again.`],missing:[`自定义专家不存在或已删除,请刷新后重试。`,`The custom expert is missing or deleted. Refresh and try again.`],readonly:[`内置或外部目录专家不可直接编辑,请复制为自定义专家。`,`Built-in and external experts are read-only. Create a custom copy instead.`],division:[`请选择有效的专家分类。`,`Choose a valid expert category.`],limit:[`自定义专家数量已达到上限(200 位),请先删除不再使用的专家。`,`The limit of 200 custom experts has been reached. Delete an unused expert first.`],conflict:[`专家配置已被其他窗口修改,请刷新后重试。`,`Expert settings were changed in another window. Refresh and try again.`]};function LE(e,t){return Error(IE[e][+(t===`en`)])}let RE=Iw(iw()),zE=Rw({enabled:RE,revision:Ew().int().min(0)}),BE=Rw({prompt:iw()});function VE(e,t){return{mode:`strict`,typeSymbol:e,create:()=>t,schema:t}}function HE(e,t,n){return{name:e,wire:e,source:`json`,codec:VE(t,n)}}function UE(e,t){return{id:`@michengai/dsh-agency-agents#agencyAgents/${e}`,service:`agencyAgents`,namespace:`agencyAgents`,method:e,invocation:{kind:`direct`},parameters:t,result:VE(`AgencyAgentsCatalog`,PE)}}let WE=HE(`expectedRevision`,`number`,Ew().int().min(0)),GE=HE(`slug`,`string`,iw().regex(OE)),KE={package:`@michengai/dsh-agency-agents`,descriptors:[...[{method:`getTeams`,parameters:[]},{method:`saveTeam`,parameters:[HE(`team`,`ExpertTeamInput`,DT),HE(`enabled`,`boolean`,Aw()),WE]},{method:`setTeamEnabled`,parameters:[HE(`id`,`string`,iw().min(1).max(128)),HE(`enabled`,`boolean`,Aw()),WE]},{method:`deleteTeam`,parameters:[HE(`id`,`string`,iw().min(1).max(128)),WE]}].map(({method:e,parameters:t})=>({id:`@michengai/dsh-agency-agents#agencyAgents/${e}`,service:`agencyAgents`,namespace:`agencyAgents`,method:e,invocation:{kind:`direct`},parameters:t,result:VE(`AgencyTeamsSnapshot`,AT)})),UE(`getCatalog`,[]),UE(`saveCustomExpert`,[HE(`expert`,`CustomExpertInput`,ME),HE(`enabled`,`boolean`,Aw()),WE]),UE(`deleteCustomExpert`,[GE,WE]),{id:`@michengai/dsh-agency-agents#agencyAgents/getCustomExpert`,service:`agencyAgents`,namespace:`agencyAgents`,method:`getCustomExpert`,invocation:{kind:`direct`},parameters:[GE],result:VE(`CustomExpertInput`,FE)},{id:`@michengai/dsh-agency-agents#agencyAgents/getEnabled`,service:`agencyAgents`,namespace:`agencyAgents`,method:`getEnabled`,invocation:{kind:`direct`},parameters:[],result:VE(`AgencyAgentsEnabledState`,zE)},{id:`@michengai/dsh-agency-agents#agencyAgents/setEnabled`,service:`agencyAgents`,namespace:`agencyAgents`,method:`setEnabled`,invocation:{kind:`direct`},parameters:[HE(`enabled`,`string[]`,RE),HE(`expectedRevision`,`number`,Ew().int().min(0))],result:VE(`AgencyAgentsEnabledState`,zE)},{id:`@michengai/dsh-agency-agents#agencyAgents/getPrompt`,service:`agencyAgents`,namespace:`agencyAgents`,method:`getPrompt`,invocation:{kind:`direct`},parameters:[HE(`slug`,`string`,iw().min(1).max(128)),HE(`division`,`string`,iw().min(1).max(64))],result:VE(`AgencyAgentsPrompt`,BE)}]},qE=`michengai-plugin-update-ui`,JE={check:`检查更新`,update:`更新`,close:`关闭`,recheck:`重新检查`,auto:`自动更新`,updating:`正在更新…`,copy:`复制命令`,copied:`已复制`,copyFailed:`复制失败`,checking:`正在检查更新…`,latest:`已是最新版本`,found:`发现新版本`,failed:`检查更新失败,请稍后重试。`,current:`运行版本`,latestLabel:`最新版本`,profile:`目标 profile`,unknown:`未知`,manual:`手工更新`,manualHint:`自动更新失败时,可在当前 DSH 终端执行以下命令,完成后重启 DSH Web。`,intro:`仅检查并更新当前插件,不会联动安装其他插件。`,restart:`更新完成,请重启 DSH Web。`,restarting:`更新完成,正在重启 DSH Desktop…`,unavailable:`当前环境不支持自动更新,请使用手工更新命令。`},YE={check:`Check for updates`,update:`Update`,close:`Close`,recheck:`Check again`,auto:`Update automatically`,updating:`Updating…`,copy:`Copy command`,copied:`Copied`,copyFailed:`Copy failed`,checking:`Checking for updates…`,latest:`You are up to date`,found:`New version available`,failed:`Could not check for updates. Try again later.`,current:`Running version`,latestLabel:`Latest version`,profile:`Target profile`,unknown:`Unknown`,manual:`Manual update`,manualHint:`If automatic update fails, run this command in the current DSH terminal, then restart DSH Web.`,intro:`Only this plugin is checked and updated. Other plugins are not changed.`,restart:`Update complete. Restart DSH Web.`,restarting:`Update complete. Restarting DSH Desktop…`,unavailable:`Automatic update is unavailable. Use the manual command.`};function XE(e){let t=p.default.useRef(null);return p.default.useLayoutEffect(()=>{t.current?.replaceChildren(e.node)},[e.node]),p.default.createElement(`span`,{ref:t,className:`mpi-icon`,"aria-hidden":!0})}function ZE(){let e=document.documentElement.lang.toLowerCase(),t=document.querySelector(`[role="dialog"]`)?.textContent??``;return e.startsWith(`en`)||t.includes(`Settings`)&&!t.includes(`设置`)?YE:JE}function QE(){if(document.getElementById(qE)!==null)return;let e=document.createElement(`style`);e.id=qE,e.textContent=`
429
+ Provide conclusions, evidence and actionable next steps. Do not invent facts.`},TE={...CE,"discovery.search":`搜索名称、领域或关键词`,"discovery.refine":`仅显示最相关的 8 位专家,请补充关键词缩小范围。`,"discovery.working":`正在处理…`,"discovery.exampleFailed":`专家已选择,但示例未能填入,请直接输入任务。`,"discovery.conflict":`名称冲突`,"discovery.enableSelect":`启用并选择`,"discovery.noResults":`没有匹配的专家,请尝试其他关键词。`,"discovery.empty":`暂无已启用专家,输入关键词查找。`,"discovery.enabledInsertFailed":`专家已启用,但未能插入标签,请重试选择。`,"settings.nav":`专家`,"settings.title":`专家`,"settings.loading":`正在加载专家…`,"settings.viewProject":`GitHub`,"settings.feedback":`问题反馈`,"settings.enabled":`已启用`,"settings.disabled":`已停用`,"settings.filter.source":`来源`,"settings.filter.category":`分类`,"settings.filter.status":`状态`,"settings.filter.allStatuses":`全部状态`,"settings.filter.allSources":`全部来源`,"settings.filter.allCategories":`全部分类`,"settings.search":`搜索`,"settings.search.placeholder":`搜索专家、职责或领域`,"settings.search.clear":`清除搜索`,"settings.viewPrompt":`查看`,"settings.copyPrompt":`复制`,"settings.viewPromptTitle":`查看提示词`,"settings.copyPromptTitle":`复制提示词`,"settings.copySuccess":`已复制`,"settings.promptTitle":`{name} 的提示词`,"settings.promptClose":`关闭`,"error.promptCopy":`无法复制提示词,请检查浏览器剪贴板权限。`,"settings.empty":`没有匹配的专家。试试其他关键词,或切换到「{all}」。`,"settings.empty.reset":`清除筛选`,"error.conflict":`配置已被其他窗口修改。`,"error.conflict.refreshed":`配置已被其他窗口修改,已为您刷新。`,"error.conflict.refreshFailed":`配置已被其他窗口修改,但刷新失败,请手动刷新。`,"error.insertFailed":`未能插入专家标签,请重试。`,"btn.refresh":`刷新`,"summary.total.one":`位专家`,"summary.total.other":`位专家`,"summary.enabledPrefix":`已启用`,"button.title":`召唤专家`,"division.academic":gv.academic,"division.company":gv.company,"division.design":gv.design,"division.engineering":gv.engineering,"division.finance":gv.finance,"division.game-development":gv[`game-development`],"division.gis":gv.gis,"division.healthcare":gv.healthcare,"division.hr":gv.hr,"division.legal":gv.legal,"division.marketing":gv.marketing,"division.paid-media":gv[`paid-media`],"division.product":gv.product,"division.project-management":gv[`project-management`],"division.research":gv.research,"division.sales":gv.sales,"division.security":gv.security,"division.spatial-computing":gv[`spatial-computing`],"division.specialized":gv.specialized,"division.support":gv.support,"division.supply-chain":gv[`supply-chain`],"division.testing":gv.testing},EE={...wE,"discovery.search":`Search names, fields or keywords`,"discovery.refine":`Showing the 8 most relevant experts. Add keywords to narrow the results.`,"discovery.working":`Working…`,"discovery.exampleFailed":`The expert is selected, but the example could not be inserted. Please enter your task.`,"discovery.conflict":`Name conflict`,"discovery.enableSelect":`Enable and select`,"discovery.noResults":`No matching experts. Try a different keyword.`,"discovery.empty":`No enabled experts yet. Type a keyword to find one.`,"discovery.enabledInsertFailed":`The expert is enabled, but its reference could not be inserted. Try selecting it again.`,"settings.nav":`Experts`,"settings.title":`Experts`,"settings.loading":`Loading experts…`,"settings.viewProject":`GitHub`,"settings.feedback":`Issues`,"settings.enabled":`Enabled`,"settings.disabled":`Disabled`,"settings.filter.source":`Source`,"settings.filter.category":`Category`,"settings.filter.status":`Status`,"settings.filter.allStatuses":`All statuses`,"settings.filter.allSources":`All sources`,"settings.filter.allCategories":`All categories`,"settings.search":`Search`,"settings.search.placeholder":`Search experts, roles, or domains`,"settings.search.clear":`Clear search`,"settings.viewPrompt":`View`,"settings.copyPrompt":`Copy`,"settings.viewPromptTitle":`View prompt`,"settings.copyPromptTitle":`Copy prompt`,"settings.copySuccess":`Copied`,"settings.promptTitle":`Prompt for {name}`,"settings.promptClose":`Close`,"error.promptCopy":`Could not copy the prompt. Check browser clipboard permissions.`,"settings.empty":`No matching experts. Try another keyword, or switch to {all}.`,"settings.empty.reset":`Clear filters`,"error.conflict":`Settings were changed in another window.`,"error.conflict.refreshed":`Settings were changed in another window and have been refreshed.`,"error.conflict.refreshFailed":`Settings were changed in another window, but refresh failed. Please refresh manually.`,"error.insertFailed":`The expert reference could not be inserted. Please try again.`,"btn.refresh":`Refresh`,"summary.total.one":`expert`,"summary.total.other":`experts`,"summary.enabledPrefix":`Enabled`,"button.title":`Summon expert`,"division.academic":_v.academic,"division.company":_v.company,"division.design":_v.design,"division.engineering":_v.engineering,"division.finance":_v.finance,"division.game-development":_v[`game-development`],"division.gis":_v.gis,"division.healthcare":_v.healthcare,"division.hr":_v.hr,"division.legal":_v.legal,"division.marketing":_v.marketing,"division.paid-media":_v[`paid-media`],"division.product":_v.product,"division.project-management":_v[`project-management`],"division.research":_v.research,"division.sales":_v.sales,"division.security":_v.security,"division.spatial-computing":_v[`spatial-computing`],"division.specialized":_v.specialized,"division.support":_v.support,"division.supply-chain":_v[`supply-chain`],"division.testing":_v.testing},DE=`🧩`,OE=/^custom-[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/u,kE=new Intl.Segmenter(void 0,{granularity:`grapheme`});function AE(e){return e.length<=32&&[...kE.segment(e)].length===1&&/\p{Extended_Pictographic}|\p{Regional_Indicator}|\p{Emoji_Presentation}|[0-9#*]\uFE0F?\u20E3/u.test(e)}let jE=iw().trim().min(1).max(40).refine(e=>!/[@\r\n\u0000-\u001f\u007f]/u.test(e)),ME=Rw({slug:iw().regex(OE).optional(),name:jE,description:iw().trim().min(1).max(160),division:iw().regex(/^[a-z][a-z0-9-]{0,63}$/u),emoji:iw().default(DE).transform(e=>{let t=e.trim();return t!==``&&AE(t)?t:DE}),avatar:Ew().int().min(0).max(35).default(0),prompt:iw().trim().min(1).max(2e4)}).strict(),NE=ME.extend({slug:iw().regex(OE),deleted:Aw().optional(),wasEnabled:Aw().optional()}),PE=Rw({experts:Iw(Rw({slug:iw(),name:iw(),nameEn:iw(),description:iw(),descriptionEn:iw(),emoji:iw(),division:iw(),divisionZh:iw(),conflict:Aw().optional(),custom:Aw().default(!1),avatar:Ew().int().min(0).max(35).optional()})),enabled:Iw(iw()),revision:Ew().int().min(0)}),FE=NE.omit({deleted:!0,wasEnabled:!0}),IE={invalid:[`请检查名称、简介、分类和提示词。`,`Check the name, description, category and prompt.`],duplicate:[`专家名称已被使用,请换一个名称。`,`This expert name is already in use. Choose another name.`],unavailable:[`所选专家不存在、已删除或名称冲突,请刷新后重新选择。`,`An expert is missing, deleted or has a name conflict. Refresh and choose again.`],missing:[`自定义专家不存在或已删除,请刷新后重试。`,`The custom expert is missing or deleted. Refresh and try again.`],readonly:[`内置或外部目录专家不可直接编辑,请复制为自定义专家。`,`Built-in and external experts are read-only. Create a custom copy instead.`],division:[`请选择有效的专家分类。`,`Choose a valid expert category.`],limit:[`自定义专家数量已达到上限(200 位),请先删除不再使用的专家。`,`The limit of 200 custom experts has been reached. Delete an unused expert first.`],conflict:[`专家配置已被其他窗口修改,请刷新后重试。`,`Expert settings were changed in another window. Refresh and try again.`]};function LE(e,t){return Error(IE[e][+(t===`en`)])}let RE=Iw(iw()),zE=Rw({enabled:RE,revision:Ew().int().min(0)}),BE=Rw({prompt:iw()});function VE(e,t){return{mode:`strict`,typeSymbol:e,create:()=>t,schema:t}}function HE(e,t,n){return{name:e,wire:e,source:`json`,codec:VE(t,n)}}function UE(e,t){return{id:`@michengai/dsh-agency-agents#agencyAgents/${e}`,service:`agencyAgents`,namespace:`agencyAgents`,method:e,invocation:{kind:`direct`},parameters:t,result:VE(`AgencyAgentsCatalog`,PE)}}let WE=HE(`expectedRevision`,`number`,Ew().int().min(0)),GE=HE(`slug`,`string`,iw().regex(OE)),KE={package:`@michengai/dsh-agency-agents`,descriptors:[...[{method:`getTeams`,parameters:[]},{method:`saveTeam`,parameters:[HE(`team`,`ExpertTeamInput`,DT),HE(`enabled`,`boolean`,Aw()),WE]},{method:`setTeamEnabled`,parameters:[HE(`id`,`string`,iw().min(1).max(128)),HE(`enabled`,`boolean`,Aw()),WE]},{method:`deleteTeam`,parameters:[HE(`id`,`string`,iw().min(1).max(128)),WE]}].map(({method:e,parameters:t})=>({id:`@michengai/dsh-agency-agents#agencyAgents/${e}`,service:`agencyAgents`,namespace:`agencyAgents`,method:e,invocation:{kind:`direct`},parameters:t,result:VE(`AgencyTeamsSnapshot`,AT)})),UE(`getCatalog`,[]),UE(`saveCustomExpert`,[HE(`expert`,`CustomExpertInput`,ME),HE(`enabled`,`boolean`,Aw()),WE]),UE(`deleteCustomExpert`,[GE,WE]),{id:`@michengai/dsh-agency-agents#agencyAgents/getCustomExpert`,service:`agencyAgents`,namespace:`agencyAgents`,method:`getCustomExpert`,invocation:{kind:`direct`},parameters:[GE],result:VE(`CustomExpertInput`,FE)},{id:`@michengai/dsh-agency-agents#agencyAgents/getEnabled`,service:`agencyAgents`,namespace:`agencyAgents`,method:`getEnabled`,invocation:{kind:`direct`},parameters:[],result:VE(`AgencyAgentsEnabledState`,zE)},{id:`@michengai/dsh-agency-agents#agencyAgents/setEnabled`,service:`agencyAgents`,namespace:`agencyAgents`,method:`setEnabled`,invocation:{kind:`direct`},parameters:[HE(`enabled`,`string[]`,RE),HE(`expectedRevision`,`number`,Ew().int().min(0))],result:VE(`AgencyAgentsEnabledState`,zE)},{id:`@michengai/dsh-agency-agents#agencyAgents/getPrompt`,service:`agencyAgents`,namespace:`agencyAgents`,method:`getPrompt`,invocation:{kind:`direct`},parameters:[HE(`slug`,`string`,iw().min(1).max(128)),HE(`division`,`string`,iw().min(1).max(64))],result:VE(`AgencyAgentsPrompt`,BE)}]},qE=`michengai-plugin-update-ui`,JE={check:`检查更新`,update:`更新`,close:`关闭`,recheck:`重新检查`,auto:`自动更新`,updating:`正在更新…`,copy:`复制命令`,copied:`已复制`,copyFailed:`复制失败`,checking:`正在检查更新…`,latest:`已是最新版本`,found:`发现新版本`,failed:`检查更新失败,请稍后重试。`,current:`运行版本`,latestLabel:`最新版本`,profile:`目标 profile`,unknown:`未知`,manual:`手工更新`,manualHint:`自动更新失败时,可在当前 DSH 终端执行以下命令,完成后重启 DSH Web。`,manualHintDesktop:`自动更新失败时,请先完全退出 DSH Desktop,再用 Desktop 自带的 dsh 执行以下命令。普通 dsh 会拒绝 desktop profile。`,intro:`仅检查并更新当前插件,不会联动安装其他插件。`,restart:`更新完成,请重启 DSH Web。`,restartDesktop:`更新完成,请完全退出并重新打开 DSH Desktop。`,restarting:`更新完成,正在重启 DSH Desktop…`,unavailable:`当前环境不支持自动更新,请使用手工更新命令。`},YE={check:`Check for updates`,update:`Update`,close:`Close`,recheck:`Check again`,auto:`Update automatically`,updating:`Updating…`,copy:`Copy command`,copied:`Copied`,copyFailed:`Copy failed`,checking:`Checking for updates…`,latest:`You are up to date`,found:`New version available`,failed:`Could not check for updates. Try again later.`,current:`Running version`,latestLabel:`Latest version`,profile:`Target profile`,unknown:`Unknown`,manual:`Manual update`,manualHint:`If automatic update fails, run this command in the current DSH terminal, then restart DSH Web.`,manualHintDesktop:`If automatic update fails, fully quit DSH Desktop, then run this command with Desktop's own dsh. A regular dsh rejects the desktop profile.`,intro:`Only this plugin is checked and updated. Other plugins are not changed.`,restart:`Update complete. Restart DSH Web.`,restartDesktop:`Update complete. Fully quit and reopen DSH Desktop.`,restarting:`Update complete. Restarting DSH Desktop…`,unavailable:`Automatic update is unavailable. Use the manual command.`};function XE(e){let t=p.default.useRef(null);return p.default.useLayoutEffect(()=>{t.current?.replaceChildren(e.node)},[e.node]),p.default.createElement(`span`,{ref:t,className:`mpi-icon`,"aria-hidden":!0})}function ZE(){let e=document.documentElement.lang.toLowerCase(),t=document.querySelector(`[role="dialog"]`)?.textContent??``;return e.startsWith(`en`)||t.includes(`Settings`)&&!t.includes(`设置`)?YE:JE}function QE(){if(document.getElementById(qE)!==null)return;let e=document.createElement(`style`);e.id=qE,e.textContent=`
430
430
  .mpi-version{margin-left:8px;color:var(--dsw-alias-label-tertiary);font-family:inherit;font-size:12px;font-weight:500;line-height:18px;letter-spacing:0;white-space:nowrap;vertical-align:baseline}.mpi-check-host{display:inline-flex;align-items:center}.mpi-icon{display:inline-flex;flex:0 0 auto;width:16px;height:16px;align-items:center;justify-content:center;pointer-events:none}.mpi-icon svg{display:block;width:16px;height:16px}
431
- .mpi-intro{margin:0 0 16px;color:var(--dsw-alias-label-secondary);font-size:13px;line-height:20px}.mpi-meta{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:8px 18px;margin:0 0 16px;font-size:12px;line-height:18px}.mpi-meta dt{color:var(--dsw-alias-label-secondary)}.mpi-meta dd{margin:0}.mpi-mono{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.mpi-latest{display:flex;align-items:baseline;flex-wrap:wrap;gap:4px 10px}.mpi-status{font-size:13px;font-weight:600;line-height:18px}.mpi-status[data-kind=error]{color:var(--dsw-alias-state-error-primary)}.mpi-status[data-kind=success]{color:var(--dsw-alias-state-success-primary)}.mpi-manual{border-top:1px solid var(--dsw-alias-border-l2);padding-top:16px}.mpi-manual h3{margin:0 0 6px;font-size:14px;line-height:20px}.mpi-manual p{margin:0 0 10px;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:18px}.mpi-command{display:flex;align-items:flex-start;gap:8px;border:1px solid var(--dsw-alias-border-l2);border-radius:7px;padding:10px;background:var(--dsw-alias-bg-layer-3,var(--dsw-specific-menu-item-hover))}.mpi-command code{min-width:0;flex:1;overflow:visible;font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:12px;line-height:18px;white-space:pre-wrap;overflow-wrap:anywhere}@media(max-width:560px){.mpi-meta{grid-template-columns:1fr;gap:2px}.mpi-meta dd{margin-bottom:6px}}
432
- `,(document.head??document.documentElement).append(e)}function $E(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.packageName==`string`&&typeof t.currentVersion==`string`&&typeof t.updateAvailable==`boolean`&&typeof t.profileName==`string`&&typeof t.canAutoUpdate==`boolean`&&typeof t.latestCheckFailed==`boolean`&&(t.latestVersion===void 0||typeof t.latestVersion==`string`)}async function eD(e,t,n){let r=n===void 0?{}:{signal:n},i=await fetch(e,t===`GET`?{cache:`no-store`,...r}:{method:`POST`,headers:{"content-type":`application/json`,"x-michengai-plugin-update":`1`},body:`{}`,...r}),a=await i.json();if(!i.ok||!$E(a))throw Error(typeof a.error==`string`?a.error:ZE().failed);return a}function tD(e,t,n){return`dsh plugin${e.trim()===``?``:` --profile ${e.trim()}`} add ${t}@${n} --registry=https://registry.npmjs.org/`}function nD(e){let t=ZE(),[n,r]=p.default.useState(e.initial),[i,a]=p.default.useState(e.initial===void 0?t.checking:``),[o,s]=p.default.useState(``),[c,l]=p.default.useState(!1),[u,d]=p.default.useState(t.copy),f=e=>{if(e===void 0){a(t.checking),s(``);return}if(e.latestCheckFailed){a(t.failed),s(`error`);return}if(!e.canAutoUpdate&&e.updateAvailable){a(t.unavailable),s(``);return}if(e.updateAvailable){a(`${t.found}: v${e.latestVersion??t.unknown}`),s(``);return}a(t.latest),s(`success`)},m=async()=>{if(!c){l(!0),a(t.checking),s(``);try{let t=await e.refresh();r(t),e.onPayload(t),f(t)}catch(e){a(e instanceof Error?e.message:t.failed),s(`error`)}finally{l(!1)}}},h=async()=>{if(!c){l(!0),a(t.updating),s(``);try{let n=await e.update();r(n),e.onPayload(n),f(n),a(n.autoReload===!0?t.restarting:t.restart),s(`success`)}catch(e){a(e instanceof Error?e.message:t.failed),s(`error`)}finally{l(!1)}}};p.default.useEffect(()=>{m()},[]),fv(!0,e.onClose);let g=tD(n?.profileName??``,e.packageName,n?.latestVersion??`latest`),_=n===void 0?t.unknown:`v${n.currentVersion}`,v=n?.latestVersion===void 0?t.unknown:`v${n.latestVersion}`;return p.default.createElement(ev,{locale:ov()},p.default.createElement(W_,{open:!0,keyboard:!1,className:`mpi-dialog`,width:680,zIndex:1200,title:`${e.name} ${t.update}`,onCancel:e.onClose,footer:[p.default.createElement(V_,{key:`check`,disabled:c,onClick:()=>{m()}},t.recheck),p.default.createElement(V_,{key:`update`,type:`primary`,disabled:c||n?.canAutoUpdate!==!0||n.updateAvailable!==!0,loading:c,onClick:()=>{h()}},t.auto)]},p.default.createElement(`p`,{className:`mpi-intro`},t.intro),p.default.createElement(`dl`,{className:`mpi-meta`},p.default.createElement(`dt`,null,t.current),p.default.createElement(`dd`,null,p.default.createElement(`span`,{className:`mpi-mono`},_)),p.default.createElement(`dt`,null,t.latestLabel),p.default.createElement(`dd`,{className:`mpi-latest`},p.default.createElement(`span`,{className:`mpi-mono`},v),p.default.createElement(`span`,{className:`mpi-status`,role:`status`,"data-kind":o},i)),p.default.createElement(`dt`,null,t.profile),p.default.createElement(`dd`,null,p.default.createElement(`span`,{className:`mpi-mono`},n?.profileName??t.unknown))),c?p.default.createElement(G_,{percent:100,showInfo:!1,status:`active`}):null,p.default.createElement(`section`,{className:`mpi-manual`},p.default.createElement(`h3`,null,t.manual),p.default.createElement(`p`,null,t.manualHint),p.default.createElement(`div`,{className:`mpi-command`},p.default.createElement(`code`,null,g),p.default.createElement(V_,{onClick:()=>{navigator.clipboard?.writeText(g).then(()=>{d(t.copied),setTimeout(()=>d(t.copy),1400)}).catch(()=>d(t.copyFailed))}},u)))))}function rD(e){if(typeof document>`u`||document.body===null)return()=>{};QE();let t=new AbortController,n,r,i,a,o,s,c,l=()=>{o?.unmount(),o=void 0,a=void 0,s=void 0},u=()=>{if(o===void 0)return;s??=e.createIcon(`refresh`);let t=s;o.render(p.default.createElement(ev,{locale:ov()},p.default.createElement(V_,{size:`small`,shape:`default`,onClick:g,icon:p.default.createElement(XE,{node:t})},p.default.createElement(`span`,{"data-mpi-label":``},ZE().check))))},d=()=>{let t=document.querySelector(e.titleRowSelector);if(t===null)return;let r=t.querySelector(`h1,h2`);if(r!==null&&n!==void 0){let t=r.querySelector(`.mpi-version[data-package="${e.packageName}"]`);t===null&&(t=document.createElement(`span`),t.className=`mpi-version`,t.dataset.package=e.packageName,r.append(t));let i=`v${n.currentVersion}`;t.textContent!==i&&(t.textContent=i)}a!==void 0&&!a.isConnected&&l();let i=t.querySelector(e.linksSelector);if(i===null)return;let s=i.querySelector(`[data-mpi-check="${e.packageName}"]`);if(s!==null){let e=s.querySelector(`[data-mpi-label]`);(e===null||e.textContent!==ZE().check)&&u();return}let c=document.createElement(`span`);c.dataset.mpiCheck=e.packageName,c.className=`mpi-check-host`,i.append(c),a=c,o=(0,m.createRoot)(c),u()},f=async()=>(n=await eD(e.endpoint,`GET`,t.signal),d(),n),h=()=>{i?.unmount(),i=void 0,r?.remove(),r=void 0};function g(){h();let a=document.createElement(`div`);a.className=`mpi-dialog-root`,document.body.append(a);let o=(0,m.createRoot)(a);r=a,i=o,o.render(p.default.createElement(nD,{name:av()===`en`?e.enName:e.zhName,packageName:e.packageName,initial:n,refresh:()=>f(),update:()=>eD(e.endpoint,`POST`,t.signal),onPayload:e=>{n=e,d()},onClose:h}))}let _=new MutationObserver(()=>{c===void 0&&(c=window.requestAnimationFrame(()=>{c=void 0,d()}))});return _.observe(document.body,{childList:!0,subtree:!0}),d(),f().catch(()=>{}),()=>{t.abort(),_.disconnect(),h(),l(),c!==void 0&&window.cancelAnimationFrame(c),document.querySelectorAll(`[data-mpi-check="${e.packageName}"],.mpi-version[data-package="${e.packageName}"]`).forEach(e=>e.remove())}}async function iD(e,t,n){let r=await e.getCatalog();if(!r.ok)throw Error(r.error.message);if(t===void 0||!r.value.experts.some(e=>e.slug===t&&e.custom))return{catalog:r.value};let i=await e.getCustomExpert(t);if(!i.ok)throw Error(i.error.message);let a=await e.getCatalog();if(!a.ok)throw Error(a.error.message);if(r.value.revision!==a.value.revision)throw LE(`conflict`,n);return{catalog:a.value,expert:i.value}}function aD(e,t,n){if(n&&e.expert===void 0)throw Error(`No current expert to load`);let{slug:r,...i}=t;return{expert:n?e.expert:e.expert===void 0?i:t,enabled:e.expert?.slug!==void 0&&e.catalog.enabled.includes(e.expert.slug),revision:e.catalog.revision}}let oD=p.default.createElement;function sD(e){let[t,n]=p.default.useState(()=>({...e.expert,name:e.expert?.name??``,description:e.expert?.description??``,division:e.expert?.division??`specialized`,prompt:e.expert?.prompt??``,emoji:e.expert?.emoji||`🧩`,avatar:e.expert?.avatar??0})),[r,i]=p.default.useState(t),[a,o]=p.default.useState(e.revision),[s,c]=p.default.useState(e.enabled),[l,u]=p.default.useState(!1),[d,f]=p.default.useState(null),[m,h]=p.default.useState(!1),g=p.default.useRef(!1),[_,v]=p.default.useState(null),[y,b]=p.default.useState(!1),x=p.default.useRef(null),S=()=>{g.current||(JSON.stringify(r)===JSON.stringify(t)?e.onClose():b(!0))};fv(!0,()=>{y?b(!1):S()});let C=(e,t)=>{i(n=>({...n,[e]:t})),v(null)},w=()=>{g.current||(g.current=!0,h(!0),f(null),iD(e.remote,r.slug,e.locale).then(f).catch(e=>v(e instanceof Error?e.message:String(e))).finally(()=>{g.current=!1,h(!1)}))},T=e=>{if(d===null)return;let t=aD(d,r,e);i({...t.expert,emoji:t.expert.emoji??`🧩`,avatar:t.expert.avatar??0}),d.expert!==void 0&&n(ME.parse(d.expert)),o(t.revision),c(t.enabled),f(null),u(!1),v(null)},E=t=>{if(g.current||l||x.current?.reportValidity()!==!0)return;let n=ME.safeParse(r);if(!n.success){v(e.t(`custom.invalid`));return}g.current=!0,h(!0),v(null),e.remote.saveCustomExpert(n.data,t,a).then(t=>{if(!t.ok)throw Error(t.error.message);e.onSaved(t.value)}).catch(t=>{let n=t instanceof Error?t.message:String(t),r=/changed since it was read|其他窗口|another window/iu.test(n);u(r),r&&f(null),v(r?e.t(`custom.conflict`):n)}).finally(()=>{g.current=!1,h(!1)})},D=(t,n,r=!1)=>oD(`label`,{className:`aag-custom-field`},oD(`span`,null,t,r?oD(`small`,null,e.t(`custom.required`)):null),n);return oD(U_,{open:!0,keyboard:!1,placement:`right`,size:`min(560px, 100vw)`,destroyOnHidden:!0,rootClassName:`aag-editor-drawer`,styles:{body:{padding:0}},title:e.t(r.slug?`custom.edit`:`custom.new`),onClose:()=>{y?b(!1):S()}},oD(`form`,{ref:x,className:`aag-custom-body`,onSubmit:e=>e.preventDefault(),inert:y?``:void 0},oD(`p`,{className:`aag-editor-intro`},e.t(`custom.intro`)),oD(`fieldset`,{className:`aag-custom-avatars`,disabled:m},oD(`legend`,null,e.t(`custom.avatar`)),eE.map((t,n)=>oD(`button`,{key:t,type:`button`,"aria-label":`${e.t(`custom.avatar`)} ${n+1}`,"aria-pressed":r.avatar===n,className:r.avatar===n?`is-selected`:``,onClick:()=>i(e=>({...e,avatar:n}))},oD(`img`,{src:t,width:36,height:36,alt:``,loading:`lazy`})))),D(e.t(`custom.name`),((t,n,i)=>oD(z_,{value:r[t],maxLength:i,required:!0,disabled:m,"aria-label":n,onChange:e=>C(t,e.currentTarget.value),...t===`name`?{placeholder:e.t(`custom.namePlaceholder`)}:{}}))(`name`,e.t(`custom.name`),40),!0),D(e.t(`custom.description`),oD(z_.TextArea,{value:r.description,rows:2,maxLength:160,required:!0,disabled:m,"aria-label":e.t(`custom.description`),placeholder:e.t(`custom.descriptionPlaceholder`),onChange:e=>C(`description`,e.currentTarget.value)}),!0),oD(`div`,{className:`aag-custom-field`},oD(`label`,{htmlFor:`aag-custom-division`},e.t(`custom.division`)),oD(VT,{id:`aag-custom-division`,value:r.division,disabled:m,label:e.t(`custom.division`),onChange:e=>C(`division`,e),options:e.divisions.map(t=>({value:t,label:(e.locale===`en`?_v:gv)[t]??t}))})),oD(`div`,{className:`aag-custom-prompt-head`},oD(`label`,{htmlFor:`aag-custom-prompt`},e.t(`custom.prompt`)),r.prompt===``?oD(V_,{disabled:m,onClick:()=>C(`prompt`,e.t(`custom.templateText`))},e.t(`custom.template`)):null),oD(z_.TextArea,{id:`aag-custom-prompt`,className:`aag-custom-prompt`,value:r.prompt,rows:8,required:!0,maxLength:2e4,disabled:m,"aria-label":e.t(`custom.prompt`),placeholder:e.t(`custom.promptPlaceholder`),onChange:e=>C(`prompt`,e.currentTarget.value)}),_===null?null:oD(`div`,{className:`aag-error`,role:`alert`},_),l?oD(`section`,{className:`aag-custom-review`},oD(V_,{disabled:m,onClick:w},e.t(`custom.reviewLatest`)),d===null?null:oD(p.default.Fragment,null,oD(`h4`,null,e.t(`custom.latestContent`)),d.expert===void 0?oD(`p`,null,e.t(r.slug?`custom.reviewDeleted`:`custom.reviewNew`)):oD(p.default.Fragment,null,oD(`p`,null,d.expert.name),oD(`p`,null,d.expert.description),oD(`p`,null,e.locale===`zh`?gv[d.expert.division]??d.expert.division:_v[d.expert.division]??d.expert.division),oD(`img`,{src:eE[d.expert.avatar??0],width:36,height:36,alt:e.t(`custom.avatar`)}),oD(z_.TextArea,{readOnly:!0,value:d.expert.prompt,"aria-label":e.t(`custom.latestContent`),rows:8})),oD(`p`,null,e.t(`custom.reviewHint`)),oD(`div`,{className:`aag-custom-review-actions`},oD(V_,{disabled:m,onClick:()=>T(!1)},e.t(r.slug&&d.expert===void 0?`custom.continueAsNew`:`custom.keepDraft`)),d.expert===void 0?null:oD(V_,{disabled:m,onClick:()=>T(!0)},e.t(`custom.useLatest`))))):null),oD(pv,{editing:!!r.slug,busy:m,blocked:l,inert:y,help:e.t(`custom.enableHint`),cancelLabel:e.t(`custom.cancel`),saveLabel:e.t(`custom.save`),primaryLabel:e.t(m?`custom.saving`:r.slug?`custom.saveChanges`:`custom.saveEnable`),close:S,save:()=>E(!1),primary:()=>E(!r.slug||s)}),y?oD(hv,{title:e.t(`custom.discardTitle`),cancelLabel:e.t(`custom.keep`),confirmLabel:e.t(`custom.discard`),close:()=>b(!1),confirm:e.onClose},oD(`p`,null,e.t(`custom.discardTitle`))):null)}function cD(e){return oD(hv,{title:e.t(`custom.deleteTitle`),busy:e.busy,error:e.error,cancelLabel:e.t(`custom.cancel`),confirmLabel:e.t(`custom.delete`),close:e.close,confirm:e.confirm},oD(`p`,null,e.name),oD(`p`,{className:`aag-note`},e.t(`custom.deleteHint`)))}function lD(e,t){let n=new Map,r=new WeakMap,i=new Map,a=!1,o=0,s=()=>{let e=!1;for(let[e]of n)e.isConnected||n.delete(e);for(let t of document.querySelectorAll(`[class$="_roster"] > button > span[class$="_memberText"] > span:first-child`)){let a=t.firstChild;if(!(a instanceof Text)||t.childNodes.length!==1)continue;let o=n.get(a),s=o&&a.data===o.shown?o.original:a.data;if(!/^agency-[a-z0-9-]+-[0-9a-f]{10}$/u.test(s)){n.delete(a);continue}r.get(a)!==s&&(r.set(a,s),e=!0);let c=i.get(s)??s;n.set(a,{original:s,shown:c}),a.data!==c&&(a.data=c)}return e},c=async()=>{let n=++o;try{let t=await e();if(a||n!==o)return;i=t,s()}catch(e){!a&&n===o&&t(e)}},l=new MutationObserver(()=>{s()&&c()});return l.observe(document.body,{childList:!0,subtree:!0,characterData:!0}),s()&&c(),{refresh:c,dispose(){a=!0,l.disconnect();for(let[e,t]of n)e.data===t.shown&&(e.data=t.original);n.clear()}}}let uD=`@michengai/dsh-agency-agents`,dD=`agency`,fD=1600,pD={refresh:[`M13.5 5.5V2.5m0 0h-3m3 0-2.1 2.1A5.5 5.5 0 1 0 13.2 12`],download:[`M8 2v8m0 0 3-3m-3 3-3-3M3 13v2h10v-2`],copy:[`M5 5h8v8H5z`,`M3 3h8`],close:[`m4 4 8 8M12 4 4 12`]};function mD(e){let t=document.createElement(`span`),n=document.createElementNS(`http://www.w3.org/2000/svg`,`svg`);n.setAttribute(`viewBox`,`0 0 16 16`),n.setAttribute(`width`,`16`),n.setAttribute(`height`,`16`),n.setAttribute(`fill`,`none`),n.setAttribute(`stroke`,`currentColor`),n.setAttribute(`stroke-width`,`1.5`),n.setAttribute(`stroke-linecap`,`round`),n.setAttribute(`stroke-linejoin`,`round`),n.setAttribute(`aria-hidden`,`true`);for(let t of pD[e]){let e=document.createElementNS(`http://www.w3.org/2000/svg`,`path`);e.setAttribute(`d`,t),n.append(e)}return t.append(n),t}function hD(e,...t){let{size:n=24,strokeWidth:r=2,...i}=e;return p.default.createElement(`svg`,{...i,viewBox:`0 0 24 24`,width:n,height:n,fill:`none`,stroke:`currentColor`,strokeWidth:r,strokeLinecap:`round`,strokeLinejoin:`round`,focusable:!1},...t)}function gD(e){return hD(e,p.default.createElement(`rect`,{x:9,y:9,width:13,height:13,rx:2}),p.default.createElement(`path`,{d:`M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1`}))}function _D(e){return hD(e,p.default.createElement(`path`,{d:`M2.06 12a10.7 10.7 0 0 1 19.88 0 10.7 10.7 0 0 1-19.88 0`}),p.default.createElement(`circle`,{cx:12,cy:12,r:3}))}function vD(e){return hD(e,p.default.createElement(`circle`,{cx:11,cy:11,r:8}),p.default.createElement(`path`,{d:`m21 21-4.3-4.3`}))}let yD=[{href:`https://github.com/MichengAI/dsh-agency-agents`,labelKey:`settings.viewProject`,icon:`github`},{href:`https://github.com/MichengAI/dsh-agency-agents/issues`,labelKey:`settings.feedback`,icon:`feedback`}],bD=[`company`,`design`,`engineering`,`finance`,`game-development`,`gis`,`healthcare`,`hr`,`legal`,`marketing`,`paid-media`,`product`,`project-management`,`research`,`sales`,`security`,`spatial-computing`,`specialized`,`support`,`testing`,`supply-chain`,`academic`],xD={development:new Set([`engineering`,`game-development`,`gis`,`security`,`spatial-computing`,`testing`]),design:new Set([`design`]),product:new Set([`company`,`hr`,`product`,`project-management`,`sales`,`supply-chain`,`support`]),research:new Set([`academic`,`finance`,`healthcare`,`legal`,`research`]),writing:new Set([`marketing`,`paid-media`,`specialized`])},SD=bE.map(e=>({slug:e.slug,name:vv[e.slug]??e.nameEn,nameEn:e.nameEn,emoji:e.emoji,division:e.division,divisionZh:gv[e.division]??e.division,divisionEn:_v[e.division]??e.division,description:e.description,descriptionEn:e.descriptionEn})).sort((e,t)=>e.division.localeCompare(t.division)||e.slug.localeCompare(t.slug));function CD(e,t,n){let r=n===`en`?e.nameEn:e.name,i=n===`en`?t.nameEn:t.name;return r.localeCompare(i,n===`en`?`en`:`zh`)}function wD(e,t){let n=new Map;for(let t of e){let e=n.get(t.division)??[];e.push(t),n.set(t.division,e)}return[...new Set([...bD,...n.keys()])].filter(e=>n.has(e)).map(e=>({division:e,divisionZh:gv[e]??e,experts:(n.get(e)??[]).slice().sort((e,n)=>CD(e,n,t))}))}function TD(e){return e.normalize(`NFKC`).trim().replace(/\s+/gu,` `).toLowerCase()}function ED(e,t){let n=TD(t);if(n===``)return!0;let r=[...e.slug.startsWith(`custom-`)?[]:[e.slug],e.name,e.nameEn,e.division,e.divisionZh,e.divisionEn,e.description,e.descriptionEn].map(TD);return n.split(` `).every(e=>r.some(t=>/^[a-z0-9]+$/u.test(e)?(t.match(/[a-z0-9]+/gu)??[]).some(t=>e.length<=2?t===e:t.startsWith(e)):t.includes(e)))}function DD(e,t){let n=t.division??``;return e.filter(e=>(n===``||e.division===n)&&ED(e,t.query??``))}function OD(){return[``,...bD]}function kD(e,t){let n=[],r=[];for(let i of e)t.has(i.slug)?n.push(i):r.push(i);return[...n,...r]}function AD(e,t){let n=new Map(t.map((e,t)=>[e,t]));return e.slice().sort((e,t)=>(n.get(e.slug)??2**53-1)-(n.get(t.slug)??2**53-1))}function jD(e,t){if(t<=0)return 0;let n=2166136261;for(let t=0;t<e.length;t+=1)n=Math.imul(n^e.charCodeAt(t),16777619);return(n>>>0)%t}let MD={development:[1,5,9,10,11,12,13,14,15,16,17,18],writing:[3,7,19,20,21,22,23,24],product:[0,8,25,26,27,28],research:[2,4,29,30,31,32],design:[6,33,34,35]},ND=Object.values(MD).flat();function PD(e){return Object.entries(xD).find(([,t])=>t.has(e))?.[0]}function FD(e,t){return`${t}\u0000${e}`}let ID=new Map;for(let[e,t]of Object.entries(MD))SD.filter(t=>xD[e].has(t.division)).slice().sort((e,t)=>e.slug.localeCompare(t.slug,`en`)).forEach((e,n)=>{ID.set(FD(e.slug,e.division),t[n%t.length]??0)});function LD(e,t){let n=ID.get(FD(e,t));if(n!==void 0)return n;let r=PD(t),i=r===void 0?ND:MD[r];return i[jD(e,i.length)]??0}function RD(e,t){return t===`en`?e.nameEn:e.name}function zD(e,t){return t===`en`?e.nameEn:e.name}function BD(e){let t=e.custom?e.avatar??0:LD(e.slug,e.division);return eE[t]??eE[0]}function VD(e,t,n){let r=SD.find(t=>t.slug===e);return r===void 0?t:RD(r,n)}function HD(e){return`@${e.trim().replace(/^@+/,``)}`}function UD(e){return`${HD(e)}\u00A0`}function WD(e,t,n){return e.filter(e=>t.has(e.slug)).map(e=>n===`en`?e.nameEn:e.name)}function GD(e,t){return(t===`en`?_v:gv)[e]??e}function KD(e){return`${uD}:${e}`}function qD(e,t){let n=t===`en`?e.nameEn:e.name;return{source:KD(e.division),ref:e.slug,label:n,appearance:`session`,clipboardText:UD(n)}}function JD(e,t,n=SD){let r=n.find(t=>t.slug===e);return r===void 0?t===`en`?`@Removed expert (please reselect)\xA0`:`@已移除专家(请重新选择)\xA0`:UD(RD(r,t))}function YD(e,t){return t===`en`&&e.descriptionEn!==``?e.descriptionEn:e.description}let XD=bD.map(e=>KD(e)).map(e=>`[role="listbox"] div[data-source=${JSON.stringify(e)}] ~ button`).map(e=>`${e} span:last-child`).join(`,`),ZD=`.aag-btn-wrap{position:relative;order:1;display:inline-flex;flex:0 0 auto}.aag-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:28px;padding:0 8px;white-space:nowrap;border:none;border-radius:24px;background:transparent;color:var(--dsw-alias-label-secondary);font-size:13px;line-height:20px;font-weight:500;cursor:pointer}.aag-btn:hover,.aag-btn[aria-expanded="true"]{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.aag-btn:focus-visible{outline:2px solid var(--dsw-alias-label-secondary);outline-offset:2px}.aag-btn>svg{flex:none}.aag-menu{position:absolute;bottom:calc(100% + 4px);left:0;box-sizing:border-box;padding:4px;display:flex;flex-direction:column;gap:0;width:300px;max-width:360px;max-height:calc(100dvh - 24px);overflow-y:auto;border:0;border-radius:20px;background:var(--dsw-specific-menu);backdrop-filter:var(--dsw-menu-backdrop-filter);box-shadow:var(--dsw-elevation-prominent);z-index:10000}.aag-menu[data-placement="below"]{top:calc(100% + 4px);bottom:auto}.aag-menu-title{padding:8px 10px;font-size:12px;line-height:16px;color:var(--dsw-alias-label-tertiary)}.aag-menu-item{display:flex;align-items:center;gap:8px;width:100%;min-height:40px;padding:8px 10px;border:none;border-radius:10px;background:transparent;cursor:pointer;text-align:left;font-size:14px;line-height:22px;color:var(--dsw-alias-label-primary);box-sizing:border-box}.aag-menu-item:hover{background:var(--dsw-alias-interactive-bg-hover)}.aag-menu-empty{padding:8px 10px;color:var(--dsw-alias-label-secondary);font-size:13px}`,QD=`
431
+ .mpi-intro{margin:0 0 16px;color:var(--dsw-alias-label-secondary);font-size:13px;line-height:20px}.mpi-meta{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:8px 18px;margin:0 0 16px;font-size:12px;line-height:18px}.mpi-meta dt{color:var(--dsw-alias-label-secondary)}.mpi-meta dd{margin:0}.mpi-mono{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.mpi-latest{display:flex;align-items:baseline;flex-wrap:wrap;gap:4px 10px}.mpi-status{font-size:13px;font-weight:600;line-height:18px}.mpi-status[data-kind=error]{color:var(--dsw-alias-state-error-primary)}.mpi-status[data-kind=success]{color:var(--dsw-alias-state-success-primary)}.mpi-status[data-kind=update]{color:#e8b15a !important}.mpi-manual{border-top:1px solid var(--dsw-alias-border-l2);padding-top:16px}.mpi-manual h3{margin:0 0 6px;font-size:14px;line-height:20px}.mpi-manual p{margin:0 0 10px;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:18px}.mpi-command{display:flex;align-items:flex-start;gap:8px;border:1px solid var(--dsw-alias-border-l2);border-radius:7px;padding:10px;background:var(--dsw-alias-bg-layer-3,var(--dsw-specific-menu-item-hover))}.mpi-command code{min-width:0;flex:1;overflow:visible;font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:12px;line-height:18px;white-space:pre-wrap;overflow-wrap:anywhere}@media(max-width:560px){.mpi-meta{grid-template-columns:1fr;gap:2px}.mpi-meta dd{margin-bottom:6px}}
432
+ `,(document.head??document.documentElement).append(e)}function $E(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.packageName==`string`&&typeof t.currentVersion==`string`&&typeof t.updateAvailable==`boolean`&&typeof t.profileName==`string`&&typeof t.canAutoUpdate==`boolean`&&typeof t.latestCheckFailed==`boolean`&&(t.latestVersion===void 0||typeof t.latestVersion==`string`)}async function eD(e,t,n){let r=n===void 0?{}:{signal:n},i=await fetch(e,t===`GET`?{cache:`no-store`,...r}:{method:`POST`,headers:{"content-type":`application/json`,"x-michengai-plugin-update":`1`},body:`{}`,...r}),a=await i.json();if(!i.ok||!$E(a))throw Error(typeof a.error==`string`?a.error:ZE().failed);return a}function tD(e,t,n){return`dsh plugin${e.trim()===``?``:` --profile ${e.trim()}`} add ${t}@${n} --registry=https://registry.npmjs.org/`}function nD(e){let t=ZE(),[n,r]=p.default.useState(e.initial),[i,a]=p.default.useState(e.initial===void 0?t.checking:``),[o,s]=p.default.useState(``),[c,l]=p.default.useState(!1),[u,d]=p.default.useState(t.copy),f=e=>{if(e===void 0){a(t.checking),s(``);return}if(e.latestCheckFailed){a(t.failed),s(`error`);return}if(!e.canAutoUpdate&&e.updateAvailable){a(t.unavailable),s(`update`);return}if(e.updateAvailable){a(`${t.found}: v${e.latestVersion??t.unknown}`),s(`update`);return}a(t.latest),s(`success`)},m=async()=>{if(!c){l(!0),a(t.checking),s(``);try{let t=await e.refresh();r(t),e.onPayload(t),f(t)}catch(e){a(e instanceof Error?e.message:t.failed),s(`error`)}finally{l(!1)}}},h=async()=>{if(!c){l(!0),a(t.updating),s(``);try{let n=await e.update();r(n),e.onPayload(n),f(n),a(n.autoReload===!0?t.restarting:n.profileName===`desktop`?t.restartDesktop:t.restart),s(`success`)}catch(e){a(e instanceof Error?e.message:t.failed),s(`error`)}finally{l(!1)}}};p.default.useEffect(()=>{m()},[]),fv(!0,e.onClose);let g=tD(n?.profileName??``,e.packageName,n?.latestVersion??`latest`),_=n===void 0?t.unknown:`v${n.currentVersion}`,v=n?.latestVersion===void 0?t.unknown:`v${n.latestVersion}`;return p.default.createElement(ev,{locale:ov()},p.default.createElement(W_,{open:!0,keyboard:!1,className:`mpi-dialog`,width:680,zIndex:1200,title:`${e.name} ${t.update}`,onCancel:e.onClose,footer:[p.default.createElement(V_,{key:`check`,disabled:c,onClick:()=>{m()}},t.recheck),p.default.createElement(V_,{key:`update`,type:`primary`,disabled:c||n?.canAutoUpdate!==!0||n.updateAvailable!==!0,loading:c,onClick:()=>{h()}},t.auto)]},p.default.createElement(`p`,{className:`mpi-intro`},t.intro),p.default.createElement(`dl`,{className:`mpi-meta`},p.default.createElement(`dt`,null,t.current),p.default.createElement(`dd`,null,p.default.createElement(`span`,{className:`mpi-mono`},_)),p.default.createElement(`dt`,null,t.latestLabel),p.default.createElement(`dd`,{className:`mpi-latest`},p.default.createElement(`span`,{className:`mpi-mono`},v),p.default.createElement(`span`,{className:`mpi-status`,role:`status`,"data-kind":o,...o===`update`?{style:{color:`#e8b15a`}}:{}},i)),p.default.createElement(`dt`,null,t.profile),p.default.createElement(`dd`,null,p.default.createElement(`span`,{className:`mpi-mono`},n?.profileName??t.unknown))),c?p.default.createElement(G_,{percent:100,showInfo:!1,status:`active`}):null,p.default.createElement(`section`,{className:`mpi-manual`},p.default.createElement(`h3`,null,t.manual),p.default.createElement(`p`,null,n?.profileName===`desktop`?t.manualHintDesktop:t.manualHint),p.default.createElement(`div`,{className:`mpi-command`},p.default.createElement(`code`,null,g),p.default.createElement(V_,{onClick:()=>{navigator.clipboard?.writeText(g).then(()=>{d(t.copied),setTimeout(()=>d(t.copy),1400)}).catch(()=>d(t.copyFailed))}},u)))))}function rD(e){if(typeof document>`u`||document.body===null)return()=>{};QE();let t=new AbortController,n,r,i,a,o,s,c,l=()=>{o?.unmount(),o=void 0,a=void 0,s=void 0},u=()=>{if(o===void 0)return;s??=e.createIcon(`refresh`);let t=s;o.render(p.default.createElement(ev,{locale:ov()},p.default.createElement(V_,{size:`small`,shape:`default`,onClick:g,icon:p.default.createElement(XE,{node:t})},p.default.createElement(`span`,{"data-mpi-label":``},ZE().check))))},d=()=>{let t=document.querySelector(e.titleRowSelector);if(t===null)return;let r=t.querySelector(`h1,h2`);if(r!==null&&n!==void 0){let t=r.querySelector(`.mpi-version[data-package="${e.packageName}"]`);t===null&&(t=document.createElement(`span`),t.className=`mpi-version`,t.dataset.package=e.packageName,r.append(t));let i=`v${n.currentVersion}`;t.textContent!==i&&(t.textContent=i)}a!==void 0&&!a.isConnected&&l();let i=t.querySelector(e.linksSelector);if(i===null)return;let s=i.querySelector(`[data-mpi-check="${e.packageName}"]`);if(s!==null){let e=s.querySelector(`[data-mpi-label]`);(e===null||e.textContent!==ZE().check)&&u();return}let c=document.createElement(`span`);c.dataset.mpiCheck=e.packageName,c.className=`mpi-check-host`,i.append(c),a=c,o=(0,m.createRoot)(c),u()},f=async()=>(n=await eD(e.endpoint,`GET`,t.signal),d(),n),h=()=>{i?.unmount(),i=void 0,r?.remove(),r=void 0};function g(){h();let a=document.createElement(`div`);a.className=`mpi-dialog-root`,document.body.append(a);let o=(0,m.createRoot)(a);r=a,i=o,o.render(p.default.createElement(nD,{name:av()===`en`?e.enName:e.zhName,packageName:e.packageName,initial:n,refresh:()=>f(),update:()=>eD(e.endpoint,`POST`,t.signal),onPayload:e=>{n=e,d()},onClose:h}))}let _=new MutationObserver(()=>{c===void 0&&(c=window.requestAnimationFrame(()=>{c=void 0,d()}))});return _.observe(document.body,{childList:!0,subtree:!0}),d(),f().catch(()=>{}),()=>{t.abort(),_.disconnect(),h(),l(),c!==void 0&&window.cancelAnimationFrame(c),document.querySelectorAll(`[data-mpi-check="${e.packageName}"],.mpi-version[data-package="${e.packageName}"]`).forEach(e=>e.remove())}}async function iD(e,t,n){let r=await e.getCatalog();if(!r.ok)throw Error(r.error.message);if(t===void 0||!r.value.experts.some(e=>e.slug===t&&e.custom))return{catalog:r.value};let i=await e.getCustomExpert(t);if(!i.ok)throw Error(i.error.message);let a=await e.getCatalog();if(!a.ok)throw Error(a.error.message);if(r.value.revision!==a.value.revision)throw LE(`conflict`,n);return{catalog:a.value,expert:i.value}}function aD(e,t,n){if(n&&e.expert===void 0)throw Error(`No current expert to load`);let{slug:r,...i}=t;return{expert:n?e.expert:e.expert===void 0?i:t,enabled:e.expert?.slug!==void 0&&e.catalog.enabled.includes(e.expert.slug),revision:e.catalog.revision}}let oD=p.default.createElement;function sD(e){let[t,n]=p.default.useState(()=>({...e.expert,name:e.expert?.name??``,description:e.expert?.description??``,division:e.expert?.division??`specialized`,prompt:e.expert?.prompt??``,emoji:e.expert?.emoji||`🧩`,avatar:e.expert?.avatar??0})),[r,i]=p.default.useState(t),[a,o]=p.default.useState(e.revision),[s,c]=p.default.useState(e.enabled),[l,u]=p.default.useState(!1),[d,f]=p.default.useState(null),[m,h]=p.default.useState(!1),g=p.default.useRef(!1),[_,v]=p.default.useState(null),[y,b]=p.default.useState(!1),x=p.default.useRef(null),S=()=>{g.current||(JSON.stringify(r)===JSON.stringify(t)?e.onClose():b(!0))};fv(!0,()=>{y?b(!1):S()});let C=(e,t)=>{i(n=>({...n,[e]:t})),v(null)},w=()=>{g.current||(g.current=!0,h(!0),f(null),iD(e.remote,r.slug,e.locale).then(f).catch(e=>v(e instanceof Error?e.message:String(e))).finally(()=>{g.current=!1,h(!1)}))},T=e=>{if(d===null)return;let t=aD(d,r,e);i({...t.expert,emoji:t.expert.emoji??`🧩`,avatar:t.expert.avatar??0}),d.expert!==void 0&&n(ME.parse(d.expert)),o(t.revision),c(t.enabled),f(null),u(!1),v(null)},E=t=>{if(g.current||l||x.current?.reportValidity()!==!0)return;let n=ME.safeParse(r);if(!n.success){v(e.t(`custom.invalid`));return}g.current=!0,h(!0),v(null),e.remote.saveCustomExpert(n.data,t,a).then(t=>{if(!t.ok)throw Error(t.error.message);e.onSaved(t.value)}).catch(t=>{let n=t instanceof Error?t.message:String(t),r=/changed since it was read|其他窗口|another window/iu.test(n);u(r),r&&f(null),v(r?e.t(`custom.conflict`):n)}).finally(()=>{g.current=!1,h(!1)})},D=(t,n,r=!1)=>oD(`label`,{className:`aag-custom-field`},oD(`span`,null,t,r?oD(`small`,null,e.t(`custom.required`)):null),n);return oD(U_,{open:!0,keyboard:!1,placement:`right`,size:`min(560px, 100vw)`,destroyOnHidden:!0,rootClassName:`aag-editor-drawer`,styles:{body:{padding:0}},title:e.t(r.slug?`custom.edit`:`custom.new`),onClose:()=>{y?b(!1):S()}},oD(`form`,{ref:x,className:`aag-custom-body`,onSubmit:e=>e.preventDefault(),inert:y?``:void 0},oD(`p`,{className:`aag-editor-intro`},e.t(`custom.intro`)),oD(`fieldset`,{className:`aag-custom-avatars`,disabled:m},oD(`legend`,null,e.t(`custom.avatar`)),eE.map((t,n)=>oD(`button`,{key:t,type:`button`,"aria-label":`${e.t(`custom.avatar`)} ${n+1}`,"aria-pressed":r.avatar===n,className:r.avatar===n?`is-selected`:``,onClick:()=>i(e=>({...e,avatar:n}))},oD(`img`,{src:t,width:36,height:36,alt:``,loading:`lazy`})))),D(e.t(`custom.name`),((t,n,i)=>oD(z_,{value:r[t],maxLength:i,required:!0,disabled:m,"aria-label":n,onChange:e=>C(t,e.currentTarget.value),...t===`name`?{placeholder:e.t(`custom.namePlaceholder`)}:{}}))(`name`,e.t(`custom.name`),40),!0),D(e.t(`custom.description`),oD(z_.TextArea,{value:r.description,rows:2,maxLength:160,required:!0,disabled:m,"aria-label":e.t(`custom.description`),placeholder:e.t(`custom.descriptionPlaceholder`),onChange:e=>C(`description`,e.currentTarget.value)}),!0),oD(`div`,{className:`aag-custom-field`},oD(`label`,{htmlFor:`aag-custom-division`},e.t(`custom.division`)),oD(VT,{id:`aag-custom-division`,value:r.division,disabled:m,label:e.t(`custom.division`),onChange:e=>C(`division`,e),options:e.divisions.map(t=>({value:t,label:(e.locale===`en`?_v:gv)[t]??t}))})),oD(`div`,{className:`aag-custom-prompt-head`},oD(`label`,{htmlFor:`aag-custom-prompt`},e.t(`custom.prompt`)),r.prompt===``?oD(V_,{disabled:m,onClick:()=>C(`prompt`,e.t(`custom.templateText`))},e.t(`custom.template`)):null),oD(z_.TextArea,{id:`aag-custom-prompt`,className:`aag-custom-prompt`,value:r.prompt,rows:8,required:!0,maxLength:2e4,disabled:m,"aria-label":e.t(`custom.prompt`),placeholder:e.t(`custom.promptPlaceholder`),onChange:e=>C(`prompt`,e.currentTarget.value)}),_===null?null:oD(`div`,{className:`aag-error`,role:`alert`},_),l?oD(`section`,{className:`aag-custom-review`},oD(V_,{disabled:m,onClick:w},e.t(`custom.reviewLatest`)),d===null?null:oD(p.default.Fragment,null,oD(`h4`,null,e.t(`custom.latestContent`)),d.expert===void 0?oD(`p`,null,e.t(r.slug?`custom.reviewDeleted`:`custom.reviewNew`)):oD(p.default.Fragment,null,oD(`p`,null,d.expert.name),oD(`p`,null,d.expert.description),oD(`p`,null,e.locale===`zh`?gv[d.expert.division]??d.expert.division:_v[d.expert.division]??d.expert.division),oD(`img`,{src:eE[d.expert.avatar??0],width:36,height:36,alt:e.t(`custom.avatar`)}),oD(z_.TextArea,{readOnly:!0,value:d.expert.prompt,"aria-label":e.t(`custom.latestContent`),rows:8})),oD(`p`,null,e.t(`custom.reviewHint`)),oD(`div`,{className:`aag-custom-review-actions`},oD(V_,{disabled:m,onClick:()=>T(!1)},e.t(r.slug&&d.expert===void 0?`custom.continueAsNew`:`custom.keepDraft`)),d.expert===void 0?null:oD(V_,{disabled:m,onClick:()=>T(!0)},e.t(`custom.useLatest`))))):null),oD(pv,{editing:!!r.slug,busy:m,blocked:l,inert:y,help:e.t(`custom.enableHint`),cancelLabel:e.t(`custom.cancel`),saveLabel:e.t(`custom.save`),primaryLabel:e.t(m?`custom.saving`:r.slug?`custom.saveChanges`:`custom.saveEnable`),close:S,save:()=>E(!1),primary:()=>E(!r.slug||s)}),y?oD(hv,{title:e.t(`custom.discardTitle`),cancelLabel:e.t(`custom.keep`),confirmLabel:e.t(`custom.discard`),close:()=>b(!1),confirm:e.onClose},oD(`p`,null,e.t(`custom.discardTitle`))):null)}function cD(e){return oD(hv,{title:e.t(`custom.deleteTitle`),busy:e.busy,error:e.error,cancelLabel:e.t(`custom.cancel`),confirmLabel:e.t(`custom.delete`),close:e.close,confirm:e.confirm},oD(`p`,null,e.name),oD(`p`,{className:`aag-note`},e.t(`custom.deleteHint`)))}function lD(e,t){let n=new Map,r=new WeakMap,i=new Map,a=!1,o=0,s=()=>{let e=!1;for(let[e]of n)e.isConnected||n.delete(e);for(let t of document.querySelectorAll(`[class$="_roster"] > button > span[class$="_memberText"] > span:first-child`)){let a=t.firstChild;if(!(a instanceof Text)||t.childNodes.length!==1)continue;let o=n.get(a),s=o&&a.data===o.shown?o.original:a.data;if(!/^agency-[a-z0-9-]+-[0-9a-f]{10}$/u.test(s)){n.delete(a);continue}r.get(a)!==s&&(r.set(a,s),e=!0);let c=i.get(s)??s;n.set(a,{original:s,shown:c}),a.data!==c&&(a.data=c)}return e},c=async()=>{let n=++o;try{let t=await e();if(a||n!==o)return;i=t,s()}catch(e){!a&&n===o&&t(e)}},l=new MutationObserver(()=>{s()&&c()});return l.observe(document.body,{childList:!0,subtree:!0,characterData:!0}),s()&&c(),{refresh:c,dispose(){a=!0,l.disconnect();for(let[e,t]of n)e.data===t.shown&&(e.data=t.original);n.clear()}}}let uD=`@michengai/dsh-agency-agents`,dD=`agency`,fD=1600,pD={refresh:[`M13.5 5.5V2.5m0 0h-3m3 0-2.1 2.1A5.5 5.5 0 1 0 13.2 12`],download:[`M8 2v8m0 0 3-3m-3 3-3-3M3 13v2h10v-2`],copy:[`M5 5h8v8H5z`,`M3 3h8`],close:[`m4 4 8 8M12 4 4 12`]};function mD(e){let t=document.createElement(`span`),n=document.createElementNS(`http://www.w3.org/2000/svg`,`svg`);n.setAttribute(`viewBox`,`0 0 16 16`),n.setAttribute(`width`,`16`),n.setAttribute(`height`,`16`),n.setAttribute(`fill`,`none`),n.setAttribute(`stroke`,`currentColor`),n.setAttribute(`stroke-width`,`1.5`),n.setAttribute(`stroke-linecap`,`round`),n.setAttribute(`stroke-linejoin`,`round`),n.setAttribute(`aria-hidden`,`true`);for(let t of pD[e]){let e=document.createElementNS(`http://www.w3.org/2000/svg`,`path`);e.setAttribute(`d`,t),n.append(e)}return t.append(n),t}function hD(e,...t){let{size:n=24,strokeWidth:r=2,...i}=e;return p.default.createElement(`svg`,{...i,viewBox:`0 0 24 24`,width:n,height:n,fill:`none`,stroke:`currentColor`,strokeWidth:r,strokeLinecap:`round`,strokeLinejoin:`round`,focusable:!1},...t)}function gD(e){return hD(e,p.default.createElement(`rect`,{x:9,y:9,width:13,height:13,rx:2}),p.default.createElement(`path`,{d:`M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1`}))}function _D(e){return hD(e,p.default.createElement(`path`,{d:`M2.06 12a10.7 10.7 0 0 1 19.88 0 10.7 10.7 0 0 1-19.88 0`}),p.default.createElement(`circle`,{cx:12,cy:12,r:3}))}function vD(e){return hD(e,p.default.createElement(`circle`,{cx:11,cy:11,r:8}),p.default.createElement(`path`,{d:`m21 21-4.3-4.3`}))}let yD=[{href:`https://github.com/MichengAI/dsh-agency-agents`,labelKey:`settings.viewProject`,icon:`github`},{href:`https://github.com/MichengAI/dsh-agency-agents/issues`,labelKey:`settings.feedback`,icon:`feedback`}],bD=[`company`,`design`,`engineering`,`finance`,`game-development`,`gis`,`healthcare`,`hr`,`legal`,`marketing`,`paid-media`,`product`,`project-management`,`research`,`sales`,`security`,`spatial-computing`,`specialized`,`support`,`testing`,`supply-chain`,`academic`],xD={development:new Set([`engineering`,`game-development`,`gis`,`security`,`spatial-computing`,`testing`]),design:new Set([`design`]),product:new Set([`company`,`hr`,`product`,`project-management`,`sales`,`supply-chain`,`support`]),research:new Set([`academic`,`finance`,`healthcare`,`legal`,`research`]),writing:new Set([`marketing`,`paid-media`,`specialized`])},SD=bE.map(e=>({slug:e.slug,name:vv[e.slug]??e.nameEn,nameEn:e.nameEn,emoji:e.emoji,division:e.division,divisionZh:gv[e.division]??e.division,divisionEn:_v[e.division]??e.division,description:e.description,descriptionEn:e.descriptionEn})).sort((e,t)=>e.division.localeCompare(t.division)||e.slug.localeCompare(t.slug));function CD(e,t,n){let r=n===`en`?e.nameEn:e.name,i=n===`en`?t.nameEn:t.name;return r.localeCompare(i,n===`en`?`en`:`zh`)}function wD(e,t){let n=new Map;for(let t of e){let e=n.get(t.division)??[];e.push(t),n.set(t.division,e)}return[...new Set([...bD,...n.keys()])].filter(e=>n.has(e)).map(e=>({division:e,divisionZh:gv[e]??e,experts:(n.get(e)??[]).slice().sort((e,n)=>CD(e,n,t))}))}function TD(e){return e.normalize(`NFKC`).trim().replace(/\s+/gu,` `).toLowerCase()}function ED(e,t){let n=TD(t);if(n===``)return!0;let r=[...e.slug.startsWith(`custom-`)?[]:[e.slug],e.name,e.nameEn,e.division,e.divisionZh,e.divisionEn,e.description,e.descriptionEn].map(TD);return n.split(` `).every(e=>r.some(t=>/^[a-z0-9]+$/u.test(e)?(t.match(/[a-z0-9]+/gu)??[]).some(t=>e.length<=2?t===e:t.startsWith(e)):t.includes(e)))}function DD(e,t){let n=t.division??``;return e.filter(e=>(n===``||e.division===n)&&ED(e,t.query??``))}function OD(){return[``,...bD]}function kD(e,t){let n=[],r=[];for(let i of e)t.has(i.slug)?n.push(i):r.push(i);return[...n,...r]}function AD(e,t){let n=new Map(t.map((e,t)=>[e,t]));return e.slice().sort((e,t)=>(n.get(e.slug)??2**53-1)-(n.get(t.slug)??2**53-1))}function jD(e,t){if(t<=0)return 0;let n=2166136261;for(let t=0;t<e.length;t+=1)n=Math.imul(n^e.charCodeAt(t),16777619);return(n>>>0)%t}let MD={development:[1,5,9,10,11,12,13,14,15,16,17,18],writing:[3,7,19,20,21,22,23,24],product:[0,8,25,26,27,28],research:[2,4,29,30,31,32],design:[6,33,34,35]},ND=Object.values(MD).flat();function PD(e){return Object.entries(xD).find(([,t])=>t.has(e))?.[0]}function FD(e,t){return`${t}\u0000${e}`}let ID=new Map;for(let[e,t]of Object.entries(MD))SD.filter(t=>xD[e].has(t.division)).slice().sort((e,t)=>e.slug.localeCompare(t.slug,`en`)).forEach((e,n)=>{ID.set(FD(e.slug,e.division),t[n%t.length]??0)});function LD(e,t){let n=ID.get(FD(e,t));if(n!==void 0)return n;let r=PD(t),i=r===void 0?ND:MD[r];return i[jD(e,i.length)]??0}function RD(e,t){return t===`en`?e.nameEn:e.name}function zD(e,t){return t===`en`?e.nameEn:e.name}function BD(e){let t=e.custom?e.avatar??0:LD(e.slug,e.division);return eE[t]??eE[0]}function VD(e,t,n){let r=SD.find(t=>t.slug===e);return r===void 0?t:RD(r,n)}function HD(e){return`@${e.trim().replace(/^@+/,``)}`}function UD(e){return`${HD(e)}\u00A0`}function WD(e,t,n){return e.filter(e=>t.has(e.slug)).map(e=>n===`en`?e.nameEn:e.name)}function GD(e,t){return(t===`en`?_v:gv)[e]??e}function KD(e){return`${uD}:${e}`}function qD(e,t){let n=t===`en`?e.nameEn:e.name;return{source:KD(e.division),ref:e.slug,label:n,appearance:`session`,clipboardText:UD(n)}}function JD(e,t,n=SD){let r=n.find(t=>t.slug===e);return r===void 0?t===`en`?`@Removed expert (please reselect)\xA0`:`@已移除专家(请重新选择)\xA0`:UD(RD(r,t))}function YD(e,t){return t===`en`&&e.descriptionEn!==``?e.descriptionEn:e.description}let XD=bD.map(e=>KD(e)).map(e=>`[role="listbox"] div[data-source=${JSON.stringify(e)}] ~ button`).map(e=>`${e} span:last-child`).join(`,`),ZD=`.aag-btn-wrap{position:relative;order:1;display:inline-flex;flex:0 0 auto}.aag-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:28px;padding:0 8px;white-space:nowrap;border:none;border-radius:24px;background:transparent;color:var(--dsw-alias-label-secondary);font-size:13px;line-height:20px;font-weight:500;cursor:pointer}.aag-btn:hover,.aag-btn[aria-expanded="true"]{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.aag-btn:focus-visible{outline:2px solid var(--dsw-alias-label-secondary);outline-offset:2px}.aag-btn>svg{flex:none}.aag-menu{position:absolute;bottom:calc(100% + 4px);left:0;box-sizing:border-box;padding:4px;display:flex;flex-direction:column;gap:0;width:300px;max-width:360px;max-height:calc(100dvh - 24px);overflow-y:auto;border:0;border-radius:20px;background:var(--dsw-specific-menu);backdrop-filter:var(--dsw-menu-backdrop-filter);box-shadow:var(--dsw-elevation-prominent);z-index:10000}.aag-menu[data-placement="below"]{top:calc(100% + 4px);bottom:auto}.aag-menu-title{padding:8px 10px;font-size:12px;line-height:16px;color:var(--dsw-alias-label-tertiary)}.aag-menu-item{display:flex;align-items:center;gap:8px;width:100%;min-height:40px;padding:8px 10px;border:none;border-radius:10px;background:transparent;cursor:pointer;text-align:left;font-size:14px;line-height:22px;color:var(--dsw-alias-label-primary);box-sizing:border-box}.aag-menu-item:hover{background:var(--dsw-alias-interactive-bg-hover)}.aag-menu-empty{padding:8px 10px;color:var(--dsw-alias-label-secondary);font-size:13px}`,QD=`
433
433
  .aag-section{box-sizing:border-box;display:flex;min-width:0;max-width:760px;width:100%;margin:0 auto;flex-direction:column;gap:16px;padding:0 0 32px;color:var(--dsw-alias-label-primary)}
434
434
  .aag-toolbar{display:flex;align-items:flex-start;gap:16px;padding-bottom:12px}
435
435
  .aag-title-row{display:flex;align-items:center;gap:8px;min-width:0}.aag-settings-links{display:flex;align-items:center;gap:4px;flex-wrap:wrap}
package/lib/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import { C as unquote, P as ZH_NAME, S as truncate, _ as resolveCatalogRoot, a as SUMMON_EXPERTS_MAX, b as stripBom, c as createAgencyPersonaSource, d as loadCatalog, f as mapPool, g as readLocalizedExpertPrompt, h as readExpertPrompt, i as SUMMON_EXPERTS_CONCURRENCY, l as inject, m as parseFrontmatter, n as Config, o as SUMMON_TASK_MAX_CHARS, p as name, r as DEFAULT_DIVISIONS, s as apply, t as AGENCY_PERSONA_SERVICE, u as liveSchemaField, v as resolveExpert, w as validateSummonSpecs, x as toSummonItemResult, y as sanitize } from "./src-XDq4eHLn.js";
1
+ import { C as unquote, P as ZH_NAME, S as truncate, _ as resolveCatalogRoot, a as SUMMON_EXPERTS_MAX, b as stripBom, c as createAgencyPersonaSource, d as loadCatalog, f as mapPool, g as readLocalizedExpertPrompt, h as readExpertPrompt, i as SUMMON_EXPERTS_CONCURRENCY, l as inject, m as parseFrontmatter, n as Config, o as SUMMON_TASK_MAX_CHARS, p as name, r as DEFAULT_DIVISIONS, s as apply, t as AGENCY_PERSONA_SERVICE, u as liveSchemaField, v as resolveExpert, w as validateSummonSpecs, x as toSummonItemResult, y as sanitize } from "./src-Cqu41I1d.js";
2
2
  export { AGENCY_PERSONA_SERVICE, Config, DEFAULT_DIVISIONS, SUMMON_EXPERTS_CONCURRENCY, SUMMON_EXPERTS_MAX, SUMMON_TASK_MAX_CHARS, ZH_NAME, apply, createAgencyPersonaSource, inject, liveSchemaField, loadCatalog, mapPool, name, parseFrontmatter, readExpertPrompt, readLocalizedExpertPrompt, resolveCatalogRoot, resolveExpert, sanitize, stripBom, toSummonItemResult, truncate, unquote, validateSummonSpecs };
package/lib/remote.js CHANGED
@@ -1,4 +1,4 @@
1
- import { A as CUSTOM_EXPERT_SLUG, D as readHostLocale, E as formatHost, F as AGENCY_TEAM_SERVICE, I as teamInputSchema, L as teamSnapshotSchema, M as customExpertInputSchema, N as expertEditSchema, O as settingsNamespaceCompat, R as teamText, T as nativeTeamMemberName, g as readLocalizedExpertPrompt, h as readExpertPrompt, j as catalogSnapshotSchema, k as AGENCY_LIBRARY_SERVICE, t as AGENCY_PERSONA_SERVICE } from "./src-XDq4eHLn.js";
1
+ import { A as CUSTOM_EXPERT_SLUG, D as readHostLocale, E as formatHost, F as AGENCY_TEAM_SERVICE, I as teamInputSchema, L as teamSnapshotSchema, M as customExpertInputSchema, N as expertEditSchema, O as settingsNamespaceCompat, R as teamText, T as nativeTeamMemberName, g as readLocalizedExpertPrompt, h as readExpertPrompt, j as catalogSnapshotSchema, k as AGENCY_LIBRARY_SERVICE, t as AGENCY_PERSONA_SERVICE } from "./src-Cqu41I1d.js";
2
2
  import { z } from "zod";
3
3
  import { Remote, TypertRemoteService } from "@deepseek-ai/dsh-typert-protocol";
4
4
  //#region src/remote-contract.ts
@@ -4,7 +4,7 @@ import { z } from "zod";
4
4
  import * as dshSettings from "@deepseek-ai/dsh-settings";
5
5
  import { existsSync, readFileSync, realpathSync } from "node:fs";
6
6
  import { open, readFile, readdir, stat } from "node:fs/promises";
7
- import { basename, dirname, isAbsolute, join, relative, resolve } from "node:path";
7
+ import { basename, delimiter, dirname, isAbsolute, join, relative, resolve } from "node:path";
8
8
  import schema from "@deepseek-ai/schemastery";
9
9
  import { defineTool } from "@deepseek-ai/dsh-tools";
10
10
  import { fileURLToPath } from "node:url";
@@ -2343,9 +2343,14 @@ function isTrustedUpdateRequest(request) {
2343
2343
  if (!isLoopbackAddress(request.socket?.remoteAddress)) return false;
2344
2344
  const site = header(request, "sec-fetch-site");
2345
2345
  if (site !== void 0 && site !== "same-origin") return false;
2346
- const origin = header(request, "origin");
2347
2346
  const host = header(request, "host");
2348
- if (origin === void 0 || host === void 0) return false;
2347
+ if (host === void 0 || host === "") return false;
2348
+ const origin = header(request, "origin");
2349
+ if (origin === void 0 || origin === "") try {
2350
+ return isLoopbackAddress(new URL(`http://${host}`).hostname);
2351
+ } catch {
2352
+ return false;
2353
+ }
2349
2354
  try {
2350
2355
  const url = new URL(origin);
2351
2356
  return (url.protocol === "http:" || url.protocol === "https:") && isLoopbackAddress(url.hostname) && url.host === host;
@@ -2370,14 +2375,14 @@ function isDshCliEntry(entry, manifest, packageRoot) {
2370
2375
  const bin = typeof value.bin === "string" ? value.bin : typeof value.bin === "object" && value.bin !== null ? value.bin.dsh : void 0;
2371
2376
  return typeof bin === "string" && bin !== "" && !isAbsolute(bin) && resolve(packageRoot, bin) === resolve(entry);
2372
2377
  }
2373
- function cliEntry() {
2374
- const value = process.argv[1];
2378
+ function cliEntry(argv = process.argv, cwd = process.cwd(), exists = existsSync) {
2379
+ const value = argv[1];
2375
2380
  if (value === void 0 || value === "") return void 0;
2376
- const entry = value.startsWith("file:") ? fileURLToPath(value) : resolve(process.cwd(), value);
2377
- if (!existsSync(entry)) return void 0;
2381
+ const entry = value.startsWith("file:") ? fileURLToPath(value) : resolve(cwd, value);
2382
+ if (!exists(entry)) return void 0;
2378
2383
  for (let directory = dirname(entry);;) {
2379
2384
  const manifestPath = resolve(directory, "package.json");
2380
- if (existsSync(manifestPath)) try {
2385
+ if (exists(manifestPath)) try {
2381
2386
  if (isDshCliEntry(entry, JSON.parse(readFileSync(manifestPath, "utf8")), directory)) return entry;
2382
2387
  } catch {}
2383
2388
  const parent = dirname(directory);
@@ -2385,28 +2390,101 @@ function cliEntry() {
2385
2390
  directory = parent;
2386
2391
  }
2387
2392
  }
2388
- function runtime(ctx) {
2389
- const profiles = ctx.get?.("desktopProfiles");
2390
- const desktopPnpm = ctx.get?.("desktopPnpm");
2393
+ function optionalService(ctx, name) {
2394
+ try {
2395
+ return typeof ctx.get === "function" ? ctx.get(name) : void 0;
2396
+ } catch {
2397
+ return;
2398
+ }
2399
+ }
2400
+ function isOfficialDesktopHostEntry(entry) {
2401
+ return entry !== void 0 && entry !== "" && entry.replaceAll("\\", "/").includes("/dsh-desktop-host/");
2402
+ }
2403
+ function stringEnvironment(value) {
2404
+ if (value === null || typeof value !== "object") return void 0;
2405
+ const env = {};
2406
+ for (const [key, item] of Object.entries(value)) if (typeof item === "string") env[key] = item;
2407
+ return Object.keys(env).length === 0 ? void 0 : env;
2408
+ }
2409
+ function packageManagerFrom(value) {
2410
+ if (value === null || typeof value !== "object") return void 0;
2411
+ const item = value;
2412
+ if (typeof item.command !== "string" || item.command === "") return void 0;
2413
+ if (!Array.isArray(item.args) || !item.args.every((arg) => typeof arg === "string")) return void 0;
2414
+ const env = stringEnvironment(item.env);
2415
+ return {
2416
+ command: item.command,
2417
+ args: item.args,
2418
+ ...env === void 0 ? {} : { env }
2419
+ };
2420
+ }
2421
+ function packageManagerFromArgv(argv, exists, execPath, pathEnv) {
2422
+ if (!isOfficialDesktopHostEntry(argv[1])) return void 0;
2423
+ const pnpm = argv[5];
2424
+ if (typeof pnpm !== "string" || !isAbsolute(pnpm) || !exists(pnpm)) return void 0;
2425
+ const bin = argv[6];
2426
+ const path = typeof bin === "string" && bin !== "" ? `${bin}${delimiter}${pathEnv ?? ""}` : pathEnv;
2427
+ return {
2428
+ command: execPath,
2429
+ args: ["--expose-internals", pnpm],
2430
+ env: {
2431
+ ELECTRON_RUN_AS_NODE: "1",
2432
+ ...typeof path === "string" && path !== "" ? { PATH: path } : {}
2433
+ }
2434
+ };
2435
+ }
2436
+ function pluginManagerFrom(value) {
2437
+ if (value === null || typeof value !== "object" || typeof value.installBundle !== "function") return void 0;
2438
+ return value;
2439
+ }
2440
+ function resolveUpdateRuntime(ctx, options = {}) {
2441
+ const argv = options.argv ?? process.argv;
2442
+ const env = options.env ?? process.env;
2443
+ const cwd = options.cwd ?? process.cwd();
2444
+ const home = options.homeDir ?? homedir();
2445
+ const exists = options.exists ?? existsSync;
2446
+ const execPath = options.execPath ?? process.execPath;
2447
+ const profiles = optionalService(ctx, "desktopProfiles");
2448
+ const desktopPnpm = optionalService(ctx, "desktopPnpm");
2391
2449
  if (profiles?.current !== void 0) {
2392
2450
  const current = profiles.current;
2393
- if (!validProfileName(current.name) || typeof current.dir !== "string" || !isAbsolute(current.dir)) throw new Error(teamText(readHostLocale(ctx), "当前 Desktop Profile 信息无效,请重启后重试。"));
2451
+ if (!validProfileName(current?.name) || typeof current.dir !== "string" || !isAbsolute(current.dir)) throw new Error(teamText(readHostLocale(ctx), "当前 Desktop Profile 信息无效,请重启后重试。"));
2452
+ const runnable = typeof desktopPnpm?.runPlugin === "function";
2394
2453
  return {
2395
2454
  profileName: current.name,
2396
2455
  profileDir: resolve(current.dir),
2397
- ...typeof desktopPnpm?.runPlugin === "function" ? { desktopPnpm } : {}
2456
+ officialDesktop: false,
2457
+ canAutoUpdate: runnable,
2458
+ ...runnable ? { desktopPnpm } : {}
2398
2459
  };
2399
2460
  }
2400
- const profileDir = resolve(process.env.DSH_PROFILE_DIR ?? resolve(homedir(), ".dsh", "profiles", "web"));
2401
- const selected = profileNameFromArgv(process.argv);
2402
- const profileName = validProfileName(selected) ? selected : validProfileName(basename(profileDir)) ? basename(profileDir) : "web";
2403
- const entry = cliEntry();
2461
+ const launched = optionalService(ctx, "profileContext");
2462
+ const official = isOfficialDesktopHostEntry(argv[1]) || launched?.name === "desktop";
2463
+ const launchedDir = typeof launched?.dir === "string" && isAbsolute(launched.dir) ? resolve(launched.dir) : void 0;
2464
+ const projectDir = official && typeof argv[3] === "string" && isAbsolute(argv[3]) ? resolve(argv[3]) : void 0;
2465
+ const cwdProfile = official && exists(resolve(cwd, "package.json")) ? resolve(cwd) : void 0;
2466
+ const profileDir = launchedDir ?? projectDir ?? cwdProfile ?? resolve(env.DSH_PROFILE_DIR ?? resolve(home, ".dsh", "profiles", "web"));
2467
+ const selected = profileNameFromArgv(argv);
2468
+ const profileName = validProfileName(launched?.name) ? launched.name : official ? "desktop" : validProfileName(selected) ? selected : validProfileName(basename(profileDir)) ? basename(profileDir) : "web";
2469
+ const packageManager = official ? packageManagerFrom(launched?.packageManager) ?? packageManagerFromArgv(argv, exists, execPath, env.PATH) : void 0;
2470
+ const pluginManager = official && packageManager === void 0 ? pluginManagerFrom(optionalService(ctx, "pluginManager")) : void 0;
2471
+ const entry = official ? void 0 : cliEntry(argv, cwd, exists);
2404
2472
  return {
2405
2473
  profileName,
2406
2474
  profileDir,
2475
+ officialDesktop: official,
2476
+ canAutoUpdate: packageManager !== void 0 || pluginManager !== void 0 || entry !== void 0,
2477
+ ...packageManager === void 0 ? {} : { packageManager },
2478
+ ...pluginManager === void 0 ? {} : { pluginManager },
2407
2479
  ...entry === void 0 ? {} : { cliEntry: entry }
2408
2480
  };
2409
2481
  }
2482
+ function shouldNotifyParent(target, send = process.send) {
2483
+ return target.officialDesktop !== true && target.desktopPnpm === void 0 && target.packageManager === void 0 && typeof send === "function";
2484
+ }
2485
+ function runtime(ctx) {
2486
+ return resolveUpdateRuntime(ctx);
2487
+ }
2410
2488
  function parseSemver(value) {
2411
2489
  const match = /^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/.exec(value);
2412
2490
  if (match === null) return void 0;
@@ -2480,7 +2558,7 @@ async function status(options, target, locale) {
2480
2558
  latestCheckFailed: latest === void 0,
2481
2559
  updateAvailable: latest !== void 0 && isNewerVersion(current, latest),
2482
2560
  profileName: target.profileName,
2483
- canAutoUpdate: target.desktopPnpm !== void 0 || target.cliEntry !== void 0
2561
+ canAutoUpdate: target.canAutoUpdate
2484
2562
  };
2485
2563
  }
2486
2564
  async function runCliInstall(target, packageSpec, locale) {
@@ -2531,14 +2609,68 @@ async function runCliInstall(target, packageSpec, locale) {
2531
2609
  });
2532
2610
  }
2533
2611
  async function install(target, packageSpec, locale) {
2534
- if (target.desktopPnpm === void 0) return runCliInstall(target, packageSpec, locale);
2535
- const result = await target.desktopPnpm.runPlugin([
2536
- "add",
2537
- "--config.minimumReleaseAge=0",
2538
- packageSpec,
2539
- "--registry=https://registry.npmjs.org/"
2540
- ], target.profileDir).done;
2541
- if (result.exitCode !== 0) throw new Error(teamText(locale, "更新进程退出码 {0}。", [String(result.exitCode)]));
2612
+ if (target.desktopPnpm !== void 0) {
2613
+ const result = await target.desktopPnpm.runPlugin([
2614
+ "add",
2615
+ "--config.minimumReleaseAge=0",
2616
+ packageSpec,
2617
+ "--registry=https://registry.npmjs.org/"
2618
+ ], target.profileDir).done;
2619
+ if (result.exitCode !== 0) throw new Error(teamText(locale, "更新进程退出码 {0}。", [String(result.exitCode)]));
2620
+ return;
2621
+ }
2622
+ if (target.packageManager !== void 0) {
2623
+ const manager = target.packageManager;
2624
+ await new Promise((resolvePromise, reject) => {
2625
+ const child = spawn(manager.command, [
2626
+ ...manager.args,
2627
+ "add",
2628
+ "--config.minimumReleaseAge=0",
2629
+ packageSpec,
2630
+ "--registry=https://registry.npmjs.org/"
2631
+ ], {
2632
+ cwd: target.profileDir,
2633
+ windowsHide: true,
2634
+ stdio: [
2635
+ "ignore",
2636
+ "pipe",
2637
+ "pipe"
2638
+ ],
2639
+ env: {
2640
+ ...process.env,
2641
+ ...manager.env,
2642
+ NO_COLOR: "1"
2643
+ }
2644
+ });
2645
+ let detail = "";
2646
+ child.stdout?.on("data", (chunk) => {
2647
+ detail = (detail + String(chunk)).slice(-4e3);
2648
+ });
2649
+ child.stderr?.on("data", (chunk) => {
2650
+ detail = (detail + String(chunk)).slice(-4e3);
2651
+ });
2652
+ const timer = setTimeout(() => {
2653
+ child.kill();
2654
+ reject(new Error(teamText(locale, "更新超时,请改用手工更新。")));
2655
+ }, 6e5);
2656
+ child.once("error", (error) => {
2657
+ clearTimeout(timer);
2658
+ reject(error);
2659
+ });
2660
+ child.once("exit", (code) => {
2661
+ clearTimeout(timer);
2662
+ if (code === 0) resolvePromise();
2663
+ else reject(new Error(teamText(locale, "更新进程退出码 {0}。", [String(code)]), { cause: detail.trim() }));
2664
+ });
2665
+ });
2666
+ return;
2667
+ }
2668
+ if (target.pluginManager !== void 0) {
2669
+ const result = await target.pluginManager.installBundle(packageSpec);
2670
+ if (result.application === "applied" || result.application === "restart-required" || result.application === "overridden") return;
2671
+ throw new Error(result.error?.message || result.packageResult?.output || teamText(locale, "更新失败,请查看服务端日志。"));
2672
+ }
2673
+ return runCliInstall(target, packageSpec, locale);
2542
2674
  }
2543
2675
  function json(response, statusCode, value) {
2544
2676
  response.writeHead(statusCode, {
@@ -2595,13 +2727,14 @@ function registerPluginUpdater(ctx, options) {
2595
2727
  return;
2596
2728
  }
2597
2729
  await install(target, `${options.packageName}@${before.latestVersion}`, locale);
2598
- const notifyParent = target.desktopPnpm === void 0 && typeof process.send === "function";
2730
+ const notifyParent = shouldNotifyParent(target);
2599
2731
  const autoReload = target.desktopPnpm !== void 0 || notifyParent;
2600
2732
  json(response, 200, {
2601
2733
  ...before,
2602
2734
  updatedVersion: before.latestVersion,
2603
2735
  restartRequired: true,
2604
- autoReload
2736
+ autoReload,
2737
+ ...target.officialDesktop ? { restartDesktop: true } : {}
2605
2738
  });
2606
2739
  if (notifyParent) setTimeout(() => {
2607
2740
  process.send?.(PLUGIN_UPDATE_IPC);
package/locale/en.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "Agency Agents",
4
+ "description": "321 summonable domain experts for DeepSeek Harness."
5
+ }
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "Agency Agents remote",
4
+ "description": "Remote entry the gateway uses to reach Agency Agents."
5
+ }
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "Agency Agents 接口",
4
+ "description": "供网关发现专家团的远程接口。"
5
+ }
6
+ }
package/locale/zh.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "Agency Agents",
4
+ "description": "为 DeepSeek Harness 提供 321 名可召唤的专业智能体。"
5
+ }
6
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@michengai/dsh-agency-agents",
3
3
  "description": "DSH Agency Agents — 为 DeepSeek Harness 提供 321 名可召唤的专业智能体 · 321 summonable domain experts for DeepSeek Harness",
4
- "version": "1.0.8",
4
+ "version": "1.0.11",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@11.22.0",
7
7
  "engines": {
@@ -22,9 +22,12 @@
22
22
  "default": "./lib/remote.js"
23
23
  },
24
24
  "./cordis.patch.yml": "./cordis.patch.yml",
25
- "./package.json": "./package.json"
25
+ "./package.json": "./package.json",
26
+ "./locale/*.json": "./locale/*.json",
27
+ "./remote/locale/*.json": "./locale/remote/*.json"
26
28
  },
27
29
  "files": [
30
+ "locale",
28
31
  "lib",
29
32
  "assets/agency-agents",
30
33
  "assets/agency-agents-zh",