@chenkai114/dsh-team-admin 0.2.0 → 0.2.1

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chenkai114/dsh-team-admin",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "DSH 插件:GUI 管理任意会话的智能体团队 —— 查看成员、删除角色并清理其持久会话(进回收站,可恢复)",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
package/src/api.mjs CHANGED
@@ -79,7 +79,8 @@ export function createApi({ ctx, getStore, version, logSystem, services }) {
79
79
 
80
80
  if (path === '/api/team-admin/health') {
81
81
  if (method !== 'GET') { sendJson(res, 405, { error: '请求方法不支持' }); return }
82
- sendJson(res, 200, { ok: true, name: 'team-admin', version })
82
+ const budget = typeof services.readRosterBudget === 'function' ? services.readRosterBudget() : null
83
+ sendJson(res, 200, { ok: true, name: 'team-admin', version, maxMembers: budget === null ? null : budget.maxMembers })
83
84
  return
84
85
  }
85
86
 
package/src/index.js CHANGED
@@ -29,7 +29,7 @@ const UNARY_METHODS = ['list', 'projections']
29
29
  /** 流出口:control 基线携带全部投影,follow 携带单个会话的开场快照。 */
30
30
  const STREAM_METHODS = ['control', 'follow']
31
31
  /** 与 package.json 版本保持一致(发布前由测试校验)。 */
32
- const PLUGIN_VERSION = '0.2.0'
32
+ const PLUGIN_VERSION = '0.2.1'
33
33
 
34
34
  /**
35
35
  * 解析插件数据目录。
@@ -44,7 +44,7 @@ export function resolveDataDir(env = process.env, home = homedir()) {
44
44
  }
45
45
 
46
46
  /**
47
- * 装配插件:惰性建 store,注册一条 prefix 路由,并给投影出口加过滤。
47
+ * 装配插件:惰性建 store,注册一条 prefix 路由;再给投影出口与成员名额加补丁。
48
48
  * @param {object} ctx - Cordis 插件上下文。
49
49
  */
50
50
  export function apply(ctx) {
@@ -62,6 +62,13 @@ export function apply(ctx) {
62
62
  const logSystem = (line) => {
63
63
  if (typeof ctx.logger?.warn === 'function') ctx.logger.warn(line)
64
64
  }
65
+ const ensureBudget = () => installRosterBudget(ctx, { getStore, logSystem, silent: true })
66
+ // 诊断用:读当前生效的成员上限(配置上限 + 已回收名额)。
67
+ const readRosterBudget = () => {
68
+ const service = typeof ctx.get === 'function' ? ctx.get('agentTeams') : undefined
69
+ const roster = service === null || service === undefined ? undefined : service.roster
70
+ return roster !== undefined && roster !== null && typeof roster.maxMembers === 'number' ? { maxMembers: roster.maxMembers } : null
71
+ }
65
72
  const handler = createApi({
66
73
  ctx,
67
74
  getStore,
@@ -73,13 +80,13 @@ export function apply(ctx) {
73
80
  dismissMember,
74
81
  // 删除成功后释放名额:名额外加数 = 墓碑数。
75
82
  onMemberDismissed: () => { void ensureBudget()?.() },
83
+ readRosterBudget,
76
84
  },
77
85
  })
78
86
  ctx.effect(
79
87
  () => ctx.webServer.register({ kind: 'prefix', path: ROUTE_PREFIX, handler }),
80
88
  'team-admin routes',
81
89
  )
82
- const ensureBudget = () => installRosterBudget(ctx, { getStore, logSystem, silent: true })
83
90
  ensureBudget()
84
91
  if (typeof ctx.inject === 'function') {
85
92
  ctx.inject(['agentTeams'], (sub) => installRosterBudget(sub, { getStore, logSystem }))
@@ -89,7 +96,6 @@ export function apply(ctx) {
89
96
  ctx.inject(['sessionController'], (sub) => installSessionListFilter(sub, { getStore, logSystem }))
90
97
  }
91
98
  }
92
-
93
99
  /**
94
100
  * 建一个带短缓存的墓碑 id 读取器。
95
101
  * @param {() => Promise<object>} getStore - 惰性打开的状态存储。
@@ -198,4 +204,4 @@ export function installRosterBudget(ctx, { getStore, logSystem, silent = false }
198
204
  }
199
205
  void roster[ROSTER_REFRESH]()
200
206
  return roster[ROSTER_REFRESH]
201
- }
207
+ }