@downcity/shell 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 (141) hide show
  1. package/bin/Shell.d.ts +55 -0
  2. package/bin/Shell.d.ts.map +1 -0
  3. package/bin/Shell.js +171 -0
  4. package/bin/Shell.js.map +1 -0
  5. package/bin/approval/ShellApprovalRuntime.d.ts +62 -0
  6. package/bin/approval/ShellApprovalRuntime.d.ts.map +1 -0
  7. package/bin/approval/ShellApprovalRuntime.js +214 -0
  8. package/bin/approval/ShellApprovalRuntime.js.map +1 -0
  9. package/bin/index.d.ts +27 -0
  10. package/bin/index.d.ts.map +1 -0
  11. package/bin/index.js +26 -0
  12. package/bin/index.js.map +1 -0
  13. package/bin/sandbox/LinuxBubblewrapSandbox.d.ts +19 -0
  14. package/bin/sandbox/LinuxBubblewrapSandbox.d.ts.map +1 -0
  15. package/bin/sandbox/LinuxBubblewrapSandbox.js +186 -0
  16. package/bin/sandbox/LinuxBubblewrapSandbox.js.map +1 -0
  17. package/bin/sandbox/MacOsSeatbeltSandbox.d.ts +16 -0
  18. package/bin/sandbox/MacOsSeatbeltSandbox.d.ts.map +1 -0
  19. package/bin/sandbox/MacOsSeatbeltSandbox.js +154 -0
  20. package/bin/sandbox/MacOsSeatbeltSandbox.js.map +1 -0
  21. package/bin/sandbox/SandboxConfigResolver.d.ts +37 -0
  22. package/bin/sandbox/SandboxConfigResolver.d.ts.map +1 -0
  23. package/bin/sandbox/SandboxConfigResolver.js +130 -0
  24. package/bin/sandbox/SandboxConfigResolver.js.map +1 -0
  25. package/bin/sandbox/SandboxPreflight.d.ts +73 -0
  26. package/bin/sandbox/SandboxPreflight.d.ts.map +1 -0
  27. package/bin/sandbox/SandboxPreflight.js +122 -0
  28. package/bin/sandbox/SandboxPreflight.js.map +1 -0
  29. package/bin/sandbox/SandboxRunner.d.ts +61 -0
  30. package/bin/sandbox/SandboxRunner.d.ts.map +1 -0
  31. package/bin/sandbox/SandboxRunner.js +107 -0
  32. package/bin/sandbox/SandboxRunner.js.map +1 -0
  33. package/bin/sandbox/UnrestrictedSandbox.d.ts +16 -0
  34. package/bin/sandbox/UnrestrictedSandbox.d.ts.map +1 -0
  35. package/bin/sandbox/UnrestrictedSandbox.js +39 -0
  36. package/bin/sandbox/UnrestrictedSandbox.js.map +1 -0
  37. package/bin/sandbox/types/Sandbox.d.ts +130 -0
  38. package/bin/sandbox/types/Sandbox.d.ts.map +1 -0
  39. package/bin/sandbox/types/Sandbox.js +10 -0
  40. package/bin/sandbox/types/Sandbox.js.map +1 -0
  41. package/bin/sandbox/types/SandboxRuntime.d.ts +370 -0
  42. package/bin/sandbox/types/SandboxRuntime.d.ts.map +1 -0
  43. package/bin/sandbox/types/SandboxRuntime.js +10 -0
  44. package/bin/sandbox/types/SandboxRuntime.js.map +1 -0
  45. package/bin/session/Paths.d.ts +12 -0
  46. package/bin/session/Paths.d.ts.map +1 -0
  47. package/bin/session/Paths.js +21 -0
  48. package/bin/session/Paths.js.map +1 -0
  49. package/bin/session/ShellActionResponse.d.ts +52 -0
  50. package/bin/session/ShellActionResponse.d.ts.map +1 -0
  51. package/bin/session/ShellActionResponse.js +73 -0
  52. package/bin/session/ShellActionResponse.js.map +1 -0
  53. package/bin/session/ShellActionRuntime.d.ts +15 -0
  54. package/bin/session/ShellActionRuntime.d.ts.map +1 -0
  55. package/bin/session/ShellActionRuntime.js +15 -0
  56. package/bin/session/ShellActionRuntime.js.map +1 -0
  57. package/bin/session/ShellActionRuntimeSupport.d.ts +88 -0
  58. package/bin/session/ShellActionRuntimeSupport.d.ts.map +1 -0
  59. package/bin/session/ShellActionRuntimeSupport.js +305 -0
  60. package/bin/session/ShellActionRuntimeSupport.js.map +1 -0
  61. package/bin/session/ShellProcessEvents.d.ts +22 -0
  62. package/bin/session/ShellProcessEvents.d.ts.map +1 -0
  63. package/bin/session/ShellProcessEvents.js +41 -0
  64. package/bin/session/ShellProcessEvents.js.map +1 -0
  65. package/bin/session/ShellRunScope.d.ts +43 -0
  66. package/bin/session/ShellRunScope.d.ts.map +1 -0
  67. package/bin/session/ShellRunScope.js +29 -0
  68. package/bin/session/ShellRunScope.js.map +1 -0
  69. package/bin/session/ShellRuntimeEnvironment.d.ts +21 -0
  70. package/bin/session/ShellRuntimeEnvironment.d.ts.map +1 -0
  71. package/bin/session/ShellRuntimeEnvironment.js +69 -0
  72. package/bin/session/ShellRuntimeEnvironment.js.map +1 -0
  73. package/bin/session/ShellRuntimeTypes.d.ts +160 -0
  74. package/bin/session/ShellRuntimeTypes.d.ts.map +1 -0
  75. package/bin/session/ShellRuntimeTypes.js +10 -0
  76. package/bin/session/ShellRuntimeTypes.js.map +1 -0
  77. package/bin/session/actions/ShellActionShared.d.ts +76 -0
  78. package/bin/session/actions/ShellActionShared.d.ts.map +1 -0
  79. package/bin/session/actions/ShellActionShared.js +100 -0
  80. package/bin/session/actions/ShellActionShared.js.map +1 -0
  81. package/bin/session/actions/ShellApprovalActions.d.ts +34 -0
  82. package/bin/session/actions/ShellApprovalActions.d.ts.map +1 -0
  83. package/bin/session/actions/ShellApprovalActions.js +37 -0
  84. package/bin/session/actions/ShellApprovalActions.js.map +1 -0
  85. package/bin/session/actions/ShellExecActions.d.ts +15 -0
  86. package/bin/session/actions/ShellExecActions.d.ts.map +1 -0
  87. package/bin/session/actions/ShellExecActions.js +117 -0
  88. package/bin/session/actions/ShellExecActions.js.map +1 -0
  89. package/bin/session/actions/ShellLifecycleActions.d.ts +18 -0
  90. package/bin/session/actions/ShellLifecycleActions.d.ts.map +1 -0
  91. package/bin/session/actions/ShellLifecycleActions.js +53 -0
  92. package/bin/session/actions/ShellLifecycleActions.js.map +1 -0
  93. package/bin/session/actions/ShellQueryActions.d.ts +27 -0
  94. package/bin/session/actions/ShellQueryActions.d.ts.map +1 -0
  95. package/bin/session/actions/ShellQueryActions.js +151 -0
  96. package/bin/session/actions/ShellQueryActions.js.map +1 -0
  97. package/bin/session/actions/ShellStartActions.d.ts +15 -0
  98. package/bin/session/actions/ShellStartActions.d.ts.map +1 -0
  99. package/bin/session/actions/ShellStartActions.js +167 -0
  100. package/bin/session/actions/ShellStartActions.js.map +1 -0
  101. package/bin/session/actions/ShellWriteActions.d.ts +15 -0
  102. package/bin/session/actions/ShellWriteActions.d.ts.map +1 -0
  103. package/bin/session/actions/ShellWriteActions.js +85 -0
  104. package/bin/session/actions/ShellWriteActions.js.map +1 -0
  105. package/bin/tool/ShellToolFormatting.d.ts +12 -0
  106. package/bin/tool/ShellToolFormatting.d.ts.map +1 -0
  107. package/bin/tool/ShellToolFormatting.js +31 -0
  108. package/bin/tool/ShellToolFormatting.js.map +1 -0
  109. package/bin/tool/ShellToolSchemas.d.ts +61 -0
  110. package/bin/tool/ShellToolSchemas.d.ts.map +1 -0
  111. package/bin/tool/ShellToolSchemas.js +130 -0
  112. package/bin/tool/ShellToolSchemas.js.map +1 -0
  113. package/bin/tool/ShellTools.d.ts +32 -0
  114. package/bin/tool/ShellTools.d.ts.map +1 -0
  115. package/bin/tool/ShellTools.js +296 -0
  116. package/bin/tool/ShellTools.js.map +1 -0
  117. package/bin/types/Shell.d.ts +115 -0
  118. package/bin/types/Shell.d.ts.map +1 -0
  119. package/bin/types/Shell.js +9 -0
  120. package/bin/types/Shell.js.map +1 -0
  121. package/bin/types/ShellAction.d.ts +258 -0
  122. package/bin/types/ShellAction.d.ts.map +1 -0
  123. package/bin/types/ShellAction.js +9 -0
  124. package/bin/types/ShellAction.js.map +1 -0
  125. package/bin/types/ShellHostContext.d.ts +78 -0
  126. package/bin/types/ShellHostContext.d.ts.map +1 -0
  127. package/bin/types/ShellHostContext.js +9 -0
  128. package/bin/types/ShellHostContext.js.map +1 -0
  129. package/bin/types/ShellRuntime.d.ts +128 -0
  130. package/bin/types/ShellRuntime.d.ts.map +1 -0
  131. package/bin/types/ShellRuntime.js +9 -0
  132. package/bin/types/ShellRuntime.js.map +1 -0
  133. package/bin/types/ShellRuntimeOptions.d.ts +103 -0
  134. package/bin/types/ShellRuntimeOptions.d.ts.map +1 -0
  135. package/bin/types/ShellRuntimeOptions.js +10 -0
  136. package/bin/types/ShellRuntimeOptions.js.map +1 -0
  137. package/bin/utils/Id.d.ts +11 -0
  138. package/bin/utils/Id.d.ts.map +1 -0
  139. package/bin/utils/Id.js +14 -0
  140. package/bin/utils/Id.js.map +1 -0
  141. package/package.json +81 -0
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Shell action 运行时辅助能力。
3
+ *
4
+ * 关键点(中文)
5
+ * - 统一承载 ShellActionRuntime 的内部共享逻辑:环境组装、持久化、waiter 协调、session 查找。
6
+ * - 对外暴露给 ShellActionRuntime 的只有纯运行时辅助函数,不直接承担 plugin action 编排。
7
+ */
8
+ import type { ShellHostContext } from "../types/ShellHostContext.js";
9
+ import type { ShellRuntimeState, ShellSessionRuntimeState } from "../session/ShellRuntimeTypes.js";
10
+ import type { ResolvedShellRuntimeOptions, ShellRuntimeOptions } from "../types/ShellRuntimeOptions.js";
11
+ import type { ShellQueryRequest, ShellSessionSnapshot, ShellSessionStatus } from "../types/ShellAction.js";
12
+ export { buildShellEnv, resolveOwnerContextId, resolveShellCwd, } from "./ShellRuntimeEnvironment.js";
13
+ export { buildActionResponse, createOutputChunk, } from "./ShellActionResponse.js";
14
+ /**
15
+ * shell.start 默认内联等待时间。
16
+ */
17
+ export declare const DEFAULT_INLINE_WAIT_MS: number;
18
+ /**
19
+ * shell.wait 默认等待超时。
20
+ */
21
+ export declare const DEFAULT_WAIT_TIMEOUT_MS: number;
22
+ /**
23
+ * shell.exec 默认总超时。
24
+ */
25
+ export declare const DEFAULT_EXEC_TIMEOUT_MS: number;
26
+ /**
27
+ * 归一化 Shell 可选运行参数。
28
+ */
29
+ export declare function resolveShellRuntimeOptions(options?: ShellRuntimeOptions): ResolvedShellRuntimeOptions;
30
+ /**
31
+ * 创建 shell runtime 初始状态。
32
+ */
33
+ export declare function createShellRuntimeState(options?: ShellRuntimeOptions): ShellRuntimeState;
34
+ /**
35
+ * 返回当前毫秒时间戳。
36
+ */
37
+ export declare function nowMs(): number;
38
+ /**
39
+ * 归一化 wait/timeout 参数。
40
+ */
41
+ export declare function clampWaitMs(value: number | undefined, fallback: number): number;
42
+ /**
43
+ * 结合 Shell options 归一化 wait/timeout 参数。
44
+ */
45
+ export declare function clampWaitMsWithOptions(options: ResolvedShellRuntimeOptions, value: number | undefined, fallback: number): number;
46
+ /**
47
+ * 判断 shell 是否已进入终态。
48
+ */
49
+ export declare function isTerminalStatus(status: ShellSessionStatus): boolean;
50
+ /**
51
+ * 持久化 shell snapshot。
52
+ */
53
+ export declare function persistSnapshot(session: ShellSessionRuntimeState): Promise<void>;
54
+ /**
55
+ * 更新 session snapshot 并唤醒等待者。
56
+ */
57
+ export declare function updateSessionSnapshot(session: ShellSessionRuntimeState, updater: (snapshot: ShellSessionSnapshot) => void | ShellSessionSnapshot): Promise<void>;
58
+ /**
59
+ * 追加 shell 输出并同步更新快照。
60
+ */
61
+ export declare function appendSessionOutput(state: ShellRuntimeState, session: ShellSessionRuntimeState, raw: string): Promise<void>;
62
+ /**
63
+ * 为终态 shell 安排延迟清理。
64
+ */
65
+ export declare function scheduleCleanup(state: ShellRuntimeState, shellId: string): void;
66
+ /**
67
+ * 控制 in-memory shell session 容量。
68
+ */
69
+ export declare function ensureCapacity(state: ShellRuntimeState): void;
70
+ /**
71
+ * 按 shellId 或 ownerContext 解析目标 session。
72
+ */
73
+ export declare function resolveSession(state: ShellRuntimeState, context: ShellHostContext, query: ShellQueryRequest): Promise<ShellSessionRuntimeState | {
74
+ snapshot: ShellSessionSnapshot;
75
+ outputText: string;
76
+ } | null>;
77
+ /**
78
+ * 判断解析出的 session 是否仍在内存中活动。
79
+ */
80
+ export declare function isInMemorySession(value: ShellSessionRuntimeState | {
81
+ snapshot: ShellSessionSnapshot;
82
+ outputText: string;
83
+ }): value is ShellSessionRuntimeState;
84
+ /**
85
+ * 处理 shell 退出后的状态收口。
86
+ */
87
+ export declare function finalizeExit(state: ShellRuntimeState, session: ShellSessionRuntimeState, exitCode: number): Promise<void>;
88
+ //# sourceMappingURL=ShellActionRuntimeSupport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShellActionRuntimeSupport.d.ts","sourceRoot":"","sources":["../../src/session/ShellActionRuntimeSupport.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EACV,iBAAiB,EACjB,wBAAwB,EACzB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EACV,2BAA2B,EAC3B,mBAAmB,EACpB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,eAAe,GAChB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAelC;;GAEG;AACH,eAAO,MAAM,sBAAsB,QAAoD,CAAC;AAExF;;GAEG;AACH,eAAO,MAAM,uBAAuB,QAAqD,CAAC;AAE1F;;GAEG;AACH,eAAO,MAAM,uBAAuB,QAAqD,CAAC;AAY1F;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,GAAE,mBAAwB,GAChC,2BAA2B,CAgD7B;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,mBAAwB,GAChC,iBAAiB,CAOnB;AAED;;GAEG;AACH,wBAAgB,KAAK,IAAI,MAAM,CAE9B;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,2BAA2B,EACpC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,QAAQ,EAAE,MAAM,GACf,MAAM,CAMR;AAeD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAOpE;AAqBD;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAGtF;AAqBD;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,wBAAwB,EACjC,OAAO,EAAE,CAAC,QAAQ,EAAE,oBAAoB,KAAK,IAAI,GAAG,oBAAoB,GACvE,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,wBAAwB,EACjC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAY/E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAc7D;AAuBD;;GAEG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,wBAAwB,GAAG;IAAE,QAAQ,EAAE,oBAAoB,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAiCnG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,wBAAwB,GAAG;IAAE,QAAQ,EAAE,oBAAoB,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACvF,KAAK,IAAI,wBAAwB,CAEnC;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,wBAAwB,EACjC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAcf"}
@@ -0,0 +1,305 @@
1
+ /**
2
+ * Shell action 运行时辅助能力。
3
+ *
4
+ * 关键点(中文)
5
+ * - 统一承载 ShellActionRuntime 的内部共享逻辑:环境组装、持久化、waiter 协调、session 查找。
6
+ * - 对外暴露给 ShellActionRuntime 的只有纯运行时辅助函数,不直接承担 plugin action 编排。
7
+ */
8
+ import path from "node:path";
9
+ import fs from "fs-extra";
10
+ import { getShellOutputPath, getShellSnapshotPath } from "./Paths.js";
11
+ import { resolveOwnerContextId } from "./ShellRuntimeEnvironment.js";
12
+ export { buildShellEnv, resolveOwnerContextId, resolveShellCwd, } from "./ShellRuntimeEnvironment.js";
13
+ export { buildActionResponse, createOutputChunk, } from "./ShellActionResponse.js";
14
+ const DEFAULT_SHELL_RUNTIME_OPTIONS = {
15
+ maxActiveShells: 64,
16
+ cleanupDelayMs: 10 * 60 * 1000,
17
+ maxInMemoryOutputChars: 1_000_000,
18
+ outputPreviewChars: 280,
19
+ minWaitMs: 50,
20
+ maxWaitMs: 30_000,
21
+ defaultInlineWaitMs: 1_200,
22
+ defaultWaitTimeoutMs: 10_000,
23
+ defaultExecTimeoutMs: 60_000,
24
+ defaultApprovalTimeoutMs: 120_000,
25
+ };
26
+ /**
27
+ * shell.start 默认内联等待时间。
28
+ */
29
+ export const DEFAULT_INLINE_WAIT_MS = DEFAULT_SHELL_RUNTIME_OPTIONS.defaultInlineWaitMs;
30
+ /**
31
+ * shell.wait 默认等待超时。
32
+ */
33
+ export const DEFAULT_WAIT_TIMEOUT_MS = DEFAULT_SHELL_RUNTIME_OPTIONS.defaultWaitTimeoutMs;
34
+ /**
35
+ * shell.exec 默认总超时。
36
+ */
37
+ export const DEFAULT_EXEC_TIMEOUT_MS = DEFAULT_SHELL_RUNTIME_OPTIONS.defaultExecTimeoutMs;
38
+ function readPositiveInteger(value, fallback) {
39
+ if (typeof value !== "number" || !Number.isFinite(value)) {
40
+ return fallback;
41
+ }
42
+ return Math.max(1, Math.floor(value));
43
+ }
44
+ /**
45
+ * 归一化 Shell 可选运行参数。
46
+ */
47
+ export function resolveShellRuntimeOptions(options = {}) {
48
+ const minWaitMs = readPositiveInteger(options.minWaitMs, DEFAULT_SHELL_RUNTIME_OPTIONS.minWaitMs);
49
+ const maxWaitMs = Math.max(minWaitMs, readPositiveInteger(options.maxWaitMs, DEFAULT_SHELL_RUNTIME_OPTIONS.maxWaitMs));
50
+ return {
51
+ maxActiveShells: readPositiveInteger(options.maxActiveShells, DEFAULT_SHELL_RUNTIME_OPTIONS.maxActiveShells),
52
+ cleanupDelayMs: readPositiveInteger(options.cleanupDelayMs, DEFAULT_SHELL_RUNTIME_OPTIONS.cleanupDelayMs),
53
+ maxInMemoryOutputChars: readPositiveInteger(options.maxInMemoryOutputChars, DEFAULT_SHELL_RUNTIME_OPTIONS.maxInMemoryOutputChars),
54
+ outputPreviewChars: readPositiveInteger(options.outputPreviewChars, DEFAULT_SHELL_RUNTIME_OPTIONS.outputPreviewChars),
55
+ minWaitMs,
56
+ maxWaitMs,
57
+ defaultInlineWaitMs: readPositiveInteger(options.defaultInlineWaitMs, DEFAULT_SHELL_RUNTIME_OPTIONS.defaultInlineWaitMs),
58
+ defaultWaitTimeoutMs: readPositiveInteger(options.defaultWaitTimeoutMs, DEFAULT_SHELL_RUNTIME_OPTIONS.defaultWaitTimeoutMs),
59
+ defaultExecTimeoutMs: readPositiveInteger(options.defaultExecTimeoutMs, DEFAULT_SHELL_RUNTIME_OPTIONS.defaultExecTimeoutMs),
60
+ defaultApprovalTimeoutMs: readPositiveInteger(options.defaultApprovalTimeoutMs, DEFAULT_SHELL_RUNTIME_OPTIONS.defaultApprovalTimeoutMs),
61
+ };
62
+ }
63
+ /**
64
+ * 创建 shell runtime 初始状态。
65
+ */
66
+ export function createShellRuntimeState(options = {}) {
67
+ return {
68
+ options: resolveShellRuntimeOptions(options),
69
+ sessions: new Map(),
70
+ approvals: new Map(),
71
+ context: null,
72
+ };
73
+ }
74
+ /**
75
+ * 返回当前毫秒时间戳。
76
+ */
77
+ export function nowMs() {
78
+ return Date.now();
79
+ }
80
+ /**
81
+ * 归一化 wait/timeout 参数。
82
+ */
83
+ export function clampWaitMs(value, fallback) {
84
+ return clampWaitMsWithOptions(DEFAULT_SHELL_RUNTIME_OPTIONS, value, fallback);
85
+ }
86
+ /**
87
+ * 结合 Shell options 归一化 wait/timeout 参数。
88
+ */
89
+ export function clampWaitMsWithOptions(options, value, fallback) {
90
+ const raw = typeof value === "number" && Number.isFinite(value)
91
+ ? Math.floor(value)
92
+ : fallback;
93
+ return Math.min(options.maxWaitMs, Math.max(options.minWaitMs, raw));
94
+ }
95
+ function normalizeOutputChunk(raw) {
96
+ if (!raw)
97
+ return "";
98
+ return raw
99
+ .replace(/\r\n/g, "\n")
100
+ .replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]/g, "");
101
+ }
102
+ function deriveExitStatus(exitCode) {
103
+ if (exitCode === -9 || exitCode === 137)
104
+ return "killed";
105
+ if (typeof exitCode === "number" && exitCode === 0)
106
+ return "completed";
107
+ return "failed";
108
+ }
109
+ /**
110
+ * 判断 shell 是否已进入终态。
111
+ */
112
+ export function isTerminalStatus(status) {
113
+ return (status === "completed" ||
114
+ status === "failed" ||
115
+ status === "killed" ||
116
+ status === "expired");
117
+ }
118
+ function extractExternalRefsFromText(text, current) {
119
+ const next = [...current];
120
+ const register = (kind, value, label) => {
121
+ const normalized = String(value || "").trim();
122
+ if (!normalized)
123
+ return;
124
+ if (next.some((item) => item.kind === kind && item.value === normalized))
125
+ return;
126
+ next.push({ kind, value: normalized, ...(label ? { label } : {}) });
127
+ };
128
+ const threadIdRegex = /thread_id[:=]\s*([a-zA-Z0-9_-]{6,})/g;
129
+ for (const match of text.matchAll(threadIdRegex)) {
130
+ register("thread_id", String(match[1] || ""), "external thread id");
131
+ }
132
+ return next;
133
+ }
134
+ /**
135
+ * 持久化 shell snapshot。
136
+ */
137
+ export async function persistSnapshot(session) {
138
+ await fs.ensureDir(path.dirname(session.snapshotFilePath));
139
+ await fs.writeJson(session.snapshotFilePath, session.snapshot, { spaces: 2 });
140
+ }
141
+ function enqueuePersistedAppend(session, text) {
142
+ session.writeChain = session.writeChain.then(async () => {
143
+ await fs.ensureDir(path.dirname(session.outputFilePath));
144
+ await fs.appendFile(session.outputFilePath, text, "utf-8");
145
+ });
146
+ return session.writeChain;
147
+ }
148
+ function notifyWaiters(session) {
149
+ for (const waiter of Array.from(session.waiters)) {
150
+ clearTimeout(waiter.timer);
151
+ session.waiters.delete(waiter);
152
+ waiter.resolve();
153
+ }
154
+ }
155
+ /**
156
+ * 更新 session snapshot 并唤醒等待者。
157
+ */
158
+ export async function updateSessionSnapshot(session, updater) {
159
+ const result = updater(session.snapshot);
160
+ if (result) {
161
+ session.snapshot = result;
162
+ }
163
+ session.snapshot.updatedAt = nowMs();
164
+ session.snapshot.version += 1;
165
+ await persistSnapshot(session);
166
+ notifyWaiters(session);
167
+ }
168
+ /**
169
+ * 追加 shell 输出并同步更新快照。
170
+ */
171
+ export async function appendSessionOutput(state, session, raw) {
172
+ const text = normalizeOutputChunk(raw);
173
+ if (!text)
174
+ return;
175
+ session.outputText += text;
176
+ if (session.outputText.length > state.options.maxInMemoryOutputChars) {
177
+ const overflow = session.outputText.length - state.options.maxInMemoryOutputChars;
178
+ session.outputText = session.outputText.slice(overflow);
179
+ session.snapshot.droppedChars += overflow;
180
+ }
181
+ session.snapshot.outputChars += text.length;
182
+ session.snapshot.lastOutputAt = nowMs();
183
+ session.snapshot.lastOutputPreview = session.outputText
184
+ .slice(-state.options.outputPreviewChars)
185
+ .trim();
186
+ session.snapshot.externalRefs = extractExternalRefsFromText(text, session.snapshot.externalRefs);
187
+ await enqueuePersistedAppend(session, text);
188
+ await updateSessionSnapshot(session, () => undefined);
189
+ }
190
+ /**
191
+ * 为终态 shell 安排延迟清理。
192
+ */
193
+ export function scheduleCleanup(state, shellId) {
194
+ const session = state.sessions.get(shellId);
195
+ if (!session)
196
+ return;
197
+ if (session.cleanupTimer)
198
+ clearTimeout(session.cleanupTimer);
199
+ session.cleanupTimer = setTimeout(() => {
200
+ const current = state.sessions.get(shellId);
201
+ if (!current)
202
+ return;
203
+ state.sessions.delete(shellId);
204
+ }, state.options.cleanupDelayMs);
205
+ if (typeof session.cleanupTimer.unref === "function") {
206
+ session.cleanupTimer.unref();
207
+ }
208
+ }
209
+ /**
210
+ * 控制 in-memory shell session 容量。
211
+ */
212
+ export function ensureCapacity(state) {
213
+ if (state.sessions.size < state.options.maxActiveShells)
214
+ return;
215
+ const removable = Array.from(state.sessions.values())
216
+ .filter((item) => item.snapshot.status !== "running" && item.snapshot.status !== "starting")
217
+ .sort((a, b) => a.snapshot.updatedAt - b.snapshot.updatedAt);
218
+ for (const item of removable) {
219
+ if (state.sessions.size < state.options.maxActiveShells)
220
+ break;
221
+ state.sessions.delete(item.snapshot.shellId);
222
+ }
223
+ if (state.sessions.size >= state.options.maxActiveShells) {
224
+ throw new Error(`Too many active shell sessions (${state.sessions.size}). Please close or wait older sessions first.`);
225
+ }
226
+ }
227
+ async function loadPersistedSnapshot(context, shellId) {
228
+ const file = getShellSnapshotPath(context.rootPath, shellId);
229
+ if (!(await fs.pathExists(file)))
230
+ return null;
231
+ const raw = await fs.readJson(file).catch(() => null);
232
+ if (!raw || typeof raw !== "object" || Array.isArray(raw))
233
+ return null;
234
+ const snapshot = raw;
235
+ return typeof snapshot.shellId === "string" ? snapshot : null;
236
+ }
237
+ async function readPersistedOutput(context, shellId) {
238
+ const file = getShellOutputPath(context.rootPath, shellId);
239
+ if (!(await fs.pathExists(file)))
240
+ return "";
241
+ return await fs.readFile(file, "utf-8");
242
+ }
243
+ /**
244
+ * 按 shellId 或 ownerContext 解析目标 session。
245
+ */
246
+ export async function resolveSession(state, context, query) {
247
+ const explicitShellId = String(query.shellId || "").trim();
248
+ if (explicitShellId) {
249
+ const inMemory = state.sessions.get(explicitShellId);
250
+ if (inMemory)
251
+ return inMemory;
252
+ const snapshot = await loadPersistedSnapshot(context, explicitShellId);
253
+ if (!snapshot)
254
+ return null;
255
+ return {
256
+ snapshot,
257
+ outputText: await readPersistedOutput(context, explicitShellId),
258
+ };
259
+ }
260
+ const ownerContextId = resolveOwnerContextId(context, query.ownerContextId);
261
+ const cmd = String(query.cmd || "").trim().toLowerCase();
262
+ if (!ownerContextId)
263
+ return null;
264
+ const includeCompleted = query.includeCompleted === true;
265
+ const matched = Array.from(state.sessions.values())
266
+ .filter((item) => {
267
+ if (item.snapshot.ownerContextId !== ownerContextId)
268
+ return false;
269
+ if (!includeCompleted) {
270
+ if (item.snapshot.status !== "running" &&
271
+ item.snapshot.status !== "starting") {
272
+ return false;
273
+ }
274
+ }
275
+ if (!cmd)
276
+ return true;
277
+ return item.snapshot.cmd.toLowerCase().includes(cmd);
278
+ })
279
+ .sort((a, b) => b.snapshot.updatedAt - a.snapshot.updatedAt);
280
+ return matched[0] || null;
281
+ }
282
+ /**
283
+ * 判断解析出的 session 是否仍在内存中活动。
284
+ */
285
+ export function isInMemorySession(value) {
286
+ return "child" in value;
287
+ }
288
+ /**
289
+ * 处理 shell 退出后的状态收口。
290
+ */
291
+ export async function finalizeExit(state, session, exitCode) {
292
+ await updateSessionSnapshot(session, (snapshot) => {
293
+ snapshot.status = deriveExitStatus(exitCode);
294
+ snapshot.exitCode = exitCode;
295
+ snapshot.endedAt = nowMs();
296
+ snapshot.pid = session.child.pid ?? snapshot.pid;
297
+ });
298
+ session.resolveCompletion();
299
+ scheduleCleanup(state, session.snapshot.shellId);
300
+ if (session.snapshot.autoNotifyOnExit && session.snapshot.notificationSent === false) {
301
+ session.snapshot.notificationSent = true;
302
+ await persistSnapshot(session);
303
+ }
304
+ }
305
+ //# sourceMappingURL=ShellActionRuntimeSupport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShellActionRuntimeSupport.js","sourceRoot":"","sources":["../../src/session/ShellActionRuntimeSupport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Shell 子进程事件绑定辅助。
3
+ *
4
+ * 关键点(中文)
5
+ * - 集中处理 stdout/stderr 追加、process error 与 close 事件。
6
+ * - close 到达时先等待输出写入链 drain,再统一进入终态收口,避免尾部输出丢读。
7
+ */
8
+ import type { ShellRuntimeState, ShellSessionRuntimeState } from "../session/ShellRuntimeTypes.js";
9
+ /**
10
+ * 绑定 shell 子进程事件。
11
+ */
12
+ export declare function attachShellProcessEventHandlers(params: {
13
+ /**
14
+ * 当前 shell runtime 状态。
15
+ */
16
+ state: ShellRuntimeState;
17
+ /**
18
+ * 当前 shell runtime session。
19
+ */
20
+ session: ShellSessionRuntimeState;
21
+ }): void;
22
+ //# sourceMappingURL=ShellProcessEvents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShellProcessEvents.d.ts","sourceRoot":"","sources":["../../src/session/ShellProcessEvents.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAsBlG;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE;IACtD;;OAEG;IACH,KAAK,EAAE,iBAAiB,CAAC;IACzB;;OAEG;IACH,OAAO,EAAE,wBAAwB,CAAC;CACnC,GAAG,IAAI,CAsBP"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Shell 子进程事件绑定辅助。
3
+ *
4
+ * 关键点(中文)
5
+ * - 集中处理 stdout/stderr 追加、process error 与 close 事件。
6
+ * - close 到达时先等待输出写入链 drain,再统一进入终态收口,避免尾部输出丢读。
7
+ */
8
+ import { appendSessionOutput, finalizeExit, } from "./ShellActionRuntimeSupport.js";
9
+ async function finalizeExitAfterOutputDrain(state, session, exitCode) {
10
+ // 关键点(中文)
11
+ // - `close` 事件到达时,stdout / stderr 的异步 append 链可能刚刚开始收尾。
12
+ // - 这里先让出一个事件循环 tick,再等待当前 writeChain,可显著降低“终态已到但尾部输出尚未可读”的竞态。
13
+ await new Promise((resolve) => {
14
+ const timer = setImmediate(resolve);
15
+ if (typeof timer.unref === "function")
16
+ timer.unref();
17
+ });
18
+ await session.writeChain.catch(() => undefined);
19
+ await finalizeExit(state, session, exitCode);
20
+ }
21
+ /**
22
+ * 绑定 shell 子进程事件。
23
+ */
24
+ export function attachShellProcessEventHandlers(params) {
25
+ const { state, session } = params;
26
+ const { child } = session;
27
+ child.stdout.on("data", (chunk) => {
28
+ void appendSessionOutput(state, session, String(chunk ?? "")).catch(() => undefined);
29
+ });
30
+ child.stderr.on("data", (chunk) => {
31
+ void appendSessionOutput(state, session, String(chunk ?? "")).catch(() => undefined);
32
+ });
33
+ child.on("error", (error) => {
34
+ void appendSessionOutput(state, session, `\n[process error] ${String(error)}\n`).catch(() => undefined);
35
+ void finalizeExitAfterOutputDrain(state, session, -1).catch(() => undefined);
36
+ });
37
+ child.on("close", (code) => {
38
+ void finalizeExitAfterOutputDrain(state, session, typeof code === "number" ? code : -1).catch(() => undefined);
39
+ });
40
+ }
41
+ //# sourceMappingURL=ShellProcessEvents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShellProcessEvents.js","sourceRoot":"","sources":["../../src/session/ShellProcessEvents.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,mBAAmB,EACnB,YAAY,GACb,MAAM,gCAAgC,CAAC;AAExC,KAAK,UAAU,4BAA4B,CACzC,KAAwB,EACxB,OAAiC,EACjC,QAAgB;IAEhB,UAAU;IACV,wDAAwD;IACxD,+DAA+D;IAC/D,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,UAAU;YAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IACvD,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,+BAA+B,CAAC,MAS/C;IACC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAClC,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAC1B,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE;QACjD,KAAK,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE;QACjD,KAAK,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;QACjC,KAAK,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,qBAAqB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CACpF,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;QACF,KAAK,4BAA4B,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAmB,EAAE,EAAE;QACxC,KAAK,4BAA4B,CAC/B,KAAK,EACL,OAAO,EACP,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CACrC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * ShellRunScope:shell 工具调用的异步运行作用域。
3
+ *
4
+ * 关键点(中文)
5
+ * - Shell 包不依赖 agent,但 shell approval event 需要知道当前 session / turn。
6
+ * - 宿主在执行模型 run 时绑定该 scope,Shell tool 在深层回调里自动读取。
7
+ * - 这让用户只需要 `new Agent({ shell: new Shell() })`,不需要理解 run context wiring。
8
+ */
9
+ /**
10
+ * Shell 当前运行上下文。
11
+ */
12
+ export interface ShellScopedRunContext {
13
+ /**
14
+ * 当前宿主 session id。
15
+ */
16
+ session_id?: string;
17
+ /**
18
+ * 当前宿主 turn id。
19
+ */
20
+ turn_id?: string;
21
+ }
22
+ /**
23
+ * Shell run scope。
24
+ */
25
+ export interface ShellRunScope {
26
+ /**
27
+ * 当前 shell tool 调用可读取的宿主运行上下文。
28
+ */
29
+ run_context: ShellScopedRunContext;
30
+ }
31
+ /**
32
+ * 绑定当前异步链路上的 shell run scope。
33
+ */
34
+ export declare function withShellRunScope<T>(scope: ShellRunScope, fn: () => T): T;
35
+ /**
36
+ * 读取当前异步链路上的 shell run scope。
37
+ */
38
+ export declare function getShellRunScope(): ShellRunScope | undefined;
39
+ /**
40
+ * 读取当前异步链路上的 shell run context。
41
+ */
42
+ export declare function getShellRunContext(): ShellScopedRunContext | undefined;
43
+ //# sourceMappingURL=ShellRunScope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShellRunScope.d.ts","sourceRoot":"","sources":["../../src/session/ShellRunScope.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,WAAW,EAAE,qBAAqB,CAAC;CACpC;AAID;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAEzE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,GAAG,SAAS,CAE5D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,qBAAqB,GAAG,SAAS,CAEtE"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * ShellRunScope:shell 工具调用的异步运行作用域。
3
+ *
4
+ * 关键点(中文)
5
+ * - Shell 包不依赖 agent,但 shell approval event 需要知道当前 session / turn。
6
+ * - 宿主在执行模型 run 时绑定该 scope,Shell tool 在深层回调里自动读取。
7
+ * - 这让用户只需要 `new Agent({ shell: new Shell() })`,不需要理解 run context wiring。
8
+ */
9
+ import { AsyncLocalStorage } from "node:async_hooks";
10
+ const shell_run_scope_storage = new AsyncLocalStorage();
11
+ /**
12
+ * 绑定当前异步链路上的 shell run scope。
13
+ */
14
+ export function withShellRunScope(scope, fn) {
15
+ return shell_run_scope_storage.run(scope, fn);
16
+ }
17
+ /**
18
+ * 读取当前异步链路上的 shell run scope。
19
+ */
20
+ export function getShellRunScope() {
21
+ return shell_run_scope_storage.getStore();
22
+ }
23
+ /**
24
+ * 读取当前异步链路上的 shell run context。
25
+ */
26
+ export function getShellRunContext() {
27
+ return shell_run_scope_storage.getStore()?.run_context;
28
+ }
29
+ //# sourceMappingURL=ShellRunScope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShellRunScope.js","sourceRoot":"","sources":["../../src/session/ShellRunScope.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AA2BrD,MAAM,uBAAuB,GAAG,IAAI,iBAAiB,EAAiB,CAAC;AAEvE;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAI,KAAoB,EAAE,EAAW;IACpE,OAAO,uBAAuB,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,uBAAuB,CAAC,QAAQ,EAAE,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,uBAAuB,CAAC,QAAQ,EAAE,EAAE,WAAW,CAAC;AACzD,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Shell action 运行环境解析辅助。
3
+ *
4
+ * 关键点(中文)
5
+ * - 集中处理 shell 子进程 cwd、env 与 owner context 的解析。
6
+ * - 这里只做输入归一化,不持有 shell session 状态。
7
+ */
8
+ import type { ShellHostContext } from "../types/ShellHostContext.js";
9
+ /**
10
+ * 构造 shell 子进程环境变量。
11
+ */
12
+ export declare function buildShellEnv(context: ShellHostContext): NodeJS.ProcessEnv;
13
+ /**
14
+ * 解析 shell 执行目录。
15
+ */
16
+ export declare function resolveShellCwd(context: ShellHostContext, cwd?: string): string;
17
+ /**
18
+ * 推断 shell 所属的 owner context。
19
+ */
20
+ export declare function resolveOwnerContextId(context: ShellHostContext, explicit?: string): string | undefined;
21
+ //# sourceMappingURL=ShellRuntimeEnvironment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShellRuntimeEnvironment.d.ts","sourceRoot":"","sources":["../../src/session/ShellRuntimeEnvironment.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAOpE;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAAC,UAAU,CA+B1E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAI/E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,gBAAgB,EACzB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,GAAG,SAAS,CAKpB"}