@keyou007/agent-bot 0.1.3 → 0.1.4

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.
Files changed (56) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +3 -1
  3. package/README.zh.md +3 -1
  4. package/dist/cli/FeishuAppConfiguration.js +10 -10
  5. package/dist/cli/FeishuAppConfiguration.js.map +1 -1
  6. package/dist/cli/FeishuAppRegistration.js +9 -9
  7. package/dist/cli/FeishuAppRegistration.js.map +1 -1
  8. package/dist/cli/Initializer.js +4 -4
  9. package/dist/cli/Initializer.js.map +1 -1
  10. package/dist/cli/LocalControlClient.js +2 -2
  11. package/dist/cli/LocalControlClient.js.map +1 -1
  12. package/dist/cli/LocalControlServer.js +1 -1
  13. package/dist/cli/LocalControlServer.js.map +1 -1
  14. package/dist/cli/ServerStarter.js +3 -3
  15. package/dist/cli/ServerStarter.js.map +1 -1
  16. package/dist/cli/SkillRegistry.js +4 -4
  17. package/dist/cli/SkillRegistry.js.map +1 -1
  18. package/dist/cli/help.js +2 -57
  19. package/dist/cli/help.js.map +1 -1
  20. package/dist/cli/packageVersion.js +1 -1
  21. package/dist/cli/packageVersion.js.map +1 -1
  22. package/dist/cli/profile.js +3 -3
  23. package/dist/cli/profile.js.map +1 -1
  24. package/dist/cli/serverStatus.js +37 -0
  25. package/dist/cli/serverStatus.js.map +1 -0
  26. package/dist/cli/taskChatRoute.js +2 -2
  27. package/dist/cli/taskChatRoute.js.map +1 -1
  28. package/dist/cli.js +112 -116
  29. package/dist/cli.js.map +1 -1
  30. package/dist/feishu/transport.js +1 -1
  31. package/dist/feishu/transport.js.map +1 -1
  32. package/dist/index.js +5 -4
  33. package/dist/index.js.map +1 -1
  34. package/dist/proxy/ProxySessionController.js +10 -10
  35. package/dist/proxy/ProxySessionController.js.map +1 -1
  36. package/docs/technical-reference.md +2 -0
  37. package/docs/technical-reference.zh.md +2 -0
  38. package/npm-shrinkwrap.json +2 -2
  39. package/package.json +1 -1
  40. package/skills/agent-bot/SKILL.md +1 -1
  41. package/src/cli/FeishuAppConfiguration.ts +10 -10
  42. package/src/cli/FeishuAppRegistration.ts +9 -9
  43. package/src/cli/Initializer.ts +4 -4
  44. package/src/cli/LocalControlClient.ts +2 -2
  45. package/src/cli/LocalControlServer.ts +1 -1
  46. package/src/cli/ServerStarter.ts +3 -3
  47. package/src/cli/SkillRegistry.ts +4 -4
  48. package/src/cli/help.ts +2 -66
  49. package/src/cli/packageVersion.ts +1 -1
  50. package/src/cli/profile.ts +3 -3
  51. package/src/cli/serverStatus.ts +39 -0
  52. package/src/cli/taskChatRoute.ts +2 -2
  53. package/src/cli.ts +113 -119
  54. package/src/feishu/transport.ts +1 -1
  55. package/src/index.ts +5 -4
  56. package/src/proxy/ProxySessionController.ts +10 -10
@@ -3,7 +3,7 @@ import { fileURLToPath } from "node:url";
3
3
  export function readPackageVersion(packageJsonUrl = new URL("../../package.json", import.meta.url)) {
4
4
  const metadata = JSON.parse(fs.readFileSync(fileURLToPath(packageJsonUrl), "utf8"));
5
5
  if (typeof metadata.version !== "string" || !metadata.version.trim()) {
6
- throw new Error("package.json 中缺少有效的 version。");
6
+ throw new Error("package.json does not contain a valid version.");
7
7
  }
8
8
  return metadata.version;
9
9
  }
@@ -1 +1 @@
1
- {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../../src/cli/packageVersion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,kBAAkB,CAChC,cAAc,GAAG,IAAI,GAAG,CAAC,oBAAoB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC;IAE/D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,CAC9B,CAAC;IAC3B,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,QAAQ,CAAC,OAAO,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../../src/cli/packageVersion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,kBAAkB,CAChC,cAAc,GAAG,IAAI,GAAG,CAAC,oBAAoB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC;IAE/D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,CAC9B,CAAC;IAC3B,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,QAAQ,CAAC,OAAO,CAAC;AAC1B,CAAC"}
@@ -5,7 +5,7 @@ export function parseGlobalOptions(input) {
5
5
  const configPath = removeOption(args, "--config");
6
6
  const profilePath = removeOption(args, "--profile");
7
7
  if (configPath && profilePath) {
8
- throw new Error("--profile 和 --config 不能同时使用。Profile 固定使用其目录下的 config.yaml。");
8
+ throw new Error("--profile and --config cannot be used together. A profile always uses config.yaml in its directory.");
9
9
  }
10
10
  return {
11
11
  args,
@@ -27,13 +27,13 @@ export function applyExplicitProfile(profilePath, env = process.env, baseDirecto
27
27
  function removeOption(args, option) {
28
28
  const indexes = args.flatMap((value, index) => value === option ? [index] : []);
29
29
  if (indexes.length > 1)
30
- throw new Error(`${option} 只能指定一次。`);
30
+ throw new Error(`${option} can only be specified once.`);
31
31
  const index = indexes[0];
32
32
  if (index === undefined)
33
33
  return undefined;
34
34
  const value = args[index + 1];
35
35
  if (!value || value.startsWith("--"))
36
- throw new Error(`${option} 需要目录或文件路径。`);
36
+ throw new Error(`${option} requires a directory or file path.`);
37
37
  args.splice(index, 2);
38
38
  return value;
39
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/cli/profile.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,8BAA8B,EAC9B,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAa5B,MAAM,UAAU,kBAAkB,CAAC,KAAe;IAChD,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACxB,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACpD,IAAI,UAAU,IAAI,WAAW,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,OAAO;QACL,IAAI;QACJ,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,WAAmB,EACnB,GAAG,GAAsB,OAAO,CAAC,GAAG,EACpC,aAAa,GAAG,OAAO,CAAC,GAAG,EAAE;IAE7B,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IAC5D,GAAG,CAAC,kBAAkB,CAAC,GAAG,QAAQ,CAAC;IACnC,GAAG,CAAC,gBAAgB,GAAG,UAAU,CAAC;IAClC,GAAG,CAAC,8BAA8B,CAAC,GAAG,GAAG,CAAC;IAC1C,OAAO,GAAG,CAAC,aAAa,CAAC;IACzB,OAAO,GAAG,CAAC,iBAAiB,CAAC;IAC7B,OAAO,GAAG,CAAC,mBAAmB,CAAC;IAC/B,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,YAAY,CAAC,IAAc,EAAE,MAAc;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAChF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,UAAU,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,aAAa,CAAC,CAAC;IAC9E,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACtB,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/cli/profile.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,8BAA8B,EAC9B,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAa5B,MAAM,UAAU,kBAAkB,CAAC,KAAe;IAChD,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACxB,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACpD,IAAI,UAAU,IAAI,WAAW,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,qGAAqG,CAAC,CAAC;IACzH,CAAC;IACD,OAAO;QACL,IAAI;QACJ,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,WAAmB,EACnB,GAAG,GAAsB,OAAO,CAAC,GAAG,EACpC,aAAa,GAAG,OAAO,CAAC,GAAG,EAAE;IAE7B,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IAC5D,GAAG,CAAC,kBAAkB,CAAC,GAAG,QAAQ,CAAC;IACnC,GAAG,CAAC,gBAAgB,GAAG,UAAU,CAAC;IAClC,GAAG,CAAC,8BAA8B,CAAC,GAAG,GAAG,CAAC;IAC1C,OAAO,GAAG,CAAC,aAAa,CAAC;IACzB,OAAO,GAAG,CAAC,iBAAiB,CAAC;IAC7B,OAAO,GAAG,CAAC,mBAAmB,CAAC;IAC/B,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,YAAY,CAAC,IAAc,EAAE,MAAc;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAChF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,8BAA8B,CAAC,CAAC;IACjF,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,qCAAqC,CAAC,CAAC;IACtG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACtB,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,37 @@
1
+ export function withConfiguredFeishuAppId(data, configuredFeishuAppId) {
2
+ const value = data && typeof data === "object"
3
+ ? data
4
+ : {};
5
+ if (Object.hasOwn(value, "feishuAppId"))
6
+ return value;
7
+ return {
8
+ ...value,
9
+ feishuAppId: configuredFeishuAppId ?? null,
10
+ };
11
+ }
12
+ export function formatServerStatus(data) {
13
+ const value = data && typeof data === "object" ? data : {};
14
+ const activity = value.activity && typeof value.activity === "object"
15
+ ? value.activity
16
+ : {};
17
+ const state = value.running === false
18
+ ? "not running"
19
+ : value.ready === false
20
+ ? "starting (connecting to Lark)"
21
+ : "running";
22
+ const safeRestart = value.safeRestartScheduled
23
+ ? `pending (${String(value.safeRestartReason ?? "no reason provided")})`
24
+ : "not scheduled";
25
+ return [
26
+ `Agent Bot server: ${state}`,
27
+ `Lark App ID: ${value.feishuAppId ?? "not configured"}`,
28
+ `PID: ${value.pid ?? "-"}`,
29
+ `Started at: ${value.startedAt ?? "-"}`,
30
+ `Supervisor: ${value.supervised ? "enabled" : "disabled"}`,
31
+ `Running tasks: ${activity.runningSessions ?? 0}`,
32
+ `Pending final deliveries: ${activity.pendingFinalDeliveries ?? 0}`,
33
+ `Safe restart: ${safeRestart}`,
34
+ "",
35
+ ].join("\n");
36
+ }
37
+ //# sourceMappingURL=serverStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serverStatus.js","sourceRoot":"","sources":["../../src/cli/serverStatus.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,yBAAyB,CACvC,IAAa,EACb,qBAA8B;IAE9B,MAAM,KAAK,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAC5C,CAAC,CAAC,IAA+B;QACjC,CAAC,CAAC,EAAE,CAAC;IACP,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC;QAAE,OAAO,KAAK,CAAC;IACtD,OAAO;QACL,GAAG,KAAK;QACR,WAAW,EAAE,qBAAqB,IAAI,IAAI;KAC3C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAa;IAC9C,MAAM,KAAK,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAA+B,CAAC,CAAC,CAAC,EAAE,CAAC;IACtF,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;QACnE,CAAC,CAAC,KAAK,CAAC,QAAmC;QAC3C,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,KAAK,KAAK;QACnC,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK;YACrB,CAAC,CAAC,+BAA+B;YACjC,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,WAAW,GAAG,KAAK,CAAC,oBAAoB;QAC5C,CAAC,CAAC,YAAY,MAAM,CAAC,KAAK,CAAC,iBAAiB,IAAI,oBAAoB,CAAC,GAAG;QACxE,CAAC,CAAC,eAAe,CAAC;IACpB,OAAO;QACL,qBAAqB,KAAK,EAAE;QAC5B,gBAAgB,KAAK,CAAC,WAAW,IAAI,gBAAgB,EAAE;QACvD,QAAQ,KAAK,CAAC,GAAG,IAAI,GAAG,EAAE;QAC1B,eAAe,KAAK,CAAC,SAAS,IAAI,GAAG,EAAE;QACvC,eAAe,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE;QAC1D,kBAAkB,QAAQ,CAAC,eAAe,IAAI,CAAC,EAAE;QACjD,6BAA6B,QAAQ,CAAC,sBAAsB,IAAI,CAAC,EAAE;QACnE,iBAAiB,WAAW,EAAE;QAC9B,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -5,11 +5,11 @@ export function taskChatRoute(session) {
5
5
  const contextKey = session.contextKey;
6
6
  const baseContextKey = baseChatContextKey(contextKey);
7
7
  if (!baseContextKey.startsWith(CHAT_CONTEXT_PREFIX)) {
8
- throw new Error(`任务没有绑定飞书会话:${session.remoteSessionId ?? session.acpSessionId ?? session.localSessionId}`);
8
+ throw new Error(`The task is not bound to a Lark chat: ${session.remoteSessionId ?? session.acpSessionId ?? session.localSessionId}`);
9
9
  }
10
10
  const chatId = baseContextKey.slice(CHAT_CONTEXT_PREFIX.length);
11
11
  if (!chatId)
12
- throw new Error(`任务的飞书会话 ID 无效:${contextKey}`);
12
+ throw new Error(`The task has an invalid Lark chat ID: ${contextKey}`);
13
13
  const threadId = isThreadContextKey(contextKey)
14
14
  ? contextKey.slice(contextKey.indexOf(THREAD_CONTEXT_MARKER) + THREAD_CONTEXT_MARKER.length)
15
15
  : undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"taskChatRoute.js","sourceRoot":"","sources":["../../src/cli/taskChatRoute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAGjF,MAAM,mBAAmB,GAAG,UAAU,CAAC;AACvC,MAAM,qBAAqB,GAAG,aAAa,CAAC;AAS5C,MAAM,UAAU,aAAa,CAAC,OAAsB;IAClD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACtC,MAAM,cAAc,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACtD,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,cAAc,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC7G,CAAC;IACD,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAChE,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,UAAU,EAAE,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,kBAAkB,CAAC,UAAU,CAAC;QAC7C,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,qBAAqB,CAAC,GAAG,qBAAqB,CAAC,MAAM,CAAC;QAC5F,CAAC,CAAC,SAAS,CAAC;IACd,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,cAAc;QACjF,MAAM;QACN,UAAU;QACV,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"taskChatRoute.js","sourceRoot":"","sources":["../../src/cli/taskChatRoute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAGjF,MAAM,mBAAmB,GAAG,UAAU,CAAC;AACvC,MAAM,qBAAqB,GAAG,aAAa,CAAC;AAS5C,MAAM,UAAU,aAAa,CAAC,OAAsB;IAClD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACtC,MAAM,cAAc,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACtD,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,yCAAyC,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACxI,CAAC;IACD,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAChE,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,UAAU,EAAE,CAAC,CAAC;IACpF,MAAM,QAAQ,GAAG,kBAAkB,CAAC,UAAU,CAAC;QAC7C,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,qBAAqB,CAAC,GAAG,qBAAqB,CAAC,MAAM,CAAC;QAC5F,CAAC,CAAC,SAAS,CAAC;IACd,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,cAAc;QACjF,MAAM;QACN,UAAU;QACV,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClC,CAAC;AACJ,CAAC"}