@cxyhhhhh/dsh-qqbot 0.5.1-dev.202610121135 → 0.5.1-dev.202610121209

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAQ/D,eAAO,MAAM,IAAI,aAAa,CAAC;AAC/B,eAAO,MAAM,MAAM,UAAa,CAAC;AACjC,eAAO,MAAM,MAAM,2DAAe,CAAC;AAEnC,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA2D9E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAQ/D,eAAO,MAAM,IAAI,aAAa,CAAC;AAC/B,eAAO,MAAM,MAAM,UAAa,CAAC;AACjC,eAAO,MAAM,MAAM,2DAAe,CAAC;AAEnC,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA0D9E"}
package/dist/index.js CHANGED
@@ -26,10 +26,10 @@ export async function apply(ctx, config) {
26
26
  logger.info('扫码绑定流程结束(未获取凭据或已手动配置)');
27
27
  return;
28
28
  }
29
- // 写入环境变量(供热更新后的下次 apply 或本次直接启动读取)
30
- process.env.QQBOT_APPID = credentials.appId;
31
- process.env.QQBOT_SECRET = credentials.appSecret;
32
- // 持久化到 profile:成功则等待热更新重载,失败则用凭据直接启动
29
+ // 持久化到 profile:成功则等待热更新重载,失败则用凭据直接启动。
30
+ // 注意:不写入 process.env——resolveEnv 的 env 回退属于用户显式
31
+ // export 的配置语义,运行时写入会与解绑清理不对齐(解绑后 HMR
32
+ // 重载的新 fiber 仍从 env 读到旧凭据,状态停留 bound)
33
33
  const persisted = persistCredentialsToProfile(credentials, getProfileDir() ?? undefined, logger);
34
34
  if (persisted) {
35
35
  // 写入 cordis.patch.yml 会触发 dsh 热更新,自动重新加载本插件。
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -220,6 +220,13 @@ function handleUnbind(req, res, options) {
220
220
  const result = options.onUnbind === undefined
221
221
  ? (() => {
222
222
  const removed = removeCredentialsFromProfile(getProfileDir() ?? undefined, undefined);
223
+ if (removed) {
224
+ // 清除进程内凭据:扫码绑定成功时会写入 env(供热更新后的下次
225
+ // apply 兜底读取);不清则 HMR 重载后新 fiber 仍从 env 读到
226
+ // 凭据,解绑不生效(状态一直停留在 bound)
227
+ delete process.env.QQBOT_APPID;
228
+ delete process.env.QQBOT_SECRET;
229
+ }
223
230
  return removed
224
231
  ? { persisted: true }
225
232
  : { persisted: false, error: '无法定位 profile 目录或写入失败,请手动编辑 cordis.patch.yml' };
@@ -1 +1 @@
1
- {"version":3,"file":"bind-routes.js","sourceRoot":"","sources":["../../src/setup/bind-routes.ts"],"names":[],"mappings":"AAcA,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,mBAAmB,GAEpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,GAEjB,MAAM,4BAA4B,CAAC;AAEpC,kDAAkD;AAClD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAC;AAyDpG,gDAAgD;AAChD,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IACnC,gBAAgB,EAAE,WAAW,EAAE,iBAAiB,EAAE,OAAO;IACzD,UAAU,EAAE,OAAO,EAAE,QAAQ;IAC7B,aAAa,EAAE,cAAc;IAC7B,QAAQ;CACT,CAAC,CAAC;AAEH,6CAA6C;AAC7C,MAAM,uBAAuB,GAAgD;IAC3E,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,gBAAgB,CAAC;IACzD,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,WAAW,CAAC;IAC/C,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,iBAAiB,CAAC;IAC3D,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,OAAO,CAAC;IACvC,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC;IAClC,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC;IAC5B,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC;IAC9B,WAAW,EAAE,YAAY,CAAC,aAAa,CAAC;IACxC,YAAY,EAAE,YAAY,CAAC,cAAc,CAAC;IAC1C,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAU,CAAC;CAC/C,CAAC;AAEF,SAAS,aAAa,CAAC,KAAc,EAAE,IAAY;IACjD,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,SAAS,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC;IACtE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,MAAM,IAAI,SAAS,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC;QACrE,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK;YAAE,MAAM,IAAI,SAAS,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC;QAC5D,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC;AAED,8CAA8C;AAC9C,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAEnC;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAChC,SAAwB,EACxB,OAA8B,EAC9B,MAAc,EACd,UAA6B,EAAE;IAE/B,MAAM,aAAa,GAAG,CAAC,WAA6B,EAAsB,EAAE;QAC1E,MAAM,SAAS,GAAG,2BAA2B,CAAC,WAAW,EAAE,aAAa,EAAE,IAAI,SAAS,EAAE,MAAM,CAAC,CAAC;QACjG,OAAO,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAC;IACzG,CAAC,CAAC;IACF,MAAM,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,IAAI,aAAa,CAAC;IAExE,MAAM,SAAS,GAAG;QAChB,SAAS,CAAC,QAAQ,CAAC;YACjB,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;SACpE,CAAC;QACF,SAAS,CAAC,QAAQ,CAAC;YACjB,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;SAC7D,CAAC;QACF,SAAS,CAAC,QAAQ,CAAC;YACjB,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,kBAAkB,CAAC;SAClE,CAAC;QACF,SAAS,CAAC,QAAQ,CAAC;YACjB,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC;SACvD,CAAC;QACF,SAAS,CAAC,QAAQ,CAAC;YACjB,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC;SACvD,CAAC;KACH,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,uBAAuB,eAAe,EAAE,CAAC,CAAC;IACtD,OAAO,GAAG,EAAE,GAAG,KAAK,MAAM,OAAO,IAAI,SAAS;QAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;;GAMG;AACH,SAAS,OAAO,CAAC,GAAoB;IACnC,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;IAClC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,GAAmB,EAAE,MAAc,EAAE,IAAa;IAClE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE;QACpB,cAAc,EAAE,iCAAiC;QACjD,eAAe,EAAE,UAAU;KAC5B,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,WAAW,CAClB,GAAoB,EACpB,GAAmB,EACnB,OAA8B,EAC9B,OAA0B;IAE1B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAClD,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IACD,oCAAoC;IACpC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,EAAE,IAAI,IAAI,CAAC;IAClD,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IACD,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,aAAa,CAAC,GAAoB,EAAE,GAAmB,EAAE,OAA8B;IAC9F,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC1B,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IACD,wBAAwB;IACxB,GAAG,CAAC,MAAM,EAAE,CAAC;IACb,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,qBAAqB;IACrB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,4BAA4B;AAC5B,KAAK,UAAU,YAAY,CAAC,GAAoB;IAC9C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,KAAe,CAAC;QAC/B,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC;QACtB,IAAI,IAAI,GAAG,qBAAqB;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5E,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IACD,IAAI,IAAI,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACtD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,yBAAyB;AACzB,SAAS,gBAAgB,CAAC,IAAa;IACrC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC3D,MAAM,MAAM,GAAG,IAA+B,CAAC;IAC/C,MAAM,KAAK,GAAG,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,MAAM,SAAS,GAAG,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACtF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9D,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG;QAAE,OAAO,IAAI,CAAC;IAC9D,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC9B,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,GAAoB,EACpB,GAAmB,EACnB,MAA6D;IAE7D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC1B,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IACD,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QACtH,OAAO;IACT,CAAC;IACD,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACtB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IACD,8CAA8C;IAC9C,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,kDAAkD;AAClD,SAAS,YAAY,CAAC,GAAoB,EAAE,GAAmB,EAAE,OAA0B;IACzF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC1B,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IACD,GAAG,CAAC,MAAM,EAAE,CAAC;IACb,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC9C,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAClD,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAiB,OAAO,CAAC,QAAQ,KAAK,SAAS;QACzD,CAAC,CAAC,CAAC,GAAG,EAAE;YACJ,MAAM,OAAO,GAAG,4BAA4B,CAAC,aAAa,EAAE,IAAI,SAAS,EAAE,SAAS,CAAC,CAAC;YACtF,OAAO,OAAO;gBACZ,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;gBACrB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,6CAA6C,EAAE,CAAC;QACjF,CAAC,CAAC,EAAE;QACN,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IACvB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACtB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IACD,oCAAoC;IACpC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAC;AAClE,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,YAAY,CAAC,GAAoB,EAAE,GAAmB,EAAE,OAA0B;IAC/F,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAClD,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC;QAChD,iCAAiC;QACjC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;QAC3C,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IAED,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QACtH,OAAO;IACT,CAAC;IACD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAC9C,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAC3D,OAAO;IACT,CAAC;IACD,MAAM,SAAS,GAAG,IAA+B,CAAC;IAElD,gBAAgB;IAChB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,WAAW;gBACnD,CAAC,CAAC,iBAAiB;gBACnB,CAAC,CAAC,GAAG,KAAK,KAAK;oBACb,CAAC,CAAC,WAAW;oBACb,CAAC,CAAC,QAAQ,CAAC;YACf,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,KAAK,GAAG,EAAE,EAAE,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,IAAI,SAAS,GAA4B,EAAE,CAAC;IAC5C,IAAI,CAAC;QACH,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YAC5E,MAAM,KAAK,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,IAAI,SAAS,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,YAAY,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/F,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,cAAc,KAAK,SAAS;QACpD,CAAC,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,EAAE,IAAI,SAAS,EAAE,SAAS,CAAC;QACzE,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IACD,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC,CAAC;AAC3E,CAAC"}
1
+ {"version":3,"file":"bind-routes.js","sourceRoot":"","sources":["../../src/setup/bind-routes.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"persist.d.ts","sourceRoot":"","sources":["../../src/setup/persist.ts"],"names":[],"mappings":"AAWA,WAAW;AACX,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AASD;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,gBAAgB,EAC7B,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE;IAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;CAAE,GACpG,OAAO,CAoDT;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE;IAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;CAAE,GACpG,OAAO,CA6BT;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE;IAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;CAAE,GACpG,OAAO,CAuCT"}
1
+ {"version":3,"file":"persist.d.ts","sourceRoot":"","sources":["../../src/setup/persist.ts"],"names":[],"mappings":"AAWA,WAAW;AACX,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AASD;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,gBAAgB,EAC7B,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE;IAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;CAAE,GACpG,OAAO,CAoDT;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE;IAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;CAAE,GACpG,OAAO,CA8BT;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE;IAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;CAAE,GACpG,OAAO,CAuCT"}
@@ -83,12 +83,13 @@ export function removeCredentialsFromProfile(profileDir, logger) {
83
83
  return true; // 无 patch 文件 = 无凭据,幂等成功
84
84
  const entries = parsePatchEntries(readFileSync(patchPath, 'utf8'));
85
85
  const entry = entries.find((e) => e.id === 'im-qqbot');
86
- if (entry === undefined || entry.config === undefined)
87
- return true;
88
- if (entry.config.appId === undefined && entry.config.appSecret === undefined)
89
- return true;
90
- delete entry.config.appId;
91
- delete entry.config.appSecret;
86
+ if (entry?.config !== undefined) {
87
+ delete entry.config.appId;
88
+ delete entry.config.appSecret;
89
+ }
90
+ // 无条件写回:幂等场景(凭据字段已不存在)也更新 mtime——
91
+ // 宿主 HMR 靠文件变化触发重载,不写则 bound fiber 永不卸载,
92
+ // 解绑后状态会一直停留在 bound
92
93
  mkdirSync(profileDir, { recursive: true });
93
94
  writeFileSync(patchPath, yaml.dump(entries), 'utf8');
94
95
  log.info(`✔ 凭据已移除: ${patchPath}`);
@@ -1 +1 @@
1
- {"version":3,"file":"persist.js","sourceRoot":"","sources":["../../src/setup/persist.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"persist.js","sourceRoot":"","sources":["../../src/setup/persist.ts"],"names":[],"mappings":"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"}
package/lib/client.js CHANGED
@@ -150,42 +150,75 @@ window.__ModuleLoader__.load({
150
150
  * 低频等待恢复而不是判定终态——否则保存成功提示会被
151
151
  * 「插件未启用」覆盖且无法自愈。
152
152
  *
153
- * @returns 轮询快照:state 为宿主相位(null = 加载中),gone 表示
154
- * 插件未启用(从未注册过路由)。
153
+ * bound 为稳定态:轮询大幅降频(30s)。因此解绑等本地动作后必须
154
+ * 调用 recheck() 立即重置节拍——否则视图最长停留 30s+ 才收敛到
155
+ * 新相位(如解绑后的 waiting 二维码)。
156
+ *
157
+ * @returns 轮询快照与 recheck:state 为宿主相位(null = 加载中),
158
+ * gone 表示插件未启用(从未注册过路由),recheck 废弃当前
159
+ * 定时器并立即重新轮询(新轮询链取代旧链,不产生双计时器)。
155
160
  */
156
161
  function useBindState() {
157
162
  const [state, setState] = (0, react.useState)(null);
158
163
  const [gone, setGone] = (0, react.useState)(false);
164
+ const recheckRef = (0, react.useRef)(() => {});
159
165
  (0, react.useEffect)(() => {
160
166
  let stopped = false;
161
167
  let sawRoute = false;
168
+ let generation = 0;
169
+ let running = false;
170
+ let restartAfterFlight = false;
171
+ let urgentUntil = 0;
162
172
  let timer;
163
173
  const schedule = (ms) => {
164
174
  timer = setTimeout(() => {
165
175
  tick();
166
176
  }, ms);
167
177
  };
178
+ const intervalFor = (phase) => {
179
+ const base = phase === "saving" ? 500 : phase === "bound" ? 3e4 : ACTIVE_POLL_MS;
180
+ return Date.now() < urgentUntil ? Math.min(base, ACTIVE_POLL_MS) : base;
181
+ };
168
182
  const tick = async () => {
169
- if (stopped) return;
183
+ if (stopped || running) return;
184
+ running = true;
185
+ const myGeneration = generation;
186
+ const alive = () => myGeneration === generation && !stopped;
170
187
  try {
171
188
  const res = await fetch(BIND_STATE_PATH, { cache: "no-store" });
172
189
  if (res.status === 404) {
173
190
  if (!stopped && !sawRoute) setGone(true);
174
- if (!stopped && sawRoute) schedule(1e4);
191
+ else if (alive()) schedule(Date.now() < urgentUntil ? 1e3 : 3e3);
175
192
  return;
176
193
  }
177
194
  if (!res.ok) {
178
- schedule(RETRY_POLL_MS);
195
+ if (alive()) schedule(RETRY_POLL_MS);
179
196
  return;
180
197
  }
181
198
  sawRoute = true;
182
199
  const body = await res.json();
183
- if (stopped) return;
200
+ if (!alive()) return;
184
201
  setState(body);
185
- schedule(body.phase === "saving" ? 500 : body.phase === "bound" ? 3e4 : ACTIVE_POLL_MS);
202
+ schedule(intervalFor(body.phase));
203
+ return;
204
+ } catch {} finally {
205
+ running = false;
206
+ if (restartAfterFlight && !stopped) {
207
+ restartAfterFlight = false;
208
+ tick();
209
+ }
210
+ }
211
+ if (alive()) schedule(RETRY_POLL_MS);
212
+ };
213
+ recheckRef.current = () => {
214
+ generation += 1;
215
+ urgentUntil = Date.now() + 15e3;
216
+ if (timer !== void 0) clearTimeout(timer);
217
+ if (running) {
218
+ restartAfterFlight = true;
186
219
  return;
187
- } catch {}
188
- schedule(RETRY_POLL_MS);
220
+ }
221
+ tick();
189
222
  };
190
223
  tick();
191
224
  return () => {
@@ -195,7 +228,10 @@ window.__ModuleLoader__.load({
195
228
  }, []);
196
229
  return {
197
230
  state,
198
- gone
231
+ gone,
232
+ recheck: (0, react.useCallback)(() => {
233
+ recheckRef.current();
234
+ }, [])
199
235
  };
200
236
  }
201
237
  /** 手动提交凭据(填写 / 更换共用) */
@@ -299,7 +335,7 @@ window.__ModuleLoader__.load({
299
335
  });
300
336
  }
301
337
  /** 已绑定视图:回显 appId + 更换凭据 / 解绑入口 */
302
- function BoundView({ appId }) {
338
+ function BoundView({ appId, recheck }) {
303
339
  const [editing, setEditing] = (0, react.useState)(false);
304
340
  const [unbindResult, setUnbindResult] = (0, react.useState)(null);
305
341
  const unbind = (0, react.useCallback)(() => {
@@ -311,6 +347,7 @@ window.__ModuleLoader__.load({
311
347
  ok: true,
312
348
  message: body.message ?? "已解绑,插件将重载并重新进入绑定流程"
313
349
  });
350
+ recheck();
314
351
  return;
315
352
  }
316
353
  setUnbindResult({
@@ -323,8 +360,16 @@ window.__ModuleLoader__.load({
323
360
  message: err instanceof Error ? err.message : String(err)
324
361
  });
325
362
  });
326
- }, []);
327
- if (unbindResult !== null) return (0, react.createElement)("div", { className: "imqb-status" }, (0, react.createElement)("div", { className: "imqb-status-row" }, (0, react.createElement)("div", { className: "imqb-status-icon" }, unbindResult.ok ? "👋" : "⚠️"), (0, react.createElement)("div", { className: "imqb-status-meta" }, (0, react.createElement)("p", { className: "imqb-status-title" }, unbindResult.message))));
363
+ }, [recheck]);
364
+ if (unbindResult !== null) return (0, react.createElement)("div", { className: "imqb-status" }, (0, react.createElement)("div", { className: "imqb-status-row" }, (0, react.createElement)("div", { className: "imqb-status-icon" }, unbindResult.ok ? "👋" : "⚠️"), (0, react.createElement)("div", { className: "imqb-status-meta" }, (0, react.createElement)("p", { className: "imqb-status-title" }, unbindResult.message))), (0, react.createElement)("div", { className: "imqb-status-actions" }, unbindResult.ok ? (0, react.createElement)("button", {
365
+ className: "imqb-ghost",
366
+ onClick: recheck
367
+ }, "刷新状态") : (0, react.createElement)("button", {
368
+ className: "imqb-ghost",
369
+ onClick: () => {
370
+ setUnbindResult(null);
371
+ }
372
+ }, "返回")));
328
373
  if (editing) return (0, react.createElement)("div", { className: "imqb-status" }, (0, react.createElement)("div", { className: "imqb-status-row" }, (0, react.createElement)("div", { className: "imqb-status-meta" }, (0, react.createElement)("p", { className: "imqb-status-title" }, "更换凭据")), (0, react.createElement)("button", {
329
374
  className: "imqb-ghost",
330
375
  onClick: () => {
@@ -377,7 +422,7 @@ window.__ModuleLoader__.load({
377
422
  /** 依据宿主相位渲染面板主体(各展示位共用) */
378
423
  function BindPanelBody() {
379
424
  usePanelStyles();
380
- const { state, gone } = useBindState();
425
+ const { state, gone, recheck } = useBindState();
381
426
  const [lastQr, setLastQr] = (0, react.useState)(null);
382
427
  (0, react.useEffect)(() => {
383
428
  if (state === null) return;
@@ -403,7 +448,10 @@ window.__ModuleLoader__.load({
403
448
  window.location.reload();
404
449
  }
405
450
  }, "重试")));
406
- if (state.phase === "bound") return (0, react.createElement)(BoundView, { appId: state.appId });
451
+ if (state.phase === "bound") return (0, react.createElement)(BoundView, {
452
+ appId: state.appId,
453
+ recheck
454
+ });
407
455
  return (0, react.createElement)(UnboundView, { state });
408
456
  }
409
457
  //#endregion
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["STYLE_ID","useState","useCallback","createElement","createElement","useState","useCallback","createElement"],"sources":["../src/shared/bind-protocol.ts","../src/client/bind-page.ts","../src/client/config-panel.ts","../src/client/index.ts"],"sourcesContent":["/**\n * 端内绑定协议 —— 宿主路由与客户端面板的共享契约\n *\n * 类型与路径常量的唯一事实源:宿主(setup/bind-routes.ts)与浏览器\n * (client/bind-page.ts)各自 import,杜绝两端协议漂移。\n * 本模块必须保持纯类型 + 纯常量(零 node 依赖、零副作用):\n * 客户端 tsdown 构建会将其内联进 bundle。\n */\n\n/** 状态查询(绑定页轮询) */\nexport const BIND_STATE_PATH = '/qqbot/im-qqbot/bind';\n\n/** 刷新二维码(绑定页按钮) */\nexport const BIND_REFRESH_PATH = '/qqbot/im-qqbot/bind/refresh';\n\n/** 手动填写/编辑凭据(绑定页表单) */\nexport const BIND_MANUAL_PATH = '/qqbot/im-qqbot/bind/manual';\n\n/** 解绑:移除已保存凭据,回到绑定流程 */\nexport const BIND_UNBIND_PATH = '/qqbot/im-qqbot/bind/unbind';\n\n/** 配置读写(设置面板表单) */\nexport const BIND_CONFIG_PATH = '/qqbot/im-qqbot/config';\n\n/** 线上协议(HTTP 路由序列化形态) */\nexport type BindStateWire =\n | { phase: 'starting' }\n | { phase: 'waiting'; url: string; qrSvg?: string; issuedAt: number }\n | { phase: 'saving' }\n | { phase: 'failed'; reason: string }\n | { phase: 'bound'; appId: string };\n\n/** manual / unbind 操作的统一响应 */\nexport interface BindActionResponse {\n ok: boolean;\n message?: string;\n error?: string;\n}\n","/**\n * 端内绑定面板 — 扫码 / 手动填写 / 已绑定编辑\n *\n * 宿主插件注册 /qqbot/im-qqbot/bind 路由(待绑定与已绑定 fiber 均常驻):\n * - 未绑定:waiting(二维码)/ starting / saving / failed 相位 + manual 提交\n * - 已绑定:bound 相位(回显脱敏 appId,secret 不回传)+ manual 更换 + 解绑\n * 扫码成功或手动保存均写入 profile patch 并经 HMR 重载生效。\n *\n * 样式为注入式 CSS 类(imqb-* 命名空间,随面板挂载注入一次):\n * hover/过渡/focus 样式无法用 inline style 表达,统一走类;\n * 颜色尽量取 DSW 主题变量(--dsw-alias-*),缺省值兜底。\n *\n * 同一组件复用于两种展示位(侧栏绑定页 / 设置页 QQ Bot 栏目)。\n * 运行时仅依赖 react(dsh 客户端平台种子表提供);宿主通信走同源 fetch,\n * Desktop 下由壳的 IPC 桥自动附加 Host 认证转发。\n */\nimport { createElement, useCallback, useEffect, useState, type FormEvent, type ReactNode } from 'react';\nimport {\n BIND_MANUAL_PATH,\n BIND_REFRESH_PATH,\n BIND_STATE_PATH,\n BIND_UNBIND_PATH,\n type BindStateWire,\n} from '../shared/bind-protocol.ts';\n\n/** 轮询间隔(毫秒):活跃轮询 / 失败退避 */\nconst ACTIVE_POLL_MS = 2000;\nconst RETRY_POLL_MS = 3000;\n\n/** 样式注入标记(幂等) */\nconst STYLE_ID = 'im-qqbot-bind-panel-styles';\n\n/**\n * 注入面板样式(一次)。交互态(hover/active/focus)无法用 inline style\n * 表达,统一收敛到类;DSW 主题变量缺失时用中性值兜底。\n */\nfunction usePanelStyles(): void {\n useEffect(() => {\n if (typeof document === 'undefined') return;\n if (document.getElementById(STYLE_ID) !== null) return;\n const style = document.createElement('style');\n style.id = STYLE_ID;\n style.textContent = `\n.imqb-panel {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n gap: 14px; padding: 24px; min-height: 320px; text-align: center; font-size: 14px;\n}\n.imqb-title { margin: 0; font-size: 16px; font-weight: 600; }\n.imqb-hint { margin: 0; opacity: 0.75; line-height: 1.6; }\n.imqb-mono { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 13px; }\n.imqb-link { font-size: 13px; opacity: 0.85; color: var(--dsw-alias-brand, #4d6bfe); text-decoration: none; }\n.imqb-link:hover { text-decoration: underline; }\n.imqb-icon { font-size: 32px; line-height: 1; }\n.imqb-qr { border-radius: 10px; background: #fff; padding: 10px; max-width: 100%; }\n.imqb-row { display: flex; gap: 10px; justify-content: center; flex-wrap: wrap; }\n.imqb-btn, .imqb-pill {\n font: inherit; cursor: pointer; color: inherit;\n transition: background-color .15s ease, border-color .15s ease, color .15s ease, opacity .15s ease;\n}\n.imqb-btn:disabled, .imqb-pill:disabled { opacity: 0.5; cursor: default; }\n.imqb-btn {\n padding: 7px 18px; border-radius: 8px; font-size: 13px;\n border: 1px solid var(--dsw-alias-border-l2, rgba(128, 128, 128, 0.4));\n background: transparent;\n}\n.imqb-btn:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-hover, rgba(128, 128, 128, 0.12)); }\n.imqb-btn--primary {\n border-color: transparent;\n background: var(--dsw-alias-brand, #4d6bfe); color: #fff; font-weight: 500;\n}\n.imqb-btn--primary:hover:not(:disabled) { background: var(--dsw-alias-brand-strong, #3b5cf0); }\n.imqb-btn--danger { color: var(--dsw-alias-danger, #f26d6d); border-color: var(--dsw-alias-danger, rgba(242, 109, 109, 0.5)); }\n.imqb-btn--danger:hover:not(:disabled) { background: var(--dsw-alias-danger, rgba(242, 109, 109, 0.12)); }\n.imqb-ghost {\n border: none; background: transparent; opacity: 0.65; padding: 4px 8px;\n font: inherit; font-size: 13px; cursor: pointer; color: inherit;\n}\n.imqb-ghost:hover { opacity: 1; text-decoration: underline; }\n.imqb-pill {\n padding: 5px 16px; border-radius: 999px; font-size: 13px;\n border: 1px solid var(--dsw-alias-border-l2, rgba(128, 128, 128, 0.4)); background: transparent;\n}\n.imqb-pill:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-hover, rgba(128, 128, 128, 0.12)); }\n.imqb-btn:focus-visible, .imqb-pill:focus-visible, .imqb-input:focus-visible, .imqb-ghost:focus-visible {\n outline: 2px solid var(--dsw-alias-brand, #4d6bfe); outline-offset: 1px;\n}\n.imqb-form { display: flex; flex-direction: column; gap: 12px; width: min(320px, 100%); box-sizing: border-box; }\n.imqb-field { display: flex; flex-direction: column; gap: 5px; text-align: left; font-size: 13px; }\n.imqb-input {\n padding: 8px 10px; border-radius: 8px; box-sizing: border-box; width: 100%;\n border: 1px solid var(--dsw-alias-border-l2, rgba(128, 128, 128, 0.4));\n background: var(--dsw-alias-bg-input, rgba(128, 128, 128, 0.08));\n color: inherit; font: inherit; font-size: 13px; outline: none;\n}\n.imqb-input:focus { border-color: var(--dsw-alias-brand, #4d6bfe); }\n.imqb-error { margin: 0; font-size: 12px; color: var(--dsw-alias-danger, #f26d6d); }\n/* 紧凑状态视图(已绑定 / 过渡态):设置行风格,无居中大卡留白 */\n.imqb-status { display: flex; flex-direction: column; text-align: left; font-size: 14px; }\n.imqb-status-row { display: flex; align-items: center; gap: 12px; padding: 12px 0; }\n.imqb-status-icon { font-size: 24px; line-height: 1; flex: none; }\n.imqb-qqicon {\n flex: none; display: block; border-radius: 8px;\n background: #fff; /* 深色企鹅 logo 需浅底,暗色主题下保持可见 */\n}\n.imqb-status-meta { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1; }\n.imqb-status-title { margin: 0; font-size: 14px; font-weight: 600; line-height: 1.5; }\n.imqb-status-sub { margin: 0; font-size: 12px; line-height: 1.5; color: var(--dsw-alias-label-tertiary, inherit); opacity: .85; }\n.imqb-status-actions { display: flex; align-items: center; gap: 8px; padding: 4px 0 12px; }\n/* 扫码成功后的连接过渡:二维码模糊变暗 + 覆盖层 */\n.imqb-scanned { position: relative; display: inline-block; }\n.imqb-scanned-qr {\n display: block; border-radius: 10px; background: #fff; padding: 10px;\n filter: blur(6px) saturate(0.6); opacity: 0.55;\n}\n.imqb-scanned-veil {\n position: absolute; inset: 0; display: flex; flex-direction: column;\n align-items: center; justify-content: center; gap: 6px; text-align: center;\n}\n.imqb-scanned-title { margin: 0; font-size: 15px; font-weight: 600; }\n.imqb-scanned-sub { margin: 0; font-size: 12px; opacity: 0.75; line-height: 1.6; }\n `;\n document.head.appendChild(style);\n return () => { style.remove(); };\n }, []);\n}\n\n/**\n * 绑定状态轮询 hook。\n *\n * 404 语义分两种:从未拿到过路由 = 插件未启用(终态);\n * 曾经拿到过 = HMR 重载窗口期(manual/unbind 保存后路由短暂消失),\n * 低频等待恢复而不是判定终态——否则保存成功提示会被\n * 「插件未启用」覆盖且无法自愈。\n *\n * @returns 轮询快照:state 为宿主相位(null = 加载中),gone 表示\n * 插件未启用(从未注册过路由)。\n */\nfunction useBindState(): { state: BindStateWire | null; gone: boolean } {\n const [state, setState] = useState<BindStateWire | null>(null);\n const [gone, setGone] = useState(false);\n\n useEffect(() => {\n let stopped = false;\n let sawRoute = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const schedule = (ms: number): void => {\n timer = setTimeout(() => { void tick(); }, ms);\n };\n\n const tick = async (): Promise<void> => {\n if (stopped) return;\n try {\n const res = await fetch(BIND_STATE_PATH, { cache: 'no-store' });\n if (res.status === 404) {\n if (!stopped && !sawRoute) setGone(true);\n // sawRoute:HMR 窗口期,保留当前视图低频等待路由恢复\n if (!stopped && sawRoute) schedule(10000);\n return;\n }\n if (!res.ok) {\n schedule(RETRY_POLL_MS);\n return;\n }\n sawRoute = true;\n const body = (await res.json()) as BindStateWire;\n if (stopped) return;\n setState(body);\n // bound 为稳定态:大幅降频;saving 即将切换;其余活跃轮询\n schedule(body.phase === 'saving' ? 500 : body.phase === 'bound' ? 30000 : ACTIVE_POLL_MS);\n return;\n } catch {\n // 宿主启动窗口期不可达:退避重试\n }\n schedule(RETRY_POLL_MS);\n };\n\n void tick();\n return () => { stopped = true; if (timer !== undefined) clearTimeout(timer); };\n }, []);\n\n return { state, gone };\n}\n\ninterface ManualResult { ok: boolean; message?: string; error?: string }\n\n/** 手动提交凭据(填写 / 更换共用) */\nasync function submitManualCredentials(appId: string, appSecret: string): Promise<ManualResult> {\n try {\n const res = await fetch(BIND_MANUAL_PATH, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ appId, appSecret }),\n });\n const body = (await res.json().catch(() => ({}))) as ManualResult;\n if (res.ok && body.ok) return { ok: true, message: body.message };\n return { ok: false, error: body.error ?? `保存失败(HTTP ${res.status})` };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n}\n\n/**\n * 手动凭据表单(填写 / 更换共用)。\n *\n * appSecret 永不回显(占位符提示),提交成功后展示保存结果;\n * 宿主写入 profile patch 并经 HMR 重载,状态轮询随后收敛为 bound。\n */\nfunction ManualForm({ initialAppId }: { initialAppId?: string }): ReactNode {\n const [appId, setAppId] = useState(initialAppId ?? '');\n const [appSecret, setAppSecret] = useState('');\n const [busy, setBusy] = useState(false);\n const [result, setResult] = useState<ManualResult | null>(null);\n\n const submit = useCallback((event: FormEvent): void => {\n event.preventDefault();\n if (busy) return;\n const trimmedId = appId.trim();\n const trimmedSecret = appSecret.trim();\n if (trimmedId.length === 0 || trimmedSecret.length === 0) {\n setResult({ ok: false, error: 'appId 与 appSecret 均为必填' });\n return;\n }\n setBusy(true);\n void submitManualCredentials(trimmedId, trimmedSecret).then((outcome) => {\n setResult(outcome);\n setBusy(false);\n });\n }, [appId, appSecret, busy]);\n\n if (result !== null && result.ok) {\n return createElement('div', { className: 'imqb-status' },\n createElement('div', { className: 'imqb-status-row' },\n createElement('div', { className: 'imqb-status-icon' }, '✅'),\n createElement('div', { className: 'imqb-status-meta' },\n createElement('p', { className: 'imqb-status-title' }, result.message ?? '凭据已保存'),\n createElement('p', { className: 'imqb-status-sub' }, '插件将自动重载;稍后即可开始对话'),\n ),\n ),\n );\n }\n\n return createElement('form', { className: 'imqb-form', onSubmit: submit },\n createElement('label', { className: 'imqb-field' },\n 'AppID',\n createElement('input', {\n className: 'imqb-input', value: appId, placeholder: 'QQ 机器人 AppID',\n onChange: (event) => { setAppId(event.currentTarget.value); },\n autoComplete: 'off', spellCheck: false,\n }),\n ),\n createElement('label', { className: 'imqb-field' },\n 'AppSecret',\n createElement('input', {\n className: 'imqb-input', type: 'password', value: appSecret,\n placeholder: initialAppId === undefined ? 'QQ 机器人 AppSecret' : '输入新的 AppSecret(不回显)',\n onChange: (event) => { setAppSecret(event.currentTarget.value); },\n autoComplete: 'new-password',\n }),\n ),\n result !== null && !result.ok\n ? createElement('p', { className: 'imqb-error' }, result.error)\n : null,\n createElement('button', { className: 'imqb-btn imqb-btn--primary', type: 'submit', disabled: busy },\n busy ? '正在保存…' : '保存'),\n );\n}\n\n/** QQ 企鹅 logo(256×256 PNG data URI;深色图案配白底圆角,明暗主题下均可见) */\nconst QQ_BOT_ICON_PNG =\n 'data:image/png;base64,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';\n\n/** QQ 机器人图标(logo 图片,白底圆角容器内呈现) */\nfunction QqBotIcon({ size = 28 }: { size?: number }): ReactNode {\n return createElement('img', {\n src: QQ_BOT_ICON_PNG, alt: 'QQ', width: size, height: size, className: 'imqb-qqicon',\n });\n}\n\n/** 已绑定视图:回显 appId + 更换凭据 / 解绑入口 */\nfunction BoundView({ appId }: { appId: string }): ReactNode {\n const [editing, setEditing] = useState(false);\n const [unbindResult, setUnbindResult] = useState<{ ok: boolean; message: string } | null>(null);\n\n const unbind = useCallback((): void => {\n if (!window.confirm('确定解绑吗?\\n解绑后机器人立即下线,插件将重新进入扫码绑定流程。')) return;\n void fetch(BIND_UNBIND_PATH, { method: 'POST' })\n .then(async (res) => {\n const body = (await res.json().catch(() => ({}))) as { ok?: boolean; message?: string; error?: string };\n if (res.ok && body.ok === true) {\n setUnbindResult({ ok: true, message: body.message ?? '已解绑,插件将重载并重新进入绑定流程' });\n return;\n }\n setUnbindResult({ ok: false, message: body.error ?? `解绑失败(HTTP ${res.status})` });\n })\n .catch((err: unknown) => {\n setUnbindResult({ ok: false, message: err instanceof Error ? err.message : String(err) });\n });\n }, []);\n\n if (unbindResult !== null) {\n return createElement('div', { className: 'imqb-status' },\n createElement('div', { className: 'imqb-status-row' },\n createElement('div', { className: 'imqb-status-icon' }, unbindResult.ok ? '👋' : '⚠️'),\n createElement('div', { className: 'imqb-status-meta' },\n createElement('p', { className: 'imqb-status-title' }, unbindResult.message),\n ),\n ),\n );\n }\n\n if (editing) {\n return createElement('div', { className: 'imqb-status' },\n createElement('div', { className: 'imqb-status-row' },\n createElement('div', { className: 'imqb-status-meta' },\n createElement('p', { className: 'imqb-status-title' }, '更换凭据'),\n ),\n createElement('button', { className: 'imqb-ghost', onClick: () => { setEditing(false); } }, '返回'),\n ),\n createElement(ManualForm, { initialAppId: appId }),\n );\n }\n return createElement('div', { className: 'imqb-status' },\n createElement('div', { className: 'imqb-status-row' },\n createElement(QqBotIcon, { size: 28 }),\n createElement('div', { className: 'imqb-status-meta' },\n createElement('p', { className: 'imqb-status-title' }, '已绑定'),\n createElement('p', { className: 'imqb-status-sub imqb-mono' }, `AppID ${appId} · 私聊与群聊已接入`),\n ),\n ),\n createElement('div', { className: 'imqb-status-actions' },\n createElement('button', { className: 'imqb-btn imqb-btn--primary', onClick: () => { setEditing(true); } }, '更换凭据'),\n createElement('button', { className: 'imqb-btn imqb-btn--danger', onClick: unbind }, '解绑'),\n ),\n );\n}\n\n/** 未绑定视图:扫码 / 手动填写切换 */\nfunction UnboundView({ state }: { state: Extract<BindStateWire, { phase: 'waiting' }> }): ReactNode {\n const [mode, setMode] = useState<'qr' | 'manual'>('qr');\n const refresh = useCallback(() => { void fetch(BIND_REFRESH_PATH, { method: 'POST' }).catch(() => {}); }, []);\n\n if (mode === 'manual') {\n return createElement('div', { className: 'imqb-panel' },\n createElement('p', { className: 'imqb-title' }, '手动填写凭据'),\n createElement(ManualForm, {}),\n createElement('button', { className: 'imqb-ghost', onClick: () => { setMode('qr'); } }, '改用扫码绑定'),\n );\n }\n\n return createElement('div', { className: 'imqb-panel' },\n state.qrSvg === undefined\n ? null\n : createElement('img', { src: state.qrSvg, alt: 'QQ 扫码二维码', width: 220, height: 220, className: 'imqb-qr' }),\n createElement('p', { className: 'imqb-title' }, '扫码绑定 QQ 机器人'),\n createElement('p', { className: 'imqb-hint' }, '使用手机 QQ 扫描二维码完成绑定'),\n createElement('a', { href: state.url, target: '_blank', rel: 'noreferrer noopener', className: 'imqb-link' }, '二维码显示异常?在浏览器中打开'),\n createElement('div', { className: 'imqb-row' },\n createElement('button', { className: 'imqb-pill', onClick: refresh }, '刷新二维码'),\n createElement('button', { className: 'imqb-pill', onClick: () => { setMode('manual'); } }, '手动填写'),\n ),\n );\n}\n\n/** 依据宿主相位渲染面板主体(各展示位共用) */\nexport function BindPanelBody(): ReactNode {\n usePanelStyles();\n const { state, gone } = useBindState();\n // 扫码成功的连接过渡场景需要保留最后一帧二维码:waiting 相位持续记录,\n // bound 后清空(避免下次解绑重绑时旧码闪现)\n const [lastQr, setLastQr] = useState<string | null>(null);\n useEffect(() => {\n if (state === null) return;\n if (state.phase === 'waiting') {\n if (state.qrSvg !== undefined) setLastQr(state.qrSvg);\n } else if (state.phase === 'bound') {\n setLastQr(null);\n }\n }, [state]);\n\n if (gone) {\n return createElement('div', { className: 'imqb-panel' },\n createElement('div', { className: 'imqb-icon' }, '❔'),\n createElement('p', { className: 'imqb-hint' }, '插件未启用,或当前版本不支持端内配置'),\n );\n }\n\n if (state === null || state.phase === 'starting') {\n return createElement('div', { className: 'imqb-panel' },\n createElement('p', { className: 'imqb-hint' }, '正在获取绑定状态…'),\n );\n }\n\n if (state.phase === 'saving') {\n // 扫码路径:保留二维码做模糊过渡(手动填写路径无二维码,用紧凑态)\n if (lastQr !== null) {\n return createElement('div', { className: 'imqb-panel' },\n createElement('div', { className: 'imqb-scanned' },\n createElement('img', { src: lastQr, alt: 'QQ 扫码二维码', width: 220, height: 220, className: 'imqb-scanned-qr' }),\n createElement('div', { className: 'imqb-scanned-veil' },\n createElement('p', { className: 'imqb-scanned-title' }, '✅ 扫码成功'),\n createElement('p', { className: 'imqb-scanned-sub' }, '正在连接机器人,稍候…'),\n ),\n ),\n );\n }\n return createElement('div', { className: 'imqb-status' },\n createElement('div', { className: 'imqb-status-row' },\n createElement('div', { className: 'imqb-status-icon' }, '🎉'),\n createElement('div', { className: 'imqb-status-meta' },\n createElement('p', { className: 'imqb-status-title' }, '扫码成功'),\n createElement('p', { className: 'imqb-status-sub' }, '凭据已保存,插件正在重载,稍后即可开始对话'),\n ),\n ),\n );\n }\n\n if (state.phase === 'failed') {\n return createElement('div', { className: 'imqb-panel' },\n createElement('div', { className: 'imqb-icon' }, '⚠️'),\n createElement('p', { className: 'imqb-title' }, '绑定失败'),\n createElement('p', { className: 'imqb-hint' }, state.reason),\n createElement('div', { className: 'imqb-row' },\n createElement('button', { className: 'imqb-btn imqb-btn--primary', onClick: () => { window.location.reload(); } }, '重试'),\n ),\n );\n }\n\n if (state.phase === 'bound') {\n return createElement(BoundView, { appId: state.appId });\n }\n\n return createElement(UnboundView, { state });\n}\n","/**\n * QQ 机器人配置面板 — 必要配置的 UI 编辑\n *\n * UI 复刻 DSW 通用设置(settings-form 原语)的视觉风格:\n * 左对齐设置列、0.5px 行分隔、label 13px/500、控件右置;\n * Switch 为 36×20 aria-checked 结构(thumb translateX 动画);\n * 三值选择用分段控件(滑动指示器按段数/索引的 CSS 变量定位);\n * 保存按钮为 DSW 反色主按钮(label-primary 底 + bg-layer-3 字)。\n *\n * 数据流:GET /qqbot/im-qqbot/config 回显当前生效配置(appSecret\n * 已由宿主剔除)→ 表单编辑 → dirty diff → POST 仅提交变更键 →\n * 宿主白名单 + Schema 校验 → 最小写入 profile patch → HMR 重载生效。\n *\n * 字段策略:只开放用户必要的配置;cwd 只读展示;超时与性能调优\n * 类字段走 profile patch / 环境变量。\n */\nimport { createElement, useCallback, useEffect, useState, type CSSProperties, type ChangeEvent, type FormEvent, type ReactNode } from 'react';\nimport { BIND_CONFIG_PATH } from '../shared/bind-protocol.ts';\n\n/** 访问控制配置(与 src/config.ts 的 AccessControlConfig 对应的局部投影) */\ninterface AccessControlWire {\n c2cMode: 'open' | 'allowlist' | 'disabled';\n c2cAllow: string[];\n groupMode: 'open' | 'allowlist' | 'disabled';\n groupAllow: string[];\n}\n\n/** GET 回显的生效配置(appSecret 已剔除) */\ntype ConfigWire = {\n requireMention?: boolean;\n streaming?: boolean;\n showToolResults?: boolean;\n debug?: boolean;\n provider?: string;\n model?: string;\n preset?: string;\n groupPrompt?: string;\n directPrompt?: string;\n access?: AccessControlWire;\n cwd?: string;\n};\n\n/** 样式注入标记(幂等) */\nconst STYLE_ID = 'im-qqbot-config-panel-styles';\n\n/** DSW 通用设置风格(settings-form / Switch / SegmentedControl 原语复刻) */\nfunction useConfigPanelStyles(): void {\n useEffect(() => {\n if (typeof document === 'undefined') return;\n if (document.getElementById(STYLE_ID) !== null) return;\n const style = document.createElement('style');\n style.id = STYLE_ID;\n style.textContent = `\n.imqb2-form { display: flex; flex-direction: column; width: 100%; }\n.imqb2-group-title {\n padding: 14px 0 2px; font-size: 12px; font-weight: 600; line-height: 18px;\n color: var(--dsw-alias-label-tertiary); text-transform: uppercase; letter-spacing: .04em;\n}\n.imqb2-field { display: flex; flex-direction: column; gap: 6px; padding: 12px 0; }\n.imqb2-field + .imqb2-field { border-top: 0.5px solid var(--dsw-alias-border-l2); }\n.imqb2-head { display: flex; align-items: center; gap: 8px; min-height: 28px; }\n.imqb2-label {\n flex: 1; min-width: 0; font-size: 13px; font-weight: 500; line-height: 1.5;\n color: var(--dsw-alias-label-primary);\n}\n.imqb2-help { margin: 0; font-size: 12px; line-height: 1.6; color: var(--dsw-alias-label-secondary); }\n.imqb2-hint { margin: 0; font-size: 12px; line-height: 1.5; color: var(--dsw-alias-label-tertiary); }\n/* Switch(aria-checked 驱动,视觉态与无障碍态同源) */\n.imqb2-switch {\n box-sizing: border-box; position: relative; flex: 0 0 auto;\n width: 36px; height: 20px; padding: 2px; border: 0; border-radius: 999px;\n background: var(--dsw-alias-border-l3); cursor: pointer; font: inherit;\n}\n.imqb2-switch[aria-checked='true'] { background: var(--dsw-alias-brand-primary); }\n.imqb2-switch:disabled { cursor: default; opacity: 0.5; }\n.imqb2-switch:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}\n.imqb2-switch-thumb {\n display: block; width: 16px; height: 16px; border-radius: 50%;\n background: var(--dsw-alias-switch-thumb, #ffffff);\n transition: transform 120ms ease;\n}\n.imqb2-switch[aria-checked='true'] .imqb2-switch-thumb {\n background: var(--dsw-alias-label-primary-foreground, #ffffff);\n transform: translateX(16px);\n}\n/* 输入(官方 fields.input 复刻) */\n.imqb2-input {\n box-sizing: border-box; width: 100%; height: 34px; padding: 0 12px;\n border: 0.5px solid var(--dsw-alias-border-l4); border-radius: var(--dsw-radius-md, 8px);\n background: var(--dsw-alias-bg-layer-3); font: inherit; font-size: 13px; line-height: 1.5;\n color: var(--dsw-alias-label-primary); outline: none;\n}\n.imqb2-input:focus { outline: none; border-color: var(--dsw-alias-state-business-primary); }\n.imqb2-input:disabled { color: var(--dsw-alias-label-tertiary); cursor: default; }\n.imqb2-textarea { height: auto; min-height: 68px; padding: 8px 12px; resize: vertical; line-height: 1.5; }\n/* 分段控件(官方 SegmentedControl 复刻:指示器按段数/索引定位) */\n.imqb2-seg {\n position: relative; display: inline-grid; grid-auto-flow: column; grid-auto-columns: 1fr;\n gap: 2px; padding: 4px; border-radius: var(--dsw-radius-md, 8px);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n.imqb2-seg-indicator {\n position: absolute; top: 4px; left: 4px;\n width: calc((100% - 8px - 2px * (var(--imqb2-seg-count) - 1)) / var(--imqb2-seg-count));\n height: calc(100% - 8px);\n border: 0; border-radius: var(--dsw-radius-sm, 6px);\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: var(--dsw-elevation-soft, 0 1px 3px rgba(0,0,0,.08));\n transform: translateX(calc(var(--imqb2-seg-index) * (100% + 2px)));\n transition: transform 160ms ease;\n pointer-events: none;\n}\n.imqb2-seg-tab {\n box-sizing: border-box; position: relative; z-index: 1; height: 28px; padding: 0 16px;\n border: 0; border-radius: var(--dsw-radius-sm, 6px); background: transparent;\n color: var(--dsw-alias-label-secondary); font: inherit; font-size: 13px; line-height: 20px;\n font-weight: 500; white-space: nowrap; cursor: pointer; transition: color 120ms ease;\n}\n.imqb2-seg-tab:hover, .imqb2-seg-tab[aria-selected='true'] { color: var(--dsw-alias-label-primary); }\n.imqb2-seg-tab:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n/* 底栏(官方 SettingsForm.footer 复刻) */\n.imqb2-footer { display: flex; align-items: center; gap: 8px; padding-top: 16px; }\n.imqb2-note { flex: 1; min-width: 0; margin: 0; font-size: 12px; line-height: 1.5; color: var(--dsw-alias-label-tertiary); }\n.imqb2-note--error { color: var(--dsw-alias-state-error-primary, var(--dsw-alias-label-error)); }\n.imqb2-note--ok { color: var(--dsw-alias-label-secondary); }\n.imqb2-save {\n appearance: none; flex: none; border: 1px solid transparent;\n border-radius: var(--dsw-radius-md, 8px); padding: 5px 14px;\n font: inherit; font-size: 13px; line-height: 1.5; cursor: pointer;\n background: var(--dsw-alias-label-primary); color: var(--dsw-alias-bg-layer-3);\n}\n.imqb2-save:disabled { opacity: 0.4; cursor: default; }\n.imqb2-save:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 1px;\n}\n/* cwd 只读行 */\n.imqb2-readonly { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; color: var(--dsw-alias-label-secondary); word-break: break-all; margin: 0; }\n `;\n document.head.appendChild(style);\n return () => { style.remove(); };\n }, []);\n}\n\n/** 开关(官方 Switch 原语结构:aria-checked 驱动视觉态) */\nfunction Switch({ checked, label, onChange }: {\n checked: boolean; label: string; onChange: (next: boolean) => void;\n}): ReactNode {\n return createElement('button', {\n type: 'button', role: 'switch', 'aria-checked': checked, 'aria-label': label,\n className: 'imqb2-switch',\n onClick: () => { onChange(!checked); },\n }, createElement('span', { className: 'imqb2-switch-thumb' }));\n}\n\n/** 访问模式分段选择(官方 SegmentedControl 结构:CSS 变量定位滑动指示器) */\nfunction Segmented({ value, options, onChange, label }: {\n value: AccessMode; options: ReadonlyArray<{ value: AccessMode; label: string }>;\n onChange: (next: AccessMode) => void; label: string;\n}): ReactNode {\n const index = Math.max(0, options.findIndex((o) => o.value === value));\n const trackStyle = {\n '--imqb2-seg-count': options.length,\n '--imqb2-seg-index': index,\n } as CSSProperties;\n return createElement('div', { className: 'imqb2-seg', role: 'tablist', 'aria-label': label, style: trackStyle },\n createElement('span', { className: 'imqb2-seg-indicator' }),\n options.map((o) => createElement('button', {\n key: o.value, type: 'button', role: 'tab', 'aria-selected': o.value === value,\n className: 'imqb2-seg-tab', onClick: () => { onChange(o.value); },\n }, o.label)),\n );\n}\n\n/** 开关行(label 左 + Switch 右 + 可选 help) */\nfunction SwitchRow({ label, help, checked, onChange }: {\n label: string; help?: string; checked: boolean; onChange: (next: boolean) => void;\n}): ReactNode {\n return createElement('div', { className: 'imqb2-field' },\n createElement('div', { className: 'imqb2-head' },\n createElement('span', { className: 'imqb2-label' }, label),\n createElement(Switch, { checked, label, onChange }),\n ),\n help === undefined ? null : createElement('p', { className: 'imqb2-help' }, help),\n );\n}\n\n/** 文本行(label 上 + 输入下,与官方 fields 布局一致) */\nfunction FieldRow({ label, help, value, placeholder, onChange }: {\n label: string; help?: string; value: string; placeholder?: string; onChange: (next: string) => void;\n}): ReactNode {\n return createElement('div', { className: 'imqb2-field' },\n createElement('span', { className: 'imqb2-label' }, label),\n createElement('input', {\n className: 'imqb2-input', value, placeholder, spellCheck: false,\n onChange: (event: ChangeEvent<HTMLInputElement>) => { onChange(event.currentTarget.value); },\n }),\n help === undefined ? null : createElement('p', { className: 'imqb2-hint' }, help),\n );\n}\n\n/** 多行文本行 */\nfunction AreaRow({ label, help, value, rows, onChange }: {\n label: string; help?: string; value: string; rows?: number; onChange: (next: string) => void;\n}): ReactNode {\n return createElement('div', { className: 'imqb2-field' },\n createElement('span', { className: 'imqb2-label' }, label),\n createElement('textarea', {\n className: 'imqb2-input imqb2-textarea', value, rows: rows ?? 3,\n onChange: (event: ChangeEvent<HTMLTextAreaElement>) => { onChange(event.currentTarget.value); },\n }),\n help === undefined ? null : createElement('p', { className: 'imqb2-hint' }, help),\n );\n}\n\n/** 访问模式分段选择行 */\nfunction SegmentedRow({ label, help, value, options, onChange }: {\n label: string; help?: string; value: AccessMode;\n options: ReadonlyArray<{ value: AccessMode; label: string }>; onChange: (next: AccessMode) => void;\n}): ReactNode {\n return createElement('div', { className: 'imqb2-field' },\n createElement('div', { className: 'imqb2-head' },\n createElement('span', { className: 'imqb2-label' }, label),\n createElement(Segmented, { value, options, onChange, label }),\n ),\n help === undefined ? null : createElement('p', { className: 'imqb2-hint' }, help),\n );\n}\n\ntype AccessMode = AccessControlWire['c2cMode'];\n\nconst MODE_OPTIONS: ReadonlyArray<{ value: AccessMode; label: string }> = [\n { value: 'open', label: '开放' },\n { value: 'allowlist', label: '白名单' },\n { value: 'disabled', label: '停用' },\n];\n\n/** 深比较(表单值与初始回显值的 dirty 判断) */\nfunction shallowEqual(a: unknown, b: unknown): boolean {\n return JSON.stringify(a) === JSON.stringify(b);\n}\n\n/**\n * 配置面板主体。\n *\n * 保存仅提交变更键(服务端按白名单合并),保存成功后提示\n * HMR 重载语义(进行中的机器人会话将重置)。\n */\nexport function ConfigPanel(): ReactNode {\n useConfigPanelStyles();\n const [initial, setInitial] = useState<ConfigWire | null>(null);\n const [form, setForm] = useState<ConfigWire | null>(null);\n const [busy, setBusy] = useState(false);\n const [result, setResult] = useState<{ ok: boolean; message: string } | null>(null);\n const [loadError, setLoadError] = useState<string | null>(null);\n\n useEffect(() => {\n let stopped = false;\n void fetch(BIND_CONFIG_PATH, { cache: 'no-store' })\n .then(async (res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const body = (await res.json()) as { config: ConfigWire };\n if (stopped) return;\n setInitial(body.config);\n setForm(body.config);\n })\n .catch((err: unknown) => {\n if (!stopped) setLoadError(err instanceof Error ? err.message : String(err));\n });\n return () => { stopped = true; };\n }, []);\n\n const patch = useCallback(<K extends keyof ConfigWire>(key: K, value: ConfigWire[K]): void => {\n setForm((current) => current === null ? current : { ...current, [key]: value });\n setResult(null);\n }, []);\n\n const submit = useCallback((event: FormEvent): void => {\n event.preventDefault();\n if (busy || initial === null || form === null) return;\n const changed: Record<string, unknown> = {};\n for (const key of Object.keys(form) as Array<keyof ConfigWire>) {\n if (!shallowEqual(form[key], initial[key])) {\n changed[key] = form[key];\n }\n }\n if (Object.keys(changed).length === 0) return;\n\n setBusy(true);\n void fetch(BIND_CONFIG_PATH, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(changed),\n })\n .then(async (res) => {\n const body = (await res.json().catch(() => ({}))) as { ok?: boolean; message?: string; error?: string };\n if (res.ok && body.ok === true) {\n setResult({ ok: true, message: body.message ?? '配置已保存,插件将自动重载' });\n setInitial(form);\n return;\n }\n setResult({ ok: false, message: body.error ?? `保存失败(HTTP ${res.status})` });\n })\n .catch((err: unknown) => {\n setResult({ ok: false, message: err instanceof Error ? err.message : String(err) });\n })\n .finally(() => { setBusy(false); });\n }, [busy, form, initial]);\n\n if (loadError !== null) {\n return createElement('p', { className: 'imqb2-hint', style: { padding: '12px 0' } },\n `配置加载失败:${loadError}`);\n }\n if (initial === null || form === null) {\n return createElement('p', { className: 'imqb2-hint', style: { padding: '12px 0' } }, '正在加载配置…');\n }\n\n const dirty = (Object.keys(form) as Array<keyof ConfigWire>).some((key) => !shallowEqual(form[key], initial[key]));\n const access: AccessControlWire = form.access ?? { c2cMode: 'open', c2cAllow: [], groupMode: 'open', groupAllow: [] };\n\n return createElement('form', { className: 'imqb2-form', onSubmit: submit },\n createElement('div', { className: 'imqb2-group-title' }, '访问控制'),\n createElement(SegmentedRow, {\n label: '私聊', value: access.c2cMode, options: MODE_OPTIONS,\n onChange: (v) => { patch('access', { ...access, c2cMode: v }); },\n }),\n access.c2cMode === 'allowlist'\n ? createElement(AreaRow, {\n label: '私聊白名单', help: '每行一个 openid', rows: 3,\n value: access.c2cAllow.join('\\n'),\n onChange: (v) => { patch('access', { ...access, c2cAllow: v.split('\\n').map((s) => s.trim()).filter(Boolean) }); },\n })\n : null,\n createElement(SegmentedRow, {\n label: '群聊', value: access.groupMode, options: MODE_OPTIONS,\n onChange: (v) => { patch('access', { ...access, groupMode: v }); },\n }),\n access.groupMode === 'allowlist'\n ? createElement(AreaRow, {\n label: '群聊白名单', help: '每行一个群 openid', rows: 3,\n value: access.groupAllow.join('\\n'),\n onChange: (v) => { patch('access', { ...access, groupAllow: v.split('\\n').map((s) => s.trim()).filter(Boolean) }); },\n })\n : null,\n\n createElement('div', { className: 'imqb2-group-title' }, '基本'),\n createElement(SwitchRow, {\n label: '群聊需要 @机器人', checked: form.requireMention ?? true,\n help: '开启后群聊中只有 @机器人 的消息会触发回复',\n onChange: (v) => { patch('requireMention', v); },\n }),\n createElement(SwitchRow, {\n label: '流式输出', checked: form.streaming ?? true,\n help: '回复内容分段实时推送到聊天',\n onChange: (v) => { patch('streaming', v); },\n }),\n createElement(SwitchRow, {\n label: '显示工具调用结果', checked: form.showToolResults ?? false,\n help: '在聊天中展示 agent 工具调用的结构化结果',\n onChange: (v) => { patch('showToolResults', v); },\n }),\n\n createElement('div', { className: 'imqb2-group-title' }, '模型'),\n createElement(FieldRow, {\n label: 'Provider', value: form.provider ?? '', placeholder: '留空继承宿主默认',\n onChange: (v) => { patch('provider', v); },\n }),\n createElement(FieldRow, {\n label: 'Model', value: form.model ?? '', placeholder: '留空继承宿主默认',\n onChange: (v) => { patch('model', v); },\n }),\n createElement(FieldRow, {\n label: 'Preset', value: form.preset ?? '', placeholder: 'Agent preset id',\n onChange: (v) => { patch('preset', v); },\n }),\n\n createElement('div', { className: 'imqb2-group-title' }, '补充指令'),\n createElement(AreaRow, {\n label: '群聊额外 system prompt', value: form.groupPrompt ?? '',\n onChange: (v) => { patch('groupPrompt', v); },\n }),\n createElement(AreaRow, {\n label: '私聊额外 system prompt', value: form.directPrompt ?? '',\n onChange: (v) => { patch('directPrompt', v); },\n }),\n\n form.cwd !== undefined\n ? createElement('div', { className: 'imqb2-field' },\n createElement('div', { className: 'imqb2-head' },\n createElement('span', { className: 'imqb2-label' }, 'Agent 工作目录'),\n createElement('span', { className: 'imqb2-hint' }, '只读'),\n ),\n createElement('p', { className: 'imqb2-readonly' }, form.cwd),\n )\n : null,\n\n createElement('div', { className: 'imqb2-footer' },\n result !== null\n ? createElement('p', { className: `imqb2-note${result.ok ? ' imqb2-note--ok' : ' imqb2-note--error'}` },\n (result.ok ? '' : '⚠️ ') + result.message)\n : dirty\n ? createElement('p', { className: 'imqb2-note' }, '保存后插件将重载,进行中的机器人会话将重置')\n : createElement('p', { className: 'imqb2-note' }),\n createElement('button', { className: 'imqb2-save', type: 'submit', disabled: busy || !dirty },\n busy ? '正在保存…' : '保存'),\n ),\n );\n}\n","/**\n * im-qqbot 浏览器半边 —— QQ Bot 端内扫码绑定入口\n *\n * 宿主插件在凭据缺失时注册 /qqbot/im-qqbot/bind 状态路由;本插件在\n * Web / Desktop 提供两个展示位:\n *\n * 1. 设置页「QQ Bot」栏目(settings.section 席位)——注册即展示,\n * 无 Session surface 时序依赖,待绑定/已绑定状态常驻可见;\n * 2. 右侧栏「QQ Bot 绑定」页(sidebarRightTabs)——Start 页入口 +\n * 待绑定时自动打开(失败随轮询重试)。\n *\n * 运行时依赖仅 react(客户端平台种子表提供);宿主服务经 cordis inject\n * 声明访问(声明缺失时插件保持 inactive,不阻塞浏览器启动)。\n */\nimport type { Context } from '@deepseek-ai/cordis';\nimport { createElement, type ReactNode } from 'react';\nimport { BIND_STATE_PATH } from '../shared/bind-protocol.ts';\nimport { BindPanelBody } from './bind-page.ts';\nimport { ConfigPanel } from './config-panel.ts';\n\nexport const name = 'im-qqbot-client';\nexport const inject = ['slots', 'sidebarRight', 'sidebarRightTabs'];\n\n/** 侧栏 Tab 类型(ui-sidebar-right 契约的局部投影) */\nconst TAB_KIND = 'qqbot-bind';\n/** 席位注册 key(Tab 类型 id,席位按其分发;只需全局唯一,与包名解耦) */\nconst TAB_ID = 'im-qqbot/bind';\n\n/** ui-sidebar-right 的 Tab 注册表服务(局部投影) */\ninterface TabRegistryLike {\n register(definition: {\n id: string;\n kind: string;\n title: (address: string) => string;\n guide?: ReadonlyArray<{\n id: string;\n order: number;\n title: () => string;\n description: () => string;\n icon: unknown;\n }>;\n }): () => void;\n}\n\n/** ui-sidebar-right 的导航控制器服务(局部投影) */\ninterface SidebarRightLike {\n openTab(kind: string, options?: Record<string, unknown>): unknown;\n}\n\n/** ui-slots 的席位系统服务(局部投影) */\ninterface SlotsLike {\n inject(slotName: string, register: () => (() => void)): () => void;\n register(spec: Record<string, unknown>, component: unknown): () => void;\n}\n\n/** 绑定入口图标(QQ 机器人,跟随主题图标色变量) */\nfunction BindGuideIcon(): ReactNode {\n return createElement('svg', {\n width: 24, height: 24, viewBox: '0 0 24 24', fill: 'none', 'aria-hidden': true,\n },\n createElement('path', {\n d: 'M9.50039 11.1504C9.96983 11.1504 10.3504 11.5309 10.3504 12.0004V14.0004C10.3504 14.4698 9.96983 14.8504 9.50039 14.8504C9.03095 14.8504 8.65039 14.4698 8.65039 14.0004V12.0004C8.65039 11.5309 9.03095 11.1504 9.50039 11.1504Z',\n fill: 'var(------icon_primary, #1A1A1A)',\n }),\n createElement('path', {\n d: 'M14.5004 11.1504C14.9698 11.1504 15.3504 11.5309 15.3504 12.0004V14.0004C15.3504 14.4698 14.9698 14.8504 14.5004 14.8504C14.0309 14.8504 13.6504 14.4698 13.6504 14.0004V12.0004C13.6504 11.5309 14.0309 11.1504 14.5004 11.1504Z',\n fill: 'var(------icon_primary, #1A1A1A)',\n }),\n createElement('path', {\n fillRule: 'evenodd',\n clipRule: 'evenodd',\n d: 'M12.8504 5.3109C13.5299 4.99138 14.0004 4.30063 14.0004 3.5C14.0004 2.39543 13.1049 1.5 12.0004 1.5C10.8958 1.5 10.0004 2.39543 10.0004 3.5C10.0004 4.30065 10.4708 4.99141 11.1504 5.31092V6.18851C6.38487 6.61795 2.65039 10.6231 2.65039 15.5004V17.0004C2.65039 19.679 4.82181 21.8504 7.50039 21.8504H16.5004C19.179 21.8504 21.3504 19.679 21.3504 17.0004V15.5004C21.3504 10.6231 17.6159 6.61795 12.8504 6.18851V5.3109ZM12.0004 7.85039C7.77541 7.85039 4.35039 11.2754 4.35039 15.5004V17.0004C4.35039 18.7401 5.76069 20.1504 7.50039 20.1504H16.5004C18.2401 20.1504 19.6504 18.7401 19.6504 17.0004V15.5004C19.6504 11.2754 16.2254 7.85039 12.0004 7.85039Z',\n fill: 'var(------icon_primary, #1A1A1A)',\n }),\n );\n}\n\n/** 设置页「QQ Bot」栏目:面板常驻展示绑定状态 */\nfunction QQBotSettingsSection(): ReactNode {\n return createElement('div', null,\n createElement(BindPanelBody),\n createElement(ConfigPanel),\n );\n}\n\nexport function apply(ctx: Context): void {\n const tabs = (ctx as unknown as { sidebarRightTabs?: TabRegistryLike }).sidebarRightTabs;\n const right = (ctx as unknown as { sidebarRight?: SidebarRightLike }).sidebarRight;\n const slots = (ctx as unknown as { slots?: SlotsLike }).slots;\n\n const disposers: Array<() => void> = [];\n\n // 1. 设置页「QQ Bot」栏目(主展示位:注册即展示,无时序依赖)\n if (slots !== undefined) {\n disposers.push( slots.inject('settings.section', () => slots.register(\n { name: 'settings.section', id: 'qqbot', order: 7, label: 'QQ 机器人' },\n QQBotSettingsSection,\n )));\n }\n\n // 2. 侧栏绑定页(快捷展示位:Start 页入口 + 待绑定自动打开)\n if (tabs !== undefined && slots !== undefined) {\n disposers.push(tabs.register({\n id: TAB_ID,\n kind: TAB_KIND,\n title: () => 'QQ 机器人绑定',\n guide: [{\n id: 'bind',\n order: 90,\n title: () => 'QQ 机器人绑定',\n description: () => '扫码或手动填写,绑定 QQ 机器人',\n icon: BindGuideIcon,\n }],\n }));\n disposers.push(slots.inject('sidebar.right.pane.tab', () => slots.register(\n { name: 'sidebar.right.pane.tab', key: TAB_ID },\n BindPanelBody,\n )));\n // 待绑定检测与自动引导\n disposers.push(watchAndPrompt(right));\n }\n\n (ctx as unknown as { effect(fn: () => () => void, name?: string): void }).effect(() => () => {\n for (const dispose of disposers.reverse()) dispose();\n }, 'im-qqbot-client.binding');\n}\n\n/**\n * 轮询绑定状态:待绑定时自动打开绑定页。\n *\n * - 页面隐藏时降频轮询(可见时立即恢复节拍)\n * - 404(已绑定/未安装)时退避到 30s,保持低成本常驻探测\n * - 每次页面加载至多打开一次(用户手动关闭后不打扰);\n * 打开失败(如启动早期 Session surface 尚未挂载)不消费机会,\n * 由下一轮轮询(3s)自动重试\n */\nfunction watchAndPrompt(right: SidebarRightLike | undefined): () => void {\n let stopped = false;\n let opened = right === undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const schedule = (ms: number): void => {\n timer = setTimeout(() => { void tick(); }, ms);\n };\n\n const tick = async (): Promise<void> => {\n if (stopped) return;\n if (typeof document !== 'undefined' && document.visibilityState === 'hidden') {\n schedule(5000);\n return;\n }\n try {\n const res = await fetch(BIND_STATE_PATH, { cache: 'no-store' });\n if (res.ok) {\n const body = (await res.json()) as { phase?: string };\n if (body.phase === 'waiting' && !opened && right !== undefined) {\n try {\n right.openTab(TAB_KIND);\n opened = true;\n } catch (err) {\n // 启动早期 Session surface 可能尚未挂载:保留机会,3s 后随轮询重试\n console.error('[im-qqbot] 打开绑定页失败,稍后重试', err);\n }\n }\n schedule(3000);\n return;\n }\n // 404:已绑定或插件未启用\n schedule(30000);\n return;\n } catch {\n // 宿主暂不可达(启动窗口期):退避重试\n }\n schedule(10000);\n };\n\n void tick();\n return () => { stopped = true; if (timer !== undefined) clearTimeout(timer); };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["STYLE_ID","useState","useRef","useCallback","createElement","createElement","useState","useCallback","createElement"],"sources":["../src/shared/bind-protocol.ts","../src/client/bind-page.ts","../src/client/config-panel.ts","../src/client/index.ts"],"sourcesContent":["/**\n * 端内绑定协议 —— 宿主路由与客户端面板的共享契约\n *\n * 类型与路径常量的唯一事实源:宿主(setup/bind-routes.ts)与浏览器\n * (client/bind-page.ts)各自 import,杜绝两端协议漂移。\n * 本模块必须保持纯类型 + 纯常量(零 node 依赖、零副作用):\n * 客户端 tsdown 构建会将其内联进 bundle。\n */\n\n/** 状态查询(绑定页轮询) */\nexport const BIND_STATE_PATH = '/qqbot/im-qqbot/bind';\n\n/** 刷新二维码(绑定页按钮) */\nexport const BIND_REFRESH_PATH = '/qqbot/im-qqbot/bind/refresh';\n\n/** 手动填写/编辑凭据(绑定页表单) */\nexport const BIND_MANUAL_PATH = '/qqbot/im-qqbot/bind/manual';\n\n/** 解绑:移除已保存凭据,回到绑定流程 */\nexport const BIND_UNBIND_PATH = '/qqbot/im-qqbot/bind/unbind';\n\n/** 配置读写(设置面板表单) */\nexport const BIND_CONFIG_PATH = '/qqbot/im-qqbot/config';\n\n/** 线上协议(HTTP 路由序列化形态) */\nexport type BindStateWire =\n | { phase: 'starting' }\n | { phase: 'waiting'; url: string; qrSvg?: string; issuedAt: number }\n | { phase: 'saving' }\n | { phase: 'failed'; reason: string }\n | { phase: 'bound'; appId: string };\n\n/** manual / unbind 操作的统一响应 */\nexport interface BindActionResponse {\n ok: boolean;\n message?: string;\n error?: string;\n}\n","/**\n * 端内绑定面板 — 扫码 / 手动填写 / 已绑定编辑\n *\n * 宿主插件注册 /qqbot/im-qqbot/bind 路由(待绑定与已绑定 fiber 均常驻):\n * - 未绑定:waiting(二维码)/ starting / saving / failed 相位 + manual 提交\n * - 已绑定:bound 相位(回显脱敏 appId,secret 不回传)+ manual 更换 + 解绑\n * 扫码成功或手动保存均写入 profile patch 并经 HMR 重载生效。\n *\n * 样式为注入式 CSS 类(imqb-* 命名空间,随面板挂载注入一次):\n * hover/过渡/focus 样式无法用 inline style 表达,统一走类;\n * 颜色尽量取 DSW 主题变量(--dsw-alias-*),缺省值兜底。\n *\n * 同一组件复用于两种展示位(侧栏绑定页 / 设置页 QQ Bot 栏目)。\n * 运行时仅依赖 react(dsh 客户端平台种子表提供);宿主通信走同源 fetch,\n * Desktop 下由壳的 IPC 桥自动附加 Host 认证转发。\n */\nimport { createElement, useCallback, useEffect, useRef, useState, type FormEvent, type ReactNode } from 'react';\nimport {\n BIND_MANUAL_PATH,\n BIND_REFRESH_PATH,\n BIND_STATE_PATH,\n BIND_UNBIND_PATH,\n type BindStateWire,\n} from '../shared/bind-protocol.ts';\n\n/** 轮询间隔(毫秒):活跃轮询 / 失败退避 */\nconst ACTIVE_POLL_MS = 2000;\nconst RETRY_POLL_MS = 3000;\n\n/** 样式注入标记(幂等) */\nconst STYLE_ID = 'im-qqbot-bind-panel-styles';\n\n/**\n * 注入面板样式(一次)。交互态(hover/active/focus)无法用 inline style\n * 表达,统一收敛到类;DSW 主题变量缺失时用中性值兜底。\n */\nfunction usePanelStyles(): void {\n useEffect(() => {\n if (typeof document === 'undefined') return;\n if (document.getElementById(STYLE_ID) !== null) return;\n const style = document.createElement('style');\n style.id = STYLE_ID;\n style.textContent = `\n.imqb-panel {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n gap: 14px; padding: 24px; min-height: 320px; text-align: center; font-size: 14px;\n}\n.imqb-title { margin: 0; font-size: 16px; font-weight: 600; }\n.imqb-hint { margin: 0; opacity: 0.75; line-height: 1.6; }\n.imqb-mono { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 13px; }\n.imqb-link { font-size: 13px; opacity: 0.85; color: var(--dsw-alias-brand, #4d6bfe); text-decoration: none; }\n.imqb-link:hover { text-decoration: underline; }\n.imqb-icon { font-size: 32px; line-height: 1; }\n.imqb-qr { border-radius: 10px; background: #fff; padding: 10px; max-width: 100%; }\n.imqb-row { display: flex; gap: 10px; justify-content: center; flex-wrap: wrap; }\n.imqb-btn, .imqb-pill {\n font: inherit; cursor: pointer; color: inherit;\n transition: background-color .15s ease, border-color .15s ease, color .15s ease, opacity .15s ease;\n}\n.imqb-btn:disabled, .imqb-pill:disabled { opacity: 0.5; cursor: default; }\n.imqb-btn {\n padding: 7px 18px; border-radius: 8px; font-size: 13px;\n border: 1px solid var(--dsw-alias-border-l2, rgba(128, 128, 128, 0.4));\n background: transparent;\n}\n.imqb-btn:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-hover, rgba(128, 128, 128, 0.12)); }\n.imqb-btn--primary {\n border-color: transparent;\n background: var(--dsw-alias-brand, #4d6bfe); color: #fff; font-weight: 500;\n}\n.imqb-btn--primary:hover:not(:disabled) { background: var(--dsw-alias-brand-strong, #3b5cf0); }\n.imqb-btn--danger { color: var(--dsw-alias-danger, #f26d6d); border-color: var(--dsw-alias-danger, rgba(242, 109, 109, 0.5)); }\n.imqb-btn--danger:hover:not(:disabled) { background: var(--dsw-alias-danger, rgba(242, 109, 109, 0.12)); }\n.imqb-ghost {\n border: none; background: transparent; opacity: 0.65; padding: 4px 8px;\n font: inherit; font-size: 13px; cursor: pointer; color: inherit;\n}\n.imqb-ghost:hover { opacity: 1; text-decoration: underline; }\n.imqb-pill {\n padding: 5px 16px; border-radius: 999px; font-size: 13px;\n border: 1px solid var(--dsw-alias-border-l2, rgba(128, 128, 128, 0.4)); background: transparent;\n}\n.imqb-pill:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-hover, rgba(128, 128, 128, 0.12)); }\n.imqb-btn:focus-visible, .imqb-pill:focus-visible, .imqb-input:focus-visible, .imqb-ghost:focus-visible {\n outline: 2px solid var(--dsw-alias-brand, #4d6bfe); outline-offset: 1px;\n}\n.imqb-form { display: flex; flex-direction: column; gap: 12px; width: min(320px, 100%); box-sizing: border-box; }\n.imqb-field { display: flex; flex-direction: column; gap: 5px; text-align: left; font-size: 13px; }\n.imqb-input {\n padding: 8px 10px; border-radius: 8px; box-sizing: border-box; width: 100%;\n border: 1px solid var(--dsw-alias-border-l2, rgba(128, 128, 128, 0.4));\n background: var(--dsw-alias-bg-input, rgba(128, 128, 128, 0.08));\n color: inherit; font: inherit; font-size: 13px; outline: none;\n}\n.imqb-input:focus { border-color: var(--dsw-alias-brand, #4d6bfe); }\n.imqb-error { margin: 0; font-size: 12px; color: var(--dsw-alias-danger, #f26d6d); }\n/* 紧凑状态视图(已绑定 / 过渡态):设置行风格,无居中大卡留白 */\n.imqb-status { display: flex; flex-direction: column; text-align: left; font-size: 14px; }\n.imqb-status-row { display: flex; align-items: center; gap: 12px; padding: 12px 0; }\n.imqb-status-icon { font-size: 24px; line-height: 1; flex: none; }\n.imqb-qqicon {\n flex: none; display: block; border-radius: 8px;\n background: #fff; /* 深色企鹅 logo 需浅底,暗色主题下保持可见 */\n}\n.imqb-status-meta { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1; }\n.imqb-status-title { margin: 0; font-size: 14px; font-weight: 600; line-height: 1.5; }\n.imqb-status-sub { margin: 0; font-size: 12px; line-height: 1.5; color: var(--dsw-alias-label-tertiary, inherit); opacity: .85; }\n.imqb-status-actions { display: flex; align-items: center; gap: 8px; padding: 4px 0 12px; }\n/* 扫码成功后的连接过渡:二维码模糊变暗 + 覆盖层 */\n.imqb-scanned { position: relative; display: inline-block; }\n.imqb-scanned-qr {\n display: block; border-radius: 10px; background: #fff; padding: 10px;\n filter: blur(6px) saturate(0.6); opacity: 0.55;\n}\n.imqb-scanned-veil {\n position: absolute; inset: 0; display: flex; flex-direction: column;\n align-items: center; justify-content: center; gap: 6px; text-align: center;\n}\n.imqb-scanned-title { margin: 0; font-size: 15px; font-weight: 600; }\n.imqb-scanned-sub { margin: 0; font-size: 12px; opacity: 0.75; line-height: 1.6; }\n `;\n document.head.appendChild(style);\n return () => { style.remove(); };\n }, []);\n}\n\n/**\n * 绑定状态轮询 hook。\n *\n * 404 语义分两种:从未拿到过路由 = 插件未启用(终态);\n * 曾经拿到过 = HMR 重载窗口期(manual/unbind 保存后路由短暂消失),\n * 低频等待恢复而不是判定终态——否则保存成功提示会被\n * 「插件未启用」覆盖且无法自愈。\n *\n * bound 为稳定态:轮询大幅降频(30s)。因此解绑等本地动作后必须\n * 调用 recheck() 立即重置节拍——否则视图最长停留 30s+ 才收敛到\n * 新相位(如解绑后的 waiting 二维码)。\n *\n * @returns 轮询快照与 recheck:state 为宿主相位(null = 加载中),\n * gone 表示插件未启用(从未注册过路由),recheck 废弃当前\n * 定时器并立即重新轮询(新轮询链取代旧链,不产生双计时器)。\n */\nfunction useBindState(): { state: BindStateWire | null; gone: boolean; recheck: () => void } {\n const [state, setState] = useState<BindStateWire | null>(null);\n const [gone, setGone] = useState(false);\n const recheckRef = useRef<() => void>(() => {});\n\n useEffect(() => {\n let stopped = false;\n let sawRoute = false;\n let generation = 0;\n let running = false;\n let restartAfterFlight = false;\n // recheck 后的快速收敛窗口:解绑等动作改变的是服务端状态(经\n // HMR 异步生效),动作后立即轮询拿到的可能仍是旧 fiber 的相位\n // (如 bound→30s 降频),窗口期内强制快轮询直到相位真正变化\n let urgentUntil = 0;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const schedule = (ms: number): void => {\n timer = setTimeout(() => { void tick(); }, ms);\n };\n\n const intervalFor = (phase: BindStateWire['phase']): number => {\n const base = phase === 'saving' ? 500 : phase === 'bound' ? 30000 : ACTIVE_POLL_MS;\n return Date.now() < urgentUntil ? Math.min(base, ACTIVE_POLL_MS) : base;\n };\n\n const tick = async (): Promise<void> => {\n if (stopped || running) return;\n running = true;\n const myGeneration = generation;\n const alive = (): boolean => myGeneration === generation && !stopped;\n try {\n const res = await fetch(BIND_STATE_PATH, { cache: 'no-store' });\n if (res.status === 404) {\n if (!stopped && !sawRoute) setGone(true);\n // sawRoute:HMR 窗口期,保留当前视图等待路由恢复\n else if (alive()) schedule(Date.now() < urgentUntil ? 1000 : 3000);\n return;\n }\n if (!res.ok) {\n if (alive()) schedule(RETRY_POLL_MS);\n return;\n }\n sawRoute = true;\n const body = (await res.json()) as BindStateWire;\n if (!alive()) return;\n setState(body);\n schedule(intervalFor(body.phase));\n return;\n } catch {\n // 宿主启动窗口期不可达:退避重试\n } finally {\n running = false;\n // 在飞期间被 recheck 取代:接力启动新轮询链(否则链会断)\n if (restartAfterFlight && !stopped) {\n restartAfterFlight = false;\n void tick();\n }\n }\n if (alive()) schedule(RETRY_POLL_MS);\n };\n\n // 立即重置节拍:废弃当前计时器,旧轮询链(在飞请求)作废,\n // 新链立即发起,并进入快速收敛窗口\n recheckRef.current = (): void => {\n generation += 1;\n urgentUntil = Date.now() + 15000;\n if (timer !== undefined) clearTimeout(timer);\n if (running) {\n restartAfterFlight = true;\n return;\n }\n void tick();\n };\n\n void tick();\n return () => { stopped = true; if (timer !== undefined) clearTimeout(timer); };\n }, []);\n\n const recheck = useCallback((): void => { recheckRef.current(); }, []);\n\n return { state, gone, recheck };\n}\n\ninterface ManualResult { ok: boolean; message?: string; error?: string }\n\n/** 手动提交凭据(填写 / 更换共用) */\nasync function submitManualCredentials(appId: string, appSecret: string): Promise<ManualResult> {\n try {\n const res = await fetch(BIND_MANUAL_PATH, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ appId, appSecret }),\n });\n const body = (await res.json().catch(() => ({}))) as ManualResult;\n if (res.ok && body.ok) return { ok: true, message: body.message };\n return { ok: false, error: body.error ?? `保存失败(HTTP ${res.status})` };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n}\n\n/**\n * 手动凭据表单(填写 / 更换共用)。\n *\n * appSecret 永不回显(占位符提示),提交成功后展示保存结果;\n * 宿主写入 profile patch 并经 HMR 重载,状态轮询随后收敛为 bound。\n */\nfunction ManualForm({ initialAppId }: { initialAppId?: string }): ReactNode {\n const [appId, setAppId] = useState(initialAppId ?? '');\n const [appSecret, setAppSecret] = useState('');\n const [busy, setBusy] = useState(false);\n const [result, setResult] = useState<ManualResult | null>(null);\n\n const submit = useCallback((event: FormEvent): void => {\n event.preventDefault();\n if (busy) return;\n const trimmedId = appId.trim();\n const trimmedSecret = appSecret.trim();\n if (trimmedId.length === 0 || trimmedSecret.length === 0) {\n setResult({ ok: false, error: 'appId 与 appSecret 均为必填' });\n return;\n }\n setBusy(true);\n void submitManualCredentials(trimmedId, trimmedSecret).then((outcome) => {\n setResult(outcome);\n setBusy(false);\n });\n }, [appId, appSecret, busy]);\n\n if (result !== null && result.ok) {\n return createElement('div', { className: 'imqb-status' },\n createElement('div', { className: 'imqb-status-row' },\n createElement('div', { className: 'imqb-status-icon' }, '✅'),\n createElement('div', { className: 'imqb-status-meta' },\n createElement('p', { className: 'imqb-status-title' }, result.message ?? '凭据已保存'),\n createElement('p', { className: 'imqb-status-sub' }, '插件将自动重载;稍后即可开始对话'),\n ),\n ),\n );\n }\n\n return createElement('form', { className: 'imqb-form', onSubmit: submit },\n createElement('label', { className: 'imqb-field' },\n 'AppID',\n createElement('input', {\n className: 'imqb-input', value: appId, placeholder: 'QQ 机器人 AppID',\n onChange: (event) => { setAppId(event.currentTarget.value); },\n autoComplete: 'off', spellCheck: false,\n }),\n ),\n createElement('label', { className: 'imqb-field' },\n 'AppSecret',\n createElement('input', {\n className: 'imqb-input', type: 'password', value: appSecret,\n placeholder: initialAppId === undefined ? 'QQ 机器人 AppSecret' : '输入新的 AppSecret(不回显)',\n onChange: (event) => { setAppSecret(event.currentTarget.value); },\n autoComplete: 'new-password',\n }),\n ),\n result !== null && !result.ok\n ? createElement('p', { className: 'imqb-error' }, result.error)\n : null,\n createElement('button', { className: 'imqb-btn imqb-btn--primary', type: 'submit', disabled: busy },\n busy ? '正在保存…' : '保存'),\n );\n}\n\n/** QQ 企鹅 logo(256×256 PNG data URI;深色图案配白底圆角,明暗主题下均可见) */\nconst QQ_BOT_ICON_PNG =\n 'data:image/png;base64,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';\n\n/** QQ 机器人图标(logo 图片,白底圆角容器内呈现) */\nfunction QqBotIcon({ size = 28 }: { size?: number }): ReactNode {\n return createElement('img', {\n src: QQ_BOT_ICON_PNG, alt: 'QQ', width: size, height: size, className: 'imqb-qqicon',\n });\n}\n\n/** 已绑定视图:回显 appId + 更换凭据 / 解绑入口 */\nfunction BoundView({ appId, recheck }: { appId: string; recheck: () => void }): ReactNode {\n const [editing, setEditing] = useState(false);\n const [unbindResult, setUnbindResult] = useState<{ ok: boolean; message: string } | null>(null);\n\n const unbind = useCallback((): void => {\n if (!window.confirm('确定解绑吗?\\n解绑后机器人立即下线,插件将重新进入扫码绑定流程。')) return;\n void fetch(BIND_UNBIND_PATH, { method: 'POST' })\n .then(async (res) => {\n const body = (await res.json().catch(() => ({}))) as { ok?: boolean; message?: string; error?: string };\n if (res.ok && body.ok === true) {\n setUnbindResult({ ok: true, message: body.message ?? '已解绑,插件将重载并重新进入绑定流程' });\n // bound 态轮询已降频到 30s:立即重置节拍,让 waiting(二维码)\n // 尽快出现而不是等下一个 30s 周期\n recheck();\n return;\n }\n setUnbindResult({ ok: false, message: body.error ?? `解绑失败(HTTP ${res.status})` });\n })\n .catch((err: unknown) => {\n setUnbindResult({ ok: false, message: err instanceof Error ? err.message : String(err) });\n });\n }, [recheck]);\n\n if (unbindResult !== null) {\n // 非终态视图:解绑成功后正常由轮询收敛到 waiting;若 HMR 未\n // 触发(状态停留 bound),用户仍有「刷新状态」出口而不是死胡同\n return createElement('div', { className: 'imqb-status' },\n createElement('div', { className: 'imqb-status-row' },\n createElement('div', { className: 'imqb-status-icon' }, unbindResult.ok ? '👋' : '⚠️'),\n createElement('div', { className: 'imqb-status-meta' },\n createElement('p', { className: 'imqb-status-title' }, unbindResult.message),\n ),\n ),\n createElement('div', { className: 'imqb-status-actions' },\n unbindResult.ok\n ? createElement('button', { className: 'imqb-ghost', onClick: recheck }, '刷新状态')\n : createElement('button', { className: 'imqb-ghost', onClick: () => { setUnbindResult(null); } }, '返回'),\n ),\n );\n }\n\n if (editing) {\n return createElement('div', { className: 'imqb-status' },\n createElement('div', { className: 'imqb-status-row' },\n createElement('div', { className: 'imqb-status-meta' },\n createElement('p', { className: 'imqb-status-title' }, '更换凭据'),\n ),\n createElement('button', { className: 'imqb-ghost', onClick: () => { setEditing(false); } }, '返回'),\n ),\n createElement(ManualForm, { initialAppId: appId }),\n );\n }\n return createElement('div', { className: 'imqb-status' },\n createElement('div', { className: 'imqb-status-row' },\n createElement(QqBotIcon, { size: 28 }),\n createElement('div', { className: 'imqb-status-meta' },\n createElement('p', { className: 'imqb-status-title' }, '已绑定'),\n createElement('p', { className: 'imqb-status-sub imqb-mono' }, `AppID ${appId} · 私聊与群聊已接入`),\n ),\n ),\n createElement('div', { className: 'imqb-status-actions' },\n createElement('button', { className: 'imqb-btn imqb-btn--primary', onClick: () => { setEditing(true); } }, '更换凭据'),\n createElement('button', { className: 'imqb-btn imqb-btn--danger', onClick: unbind }, '解绑'),\n ),\n );\n}\n\n/** 未绑定视图:扫码 / 手动填写切换 */\nfunction UnboundView({ state }: { state: Extract<BindStateWire, { phase: 'waiting' }> }): ReactNode {\n const [mode, setMode] = useState<'qr' | 'manual'>('qr');\n const refresh = useCallback(() => { void fetch(BIND_REFRESH_PATH, { method: 'POST' }).catch(() => {}); }, []);\n\n if (mode === 'manual') {\n return createElement('div', { className: 'imqb-panel' },\n createElement('p', { className: 'imqb-title' }, '手动填写凭据'),\n createElement(ManualForm, {}),\n createElement('button', { className: 'imqb-ghost', onClick: () => { setMode('qr'); } }, '改用扫码绑定'),\n );\n }\n\n return createElement('div', { className: 'imqb-panel' },\n state.qrSvg === undefined\n ? null\n : createElement('img', { src: state.qrSvg, alt: 'QQ 扫码二维码', width: 220, height: 220, className: 'imqb-qr' }),\n createElement('p', { className: 'imqb-title' }, '扫码绑定 QQ 机器人'),\n createElement('p', { className: 'imqb-hint' }, '使用手机 QQ 扫描二维码完成绑定'),\n createElement('a', { href: state.url, target: '_blank', rel: 'noreferrer noopener', className: 'imqb-link' }, '二维码显示异常?在浏览器中打开'),\n createElement('div', { className: 'imqb-row' },\n createElement('button', { className: 'imqb-pill', onClick: refresh }, '刷新二维码'),\n createElement('button', { className: 'imqb-pill', onClick: () => { setMode('manual'); } }, '手动填写'),\n ),\n );\n}\n\n/** 依据宿主相位渲染面板主体(各展示位共用) */\nexport function BindPanelBody(): ReactNode {\n usePanelStyles();\n const { state, gone, recheck } = useBindState();\n // 扫码成功的连接过渡场景需要保留最后一帧二维码:waiting 相位持续记录,\n // bound 后清空(避免下次解绑重绑时旧码闪现)\n const [lastQr, setLastQr] = useState<string | null>(null);\n useEffect(() => {\n if (state === null) return;\n if (state.phase === 'waiting') {\n if (state.qrSvg !== undefined) setLastQr(state.qrSvg);\n } else if (state.phase === 'bound') {\n setLastQr(null);\n }\n }, [state]);\n\n if (gone) {\n return createElement('div', { className: 'imqb-panel' },\n createElement('div', { className: 'imqb-icon' }, '❔'),\n createElement('p', { className: 'imqb-hint' }, '插件未启用,或当前版本不支持端内配置'),\n );\n }\n\n if (state === null || state.phase === 'starting') {\n return createElement('div', { className: 'imqb-panel' },\n createElement('p', { className: 'imqb-hint' }, '正在获取绑定状态…'),\n );\n }\n\n if (state.phase === 'saving') {\n // 扫码路径:保留二维码做模糊过渡(手动填写路径无二维码,用紧凑态)\n if (lastQr !== null) {\n return createElement('div', { className: 'imqb-panel' },\n createElement('div', { className: 'imqb-scanned' },\n createElement('img', { src: lastQr, alt: 'QQ 扫码二维码', width: 220, height: 220, className: 'imqb-scanned-qr' }),\n createElement('div', { className: 'imqb-scanned-veil' },\n createElement('p', { className: 'imqb-scanned-title' }, '✅ 扫码成功'),\n createElement('p', { className: 'imqb-scanned-sub' }, '正在连接机器人,稍候…'),\n ),\n ),\n );\n }\n return createElement('div', { className: 'imqb-status' },\n createElement('div', { className: 'imqb-status-row' },\n createElement('div', { className: 'imqb-status-icon' }, '🎉'),\n createElement('div', { className: 'imqb-status-meta' },\n createElement('p', { className: 'imqb-status-title' }, '扫码成功'),\n createElement('p', { className: 'imqb-status-sub' }, '凭据已保存,插件正在重载,稍后即可开始对话'),\n ),\n ),\n );\n }\n\n if (state.phase === 'failed') {\n return createElement('div', { className: 'imqb-panel' },\n createElement('div', { className: 'imqb-icon' }, '⚠️'),\n createElement('p', { className: 'imqb-title' }, '绑定失败'),\n createElement('p', { className: 'imqb-hint' }, state.reason),\n createElement('div', { className: 'imqb-row' },\n createElement('button', { className: 'imqb-btn imqb-btn--primary', onClick: () => { window.location.reload(); } }, '重试'),\n ),\n );\n }\n\n if (state.phase === 'bound') {\n return createElement(BoundView, { appId: state.appId, recheck });\n }\n\n return createElement(UnboundView, { state });\n}\n","/**\n * QQ 机器人配置面板 — 必要配置的 UI 编辑\n *\n * UI 复刻 DSW 通用设置(settings-form 原语)的视觉风格:\n * 左对齐设置列、0.5px 行分隔、label 13px/500、控件右置;\n * Switch 为 36×20 aria-checked 结构(thumb translateX 动画);\n * 三值选择用分段控件(滑动指示器按段数/索引的 CSS 变量定位);\n * 保存按钮为 DSW 反色主按钮(label-primary 底 + bg-layer-3 字)。\n *\n * 数据流:GET /qqbot/im-qqbot/config 回显当前生效配置(appSecret\n * 已由宿主剔除)→ 表单编辑 → dirty diff → POST 仅提交变更键 →\n * 宿主白名单 + Schema 校验 → 最小写入 profile patch → HMR 重载生效。\n *\n * 字段策略:只开放用户必要的配置;cwd 只读展示;超时与性能调优\n * 类字段走 profile patch / 环境变量。\n */\nimport { createElement, useCallback, useEffect, useState, type CSSProperties, type ChangeEvent, type FormEvent, type ReactNode } from 'react';\nimport { BIND_CONFIG_PATH } from '../shared/bind-protocol.ts';\n\n/** 访问控制配置(与 src/config.ts 的 AccessControlConfig 对应的局部投影) */\ninterface AccessControlWire {\n c2cMode: 'open' | 'allowlist' | 'disabled';\n c2cAllow: string[];\n groupMode: 'open' | 'allowlist' | 'disabled';\n groupAllow: string[];\n}\n\n/** GET 回显的生效配置(appSecret 已剔除) */\ntype ConfigWire = {\n requireMention?: boolean;\n streaming?: boolean;\n showToolResults?: boolean;\n debug?: boolean;\n provider?: string;\n model?: string;\n preset?: string;\n groupPrompt?: string;\n directPrompt?: string;\n access?: AccessControlWire;\n cwd?: string;\n};\n\n/** 样式注入标记(幂等) */\nconst STYLE_ID = 'im-qqbot-config-panel-styles';\n\n/** DSW 通用设置风格(settings-form / Switch / SegmentedControl 原语复刻) */\nfunction useConfigPanelStyles(): void {\n useEffect(() => {\n if (typeof document === 'undefined') return;\n if (document.getElementById(STYLE_ID) !== null) return;\n const style = document.createElement('style');\n style.id = STYLE_ID;\n style.textContent = `\n.imqb2-form { display: flex; flex-direction: column; width: 100%; }\n.imqb2-group-title {\n padding: 14px 0 2px; font-size: 12px; font-weight: 600; line-height: 18px;\n color: var(--dsw-alias-label-tertiary); text-transform: uppercase; letter-spacing: .04em;\n}\n.imqb2-field { display: flex; flex-direction: column; gap: 6px; padding: 12px 0; }\n.imqb2-field + .imqb2-field { border-top: 0.5px solid var(--dsw-alias-border-l2); }\n.imqb2-head { display: flex; align-items: center; gap: 8px; min-height: 28px; }\n.imqb2-label {\n flex: 1; min-width: 0; font-size: 13px; font-weight: 500; line-height: 1.5;\n color: var(--dsw-alias-label-primary);\n}\n.imqb2-help { margin: 0; font-size: 12px; line-height: 1.6; color: var(--dsw-alias-label-secondary); }\n.imqb2-hint { margin: 0; font-size: 12px; line-height: 1.5; color: var(--dsw-alias-label-tertiary); }\n/* Switch(aria-checked 驱动,视觉态与无障碍态同源) */\n.imqb2-switch {\n box-sizing: border-box; position: relative; flex: 0 0 auto;\n width: 36px; height: 20px; padding: 2px; border: 0; border-radius: 999px;\n background: var(--dsw-alias-border-l3); cursor: pointer; font: inherit;\n}\n.imqb2-switch[aria-checked='true'] { background: var(--dsw-alias-brand-primary); }\n.imqb2-switch:disabled { cursor: default; opacity: 0.5; }\n.imqb2-switch:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}\n.imqb2-switch-thumb {\n display: block; width: 16px; height: 16px; border-radius: 50%;\n background: var(--dsw-alias-switch-thumb, #ffffff);\n transition: transform 120ms ease;\n}\n.imqb2-switch[aria-checked='true'] .imqb2-switch-thumb {\n background: var(--dsw-alias-label-primary-foreground, #ffffff);\n transform: translateX(16px);\n}\n/* 输入(官方 fields.input 复刻) */\n.imqb2-input {\n box-sizing: border-box; width: 100%; height: 34px; padding: 0 12px;\n border: 0.5px solid var(--dsw-alias-border-l4); border-radius: var(--dsw-radius-md, 8px);\n background: var(--dsw-alias-bg-layer-3); font: inherit; font-size: 13px; line-height: 1.5;\n color: var(--dsw-alias-label-primary); outline: none;\n}\n.imqb2-input:focus { outline: none; border-color: var(--dsw-alias-state-business-primary); }\n.imqb2-input:disabled { color: var(--dsw-alias-label-tertiary); cursor: default; }\n.imqb2-textarea { height: auto; min-height: 68px; padding: 8px 12px; resize: vertical; line-height: 1.5; }\n/* 分段控件(官方 SegmentedControl 复刻:指示器按段数/索引定位) */\n.imqb2-seg {\n position: relative; display: inline-grid; grid-auto-flow: column; grid-auto-columns: 1fr;\n gap: 2px; padding: 4px; border-radius: var(--dsw-radius-md, 8px);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n.imqb2-seg-indicator {\n position: absolute; top: 4px; left: 4px;\n width: calc((100% - 8px - 2px * (var(--imqb2-seg-count) - 1)) / var(--imqb2-seg-count));\n height: calc(100% - 8px);\n border: 0; border-radius: var(--dsw-radius-sm, 6px);\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: var(--dsw-elevation-soft, 0 1px 3px rgba(0,0,0,.08));\n transform: translateX(calc(var(--imqb2-seg-index) * (100% + 2px)));\n transition: transform 160ms ease;\n pointer-events: none;\n}\n.imqb2-seg-tab {\n box-sizing: border-box; position: relative; z-index: 1; height: 28px; padding: 0 16px;\n border: 0; border-radius: var(--dsw-radius-sm, 6px); background: transparent;\n color: var(--dsw-alias-label-secondary); font: inherit; font-size: 13px; line-height: 20px;\n font-weight: 500; white-space: nowrap; cursor: pointer; transition: color 120ms ease;\n}\n.imqb2-seg-tab:hover, .imqb2-seg-tab[aria-selected='true'] { color: var(--dsw-alias-label-primary); }\n.imqb2-seg-tab:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n/* 底栏(官方 SettingsForm.footer 复刻) */\n.imqb2-footer { display: flex; align-items: center; gap: 8px; padding-top: 16px; }\n.imqb2-note { flex: 1; min-width: 0; margin: 0; font-size: 12px; line-height: 1.5; color: var(--dsw-alias-label-tertiary); }\n.imqb2-note--error { color: var(--dsw-alias-state-error-primary, var(--dsw-alias-label-error)); }\n.imqb2-note--ok { color: var(--dsw-alias-label-secondary); }\n.imqb2-save {\n appearance: none; flex: none; border: 1px solid transparent;\n border-radius: var(--dsw-radius-md, 8px); padding: 5px 14px;\n font: inherit; font-size: 13px; line-height: 1.5; cursor: pointer;\n background: var(--dsw-alias-label-primary); color: var(--dsw-alias-bg-layer-3);\n}\n.imqb2-save:disabled { opacity: 0.4; cursor: default; }\n.imqb2-save:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 1px;\n}\n/* cwd 只读行 */\n.imqb2-readonly { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; color: var(--dsw-alias-label-secondary); word-break: break-all; margin: 0; }\n `;\n document.head.appendChild(style);\n return () => { style.remove(); };\n }, []);\n}\n\n/** 开关(官方 Switch 原语结构:aria-checked 驱动视觉态) */\nfunction Switch({ checked, label, onChange }: {\n checked: boolean; label: string; onChange: (next: boolean) => void;\n}): ReactNode {\n return createElement('button', {\n type: 'button', role: 'switch', 'aria-checked': checked, 'aria-label': label,\n className: 'imqb2-switch',\n onClick: () => { onChange(!checked); },\n }, createElement('span', { className: 'imqb2-switch-thumb' }));\n}\n\n/** 访问模式分段选择(官方 SegmentedControl 结构:CSS 变量定位滑动指示器) */\nfunction Segmented({ value, options, onChange, label }: {\n value: AccessMode; options: ReadonlyArray<{ value: AccessMode; label: string }>;\n onChange: (next: AccessMode) => void; label: string;\n}): ReactNode {\n const index = Math.max(0, options.findIndex((o) => o.value === value));\n const trackStyle = {\n '--imqb2-seg-count': options.length,\n '--imqb2-seg-index': index,\n } as CSSProperties;\n return createElement('div', { className: 'imqb2-seg', role: 'tablist', 'aria-label': label, style: trackStyle },\n createElement('span', { className: 'imqb2-seg-indicator' }),\n options.map((o) => createElement('button', {\n key: o.value, type: 'button', role: 'tab', 'aria-selected': o.value === value,\n className: 'imqb2-seg-tab', onClick: () => { onChange(o.value); },\n }, o.label)),\n );\n}\n\n/** 开关行(label 左 + Switch 右 + 可选 help) */\nfunction SwitchRow({ label, help, checked, onChange }: {\n label: string; help?: string; checked: boolean; onChange: (next: boolean) => void;\n}): ReactNode {\n return createElement('div', { className: 'imqb2-field' },\n createElement('div', { className: 'imqb2-head' },\n createElement('span', { className: 'imqb2-label' }, label),\n createElement(Switch, { checked, label, onChange }),\n ),\n help === undefined ? null : createElement('p', { className: 'imqb2-help' }, help),\n );\n}\n\n/** 文本行(label 上 + 输入下,与官方 fields 布局一致) */\nfunction FieldRow({ label, help, value, placeholder, onChange }: {\n label: string; help?: string; value: string; placeholder?: string; onChange: (next: string) => void;\n}): ReactNode {\n return createElement('div', { className: 'imqb2-field' },\n createElement('span', { className: 'imqb2-label' }, label),\n createElement('input', {\n className: 'imqb2-input', value, placeholder, spellCheck: false,\n onChange: (event: ChangeEvent<HTMLInputElement>) => { onChange(event.currentTarget.value); },\n }),\n help === undefined ? null : createElement('p', { className: 'imqb2-hint' }, help),\n );\n}\n\n/** 多行文本行 */\nfunction AreaRow({ label, help, value, rows, onChange }: {\n label: string; help?: string; value: string; rows?: number; onChange: (next: string) => void;\n}): ReactNode {\n return createElement('div', { className: 'imqb2-field' },\n createElement('span', { className: 'imqb2-label' }, label),\n createElement('textarea', {\n className: 'imqb2-input imqb2-textarea', value, rows: rows ?? 3,\n onChange: (event: ChangeEvent<HTMLTextAreaElement>) => { onChange(event.currentTarget.value); },\n }),\n help === undefined ? null : createElement('p', { className: 'imqb2-hint' }, help),\n );\n}\n\n/** 访问模式分段选择行 */\nfunction SegmentedRow({ label, help, value, options, onChange }: {\n label: string; help?: string; value: AccessMode;\n options: ReadonlyArray<{ value: AccessMode; label: string }>; onChange: (next: AccessMode) => void;\n}): ReactNode {\n return createElement('div', { className: 'imqb2-field' },\n createElement('div', { className: 'imqb2-head' },\n createElement('span', { className: 'imqb2-label' }, label),\n createElement(Segmented, { value, options, onChange, label }),\n ),\n help === undefined ? null : createElement('p', { className: 'imqb2-hint' }, help),\n );\n}\n\ntype AccessMode = AccessControlWire['c2cMode'];\n\nconst MODE_OPTIONS: ReadonlyArray<{ value: AccessMode; label: string }> = [\n { value: 'open', label: '开放' },\n { value: 'allowlist', label: '白名单' },\n { value: 'disabled', label: '停用' },\n];\n\n/** 深比较(表单值与初始回显值的 dirty 判断) */\nfunction shallowEqual(a: unknown, b: unknown): boolean {\n return JSON.stringify(a) === JSON.stringify(b);\n}\n\n/**\n * 配置面板主体。\n *\n * 保存仅提交变更键(服务端按白名单合并),保存成功后提示\n * HMR 重载语义(进行中的机器人会话将重置)。\n */\nexport function ConfigPanel(): ReactNode {\n useConfigPanelStyles();\n const [initial, setInitial] = useState<ConfigWire | null>(null);\n const [form, setForm] = useState<ConfigWire | null>(null);\n const [busy, setBusy] = useState(false);\n const [result, setResult] = useState<{ ok: boolean; message: string } | null>(null);\n const [loadError, setLoadError] = useState<string | null>(null);\n\n useEffect(() => {\n let stopped = false;\n void fetch(BIND_CONFIG_PATH, { cache: 'no-store' })\n .then(async (res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const body = (await res.json()) as { config: ConfigWire };\n if (stopped) return;\n setInitial(body.config);\n setForm(body.config);\n })\n .catch((err: unknown) => {\n if (!stopped) setLoadError(err instanceof Error ? err.message : String(err));\n });\n return () => { stopped = true; };\n }, []);\n\n const patch = useCallback(<K extends keyof ConfigWire>(key: K, value: ConfigWire[K]): void => {\n setForm((current) => current === null ? current : { ...current, [key]: value });\n setResult(null);\n }, []);\n\n const submit = useCallback((event: FormEvent): void => {\n event.preventDefault();\n if (busy || initial === null || form === null) return;\n const changed: Record<string, unknown> = {};\n for (const key of Object.keys(form) as Array<keyof ConfigWire>) {\n if (!shallowEqual(form[key], initial[key])) {\n changed[key] = form[key];\n }\n }\n if (Object.keys(changed).length === 0) return;\n\n setBusy(true);\n void fetch(BIND_CONFIG_PATH, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(changed),\n })\n .then(async (res) => {\n const body = (await res.json().catch(() => ({}))) as { ok?: boolean; message?: string; error?: string };\n if (res.ok && body.ok === true) {\n setResult({ ok: true, message: body.message ?? '配置已保存,插件将自动重载' });\n setInitial(form);\n return;\n }\n setResult({ ok: false, message: body.error ?? `保存失败(HTTP ${res.status})` });\n })\n .catch((err: unknown) => {\n setResult({ ok: false, message: err instanceof Error ? err.message : String(err) });\n })\n .finally(() => { setBusy(false); });\n }, [busy, form, initial]);\n\n if (loadError !== null) {\n return createElement('p', { className: 'imqb2-hint', style: { padding: '12px 0' } },\n `配置加载失败:${loadError}`);\n }\n if (initial === null || form === null) {\n return createElement('p', { className: 'imqb2-hint', style: { padding: '12px 0' } }, '正在加载配置…');\n }\n\n const dirty = (Object.keys(form) as Array<keyof ConfigWire>).some((key) => !shallowEqual(form[key], initial[key]));\n const access: AccessControlWire = form.access ?? { c2cMode: 'open', c2cAllow: [], groupMode: 'open', groupAllow: [] };\n\n return createElement('form', { className: 'imqb2-form', onSubmit: submit },\n createElement('div', { className: 'imqb2-group-title' }, '访问控制'),\n createElement(SegmentedRow, {\n label: '私聊', value: access.c2cMode, options: MODE_OPTIONS,\n onChange: (v) => { patch('access', { ...access, c2cMode: v }); },\n }),\n access.c2cMode === 'allowlist'\n ? createElement(AreaRow, {\n label: '私聊白名单', help: '每行一个 openid', rows: 3,\n value: access.c2cAllow.join('\\n'),\n onChange: (v) => { patch('access', { ...access, c2cAllow: v.split('\\n').map((s) => s.trim()).filter(Boolean) }); },\n })\n : null,\n createElement(SegmentedRow, {\n label: '群聊', value: access.groupMode, options: MODE_OPTIONS,\n onChange: (v) => { patch('access', { ...access, groupMode: v }); },\n }),\n access.groupMode === 'allowlist'\n ? createElement(AreaRow, {\n label: '群聊白名单', help: '每行一个群 openid', rows: 3,\n value: access.groupAllow.join('\\n'),\n onChange: (v) => { patch('access', { ...access, groupAllow: v.split('\\n').map((s) => s.trim()).filter(Boolean) }); },\n })\n : null,\n\n createElement('div', { className: 'imqb2-group-title' }, '基本'),\n createElement(SwitchRow, {\n label: '群聊需要 @机器人', checked: form.requireMention ?? true,\n help: '开启后群聊中只有 @机器人 的消息会触发回复',\n onChange: (v) => { patch('requireMention', v); },\n }),\n createElement(SwitchRow, {\n label: '流式输出', checked: form.streaming ?? true,\n help: '回复内容分段实时推送到聊天',\n onChange: (v) => { patch('streaming', v); },\n }),\n createElement(SwitchRow, {\n label: '显示工具调用结果', checked: form.showToolResults ?? false,\n help: '在聊天中展示 agent 工具调用的结构化结果',\n onChange: (v) => { patch('showToolResults', v); },\n }),\n\n createElement('div', { className: 'imqb2-group-title' }, '模型'),\n createElement(FieldRow, {\n label: 'Provider', value: form.provider ?? '', placeholder: '留空继承宿主默认',\n onChange: (v) => { patch('provider', v); },\n }),\n createElement(FieldRow, {\n label: 'Model', value: form.model ?? '', placeholder: '留空继承宿主默认',\n onChange: (v) => { patch('model', v); },\n }),\n createElement(FieldRow, {\n label: 'Preset', value: form.preset ?? '', placeholder: 'Agent preset id',\n onChange: (v) => { patch('preset', v); },\n }),\n\n createElement('div', { className: 'imqb2-group-title' }, '补充指令'),\n createElement(AreaRow, {\n label: '群聊额外 system prompt', value: form.groupPrompt ?? '',\n onChange: (v) => { patch('groupPrompt', v); },\n }),\n createElement(AreaRow, {\n label: '私聊额外 system prompt', value: form.directPrompt ?? '',\n onChange: (v) => { patch('directPrompt', v); },\n }),\n\n form.cwd !== undefined\n ? createElement('div', { className: 'imqb2-field' },\n createElement('div', { className: 'imqb2-head' },\n createElement('span', { className: 'imqb2-label' }, 'Agent 工作目录'),\n createElement('span', { className: 'imqb2-hint' }, '只读'),\n ),\n createElement('p', { className: 'imqb2-readonly' }, form.cwd),\n )\n : null,\n\n createElement('div', { className: 'imqb2-footer' },\n result !== null\n ? createElement('p', { className: `imqb2-note${result.ok ? ' imqb2-note--ok' : ' imqb2-note--error'}` },\n (result.ok ? '' : '⚠️ ') + result.message)\n : dirty\n ? createElement('p', { className: 'imqb2-note' }, '保存后插件将重载,进行中的机器人会话将重置')\n : createElement('p', { className: 'imqb2-note' }),\n createElement('button', { className: 'imqb2-save', type: 'submit', disabled: busy || !dirty },\n busy ? '正在保存…' : '保存'),\n ),\n );\n}\n","/**\n * im-qqbot 浏览器半边 —— QQ Bot 端内扫码绑定入口\n *\n * 宿主插件在凭据缺失时注册 /qqbot/im-qqbot/bind 状态路由;本插件在\n * Web / Desktop 提供两个展示位:\n *\n * 1. 设置页「QQ Bot」栏目(settings.section 席位)——注册即展示,\n * 无 Session surface 时序依赖,待绑定/已绑定状态常驻可见;\n * 2. 右侧栏「QQ Bot 绑定」页(sidebarRightTabs)——Start 页入口 +\n * 待绑定时自动打开(失败随轮询重试)。\n *\n * 运行时依赖仅 react(客户端平台种子表提供);宿主服务经 cordis inject\n * 声明访问(声明缺失时插件保持 inactive,不阻塞浏览器启动)。\n */\nimport type { Context } from '@deepseek-ai/cordis';\nimport { createElement, type ReactNode } from 'react';\nimport { BIND_STATE_PATH } from '../shared/bind-protocol.ts';\nimport { BindPanelBody } from './bind-page.ts';\nimport { ConfigPanel } from './config-panel.ts';\n\nexport const name = 'im-qqbot-client';\nexport const inject = ['slots', 'sidebarRight', 'sidebarRightTabs'];\n\n/** 侧栏 Tab 类型(ui-sidebar-right 契约的局部投影) */\nconst TAB_KIND = 'qqbot-bind';\n/** 席位注册 key(Tab 类型 id,席位按其分发;只需全局唯一,与包名解耦) */\nconst TAB_ID = 'im-qqbot/bind';\n\n/** ui-sidebar-right 的 Tab 注册表服务(局部投影) */\ninterface TabRegistryLike {\n register(definition: {\n id: string;\n kind: string;\n title: (address: string) => string;\n guide?: ReadonlyArray<{\n id: string;\n order: number;\n title: () => string;\n description: () => string;\n icon: unknown;\n }>;\n }): () => void;\n}\n\n/** ui-sidebar-right 的导航控制器服务(局部投影) */\ninterface SidebarRightLike {\n openTab(kind: string, options?: Record<string, unknown>): unknown;\n}\n\n/** ui-slots 的席位系统服务(局部投影) */\ninterface SlotsLike {\n inject(slotName: string, register: () => (() => void)): () => void;\n register(spec: Record<string, unknown>, component: unknown): () => void;\n}\n\n/** 绑定入口图标(QQ 机器人,跟随主题图标色变量) */\nfunction BindGuideIcon(): ReactNode {\n return createElement('svg', {\n width: 24, height: 24, viewBox: '0 0 24 24', fill: 'none', 'aria-hidden': true,\n },\n createElement('path', {\n d: 'M9.50039 11.1504C9.96983 11.1504 10.3504 11.5309 10.3504 12.0004V14.0004C10.3504 14.4698 9.96983 14.8504 9.50039 14.8504C9.03095 14.8504 8.65039 14.4698 8.65039 14.0004V12.0004C8.65039 11.5309 9.03095 11.1504 9.50039 11.1504Z',\n fill: 'var(------icon_primary, #1A1A1A)',\n }),\n createElement('path', {\n d: 'M14.5004 11.1504C14.9698 11.1504 15.3504 11.5309 15.3504 12.0004V14.0004C15.3504 14.4698 14.9698 14.8504 14.5004 14.8504C14.0309 14.8504 13.6504 14.4698 13.6504 14.0004V12.0004C13.6504 11.5309 14.0309 11.1504 14.5004 11.1504Z',\n fill: 'var(------icon_primary, #1A1A1A)',\n }),\n createElement('path', {\n fillRule: 'evenodd',\n clipRule: 'evenodd',\n d: 'M12.8504 5.3109C13.5299 4.99138 14.0004 4.30063 14.0004 3.5C14.0004 2.39543 13.1049 1.5 12.0004 1.5C10.8958 1.5 10.0004 2.39543 10.0004 3.5C10.0004 4.30065 10.4708 4.99141 11.1504 5.31092V6.18851C6.38487 6.61795 2.65039 10.6231 2.65039 15.5004V17.0004C2.65039 19.679 4.82181 21.8504 7.50039 21.8504H16.5004C19.179 21.8504 21.3504 19.679 21.3504 17.0004V15.5004C21.3504 10.6231 17.6159 6.61795 12.8504 6.18851V5.3109ZM12.0004 7.85039C7.77541 7.85039 4.35039 11.2754 4.35039 15.5004V17.0004C4.35039 18.7401 5.76069 20.1504 7.50039 20.1504H16.5004C18.2401 20.1504 19.6504 18.7401 19.6504 17.0004V15.5004C19.6504 11.2754 16.2254 7.85039 12.0004 7.85039Z',\n fill: 'var(------icon_primary, #1A1A1A)',\n }),\n );\n}\n\n/** 设置页「QQ Bot」栏目:面板常驻展示绑定状态 */\nfunction QQBotSettingsSection(): ReactNode {\n return createElement('div', null,\n createElement(BindPanelBody),\n createElement(ConfigPanel),\n );\n}\n\nexport function apply(ctx: Context): void {\n const tabs = (ctx as unknown as { sidebarRightTabs?: TabRegistryLike }).sidebarRightTabs;\n const right = (ctx as unknown as { sidebarRight?: SidebarRightLike }).sidebarRight;\n const slots = (ctx as unknown as { slots?: SlotsLike }).slots;\n\n const disposers: Array<() => void> = [];\n\n // 1. 设置页「QQ Bot」栏目(主展示位:注册即展示,无时序依赖)\n if (slots !== undefined) {\n disposers.push( slots.inject('settings.section', () => slots.register(\n { name: 'settings.section', id: 'qqbot', order: 7, label: 'QQ 机器人' },\n QQBotSettingsSection,\n )));\n }\n\n // 2. 侧栏绑定页(快捷展示位:Start 页入口 + 待绑定自动打开)\n if (tabs !== undefined && slots !== undefined) {\n disposers.push(tabs.register({\n id: TAB_ID,\n kind: TAB_KIND,\n title: () => 'QQ 机器人绑定',\n guide: [{\n id: 'bind',\n order: 90,\n title: () => 'QQ 机器人绑定',\n description: () => '扫码或手动填写,绑定 QQ 机器人',\n icon: BindGuideIcon,\n }],\n }));\n disposers.push(slots.inject('sidebar.right.pane.tab', () => slots.register(\n { name: 'sidebar.right.pane.tab', key: TAB_ID },\n BindPanelBody,\n )));\n // 待绑定检测与自动引导\n disposers.push(watchAndPrompt(right));\n }\n\n (ctx as unknown as { effect(fn: () => () => void, name?: string): void }).effect(() => () => {\n for (const dispose of disposers.reverse()) dispose();\n }, 'im-qqbot-client.binding');\n}\n\n/**\n * 轮询绑定状态:待绑定时自动打开绑定页。\n *\n * - 页面隐藏时降频轮询(可见时立即恢复节拍)\n * - 404(已绑定/未安装)时退避到 30s,保持低成本常驻探测\n * - 每次页面加载至多打开一次(用户手动关闭后不打扰);\n * 打开失败(如启动早期 Session surface 尚未挂载)不消费机会,\n * 由下一轮轮询(3s)自动重试\n */\nfunction watchAndPrompt(right: SidebarRightLike | undefined): () => void {\n let stopped = false;\n let opened = right === undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const schedule = (ms: number): void => {\n timer = setTimeout(() => { void tick(); }, ms);\n };\n\n const tick = async (): Promise<void> => {\n if (stopped) return;\n if (typeof document !== 'undefined' && document.visibilityState === 'hidden') {\n schedule(5000);\n return;\n }\n try {\n const res = await fetch(BIND_STATE_PATH, { cache: 'no-store' });\n if (res.ok) {\n const body = (await res.json()) as { phase?: string };\n if (body.phase === 'waiting' && !opened && right !== undefined) {\n try {\n right.openTab(TAB_KIND);\n opened = true;\n } catch (err) {\n // 启动早期 Session surface 可能尚未挂载:保留机会,3s 后随轮询重试\n console.error('[im-qqbot] 打开绑定页失败,稍后重试', err);\n }\n }\n schedule(3000);\n return;\n }\n // 404:已绑定或插件未启用\n schedule(30000);\n return;\n } catch {\n // 宿主暂不可达(启动窗口期):退避重试\n }\n schedule(10000);\n };\n\n void tick();\n return () => { stopped = true; if (timer !== undefined) clearTimeout(timer); };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cxyhhhhh/dsh-qqbot",
3
- "version": "0.5.1-dev.202610121135",
3
+ "version": "0.5.1-dev.202610121209",
4
4
  "description": "QQ Bot IM channel plugin for deepseek-harness (dsh)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -61,7 +61,7 @@
61
61
  },
62
62
  "dependencies": {
63
63
  "@tencent-connect/qqbot-connector": "1.2.0",
64
- "@tencent-connect/qqbot-nodejs": "^1.0.5",
64
+ "@tencent-connect/qqbot-nodejs": "^1.0.4",
65
65
  "js-yaml": "^4.1.0",
66
66
  "qrcode": "^1.5.4"
67
67
  },