@modelprofile.com/flexharness 6.1.0 → 7.0.0

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 (169) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts_chat/classes.chatsession.d.ts +37 -0
  3. package/dist_ts_chat/classes.chatsession.js +102 -0
  4. package/dist_ts_chat/index.d.ts +2 -0
  5. package/dist_ts_chat/index.js +2 -0
  6. package/dist_ts_chat/interfaces.d.ts +72 -0
  7. package/dist_ts_chat/interfaces.js +2 -0
  8. package/dist_ts_chat/plugins.d.ts +4 -0
  9. package/dist_ts_chat/plugins.js +4 -0
  10. package/dist_ts_chat_cli/components.chatapp.d.ts +10 -0
  11. package/dist_ts_chat_cli/components.chatapp.js +75 -0
  12. package/dist_ts_chat_cli/components.inputarea.d.ts +7 -0
  13. package/dist_ts_chat_cli/components.inputarea.js +18 -0
  14. package/dist_ts_chat_cli/components.message.d.ts +12 -0
  15. package/dist_ts_chat_cli/components.message.js +21 -0
  16. package/dist_ts_chat_cli/components.messagelist.d.ts +9 -0
  17. package/dist_ts_chat_cli/components.messagelist.js +19 -0
  18. package/dist_ts_chat_cli/components.statusbar.d.ts +9 -0
  19. package/dist_ts_chat_cli/components.statusbar.js +15 -0
  20. package/dist_ts_chat_cli/index.d.ts +2 -0
  21. package/dist_ts_chat_cli/index.js +2 -0
  22. package/dist_ts_chat_cli/plugins.d.ts +12 -0
  23. package/dist_ts_chat_cli/plugins.js +14 -0
  24. package/dist_ts_chat_cli/startchat.d.ts +18 -0
  25. package/dist_ts_chat_cli/startchat.js +17 -0
  26. package/dist_ts_chat_web/flexchat-input.d.ts +21 -0
  27. package/dist_ts_chat_web/flexchat-input.js +172 -0
  28. package/dist_ts_chat_web/flexchat-message.d.ts +26 -0
  29. package/dist_ts_chat_web/flexchat-message.js +174 -0
  30. package/dist_ts_chat_web/flexchat-window.d.ts +34 -0
  31. package/dist_ts_chat_web/flexchat-window.js +394 -0
  32. package/dist_ts_chat_web/index.d.ts +3 -0
  33. package/dist_ts_chat_web/index.js +4 -0
  34. package/dist_ts_chat_web/plugins.d.ts +6 -0
  35. package/dist_ts_chat_web/plugins.js +4 -0
  36. package/dist_ts_compaction/index.d.ts +2 -0
  37. package/dist_ts_compaction/index.js +2 -0
  38. package/dist_ts_compaction/plugins.d.ts +4 -0
  39. package/dist_ts_compaction/plugins.js +3 -0
  40. package/dist_ts_compaction/smartagent.compaction.d.ts +14 -0
  41. package/dist_ts_compaction/smartagent.compaction.js +49 -0
  42. package/dist_ts_document/index.d.ts +19 -0
  43. package/dist_ts_document/index.js +55 -0
  44. package/dist_ts_document/plugins.d.ts +3 -0
  45. package/dist_ts_document/plugins.js +4 -0
  46. package/dist_ts_kvm/classes.browserkvm.d.ts +22 -0
  47. package/dist_ts_kvm/classes.browserkvm.js +271 -0
  48. package/dist_ts_kvm/classes.kvmterminal.d.ts +8 -0
  49. package/dist_ts_kvm/classes.kvmterminal.js +88 -0
  50. package/dist_ts_kvm/commandwrappers.d.ts +14 -0
  51. package/dist_ts_kvm/commandwrappers.js +58 -0
  52. package/dist_ts_kvm/index.d.ts +6 -0
  53. package/dist_ts_kvm/index.js +7 -0
  54. package/dist_ts_kvm/interfaces.d.ts +106 -0
  55. package/dist_ts_kvm/interfaces.js +2 -0
  56. package/dist_ts_kvm/ocr.d.ts +14 -0
  57. package/dist_ts_kvm/ocr.js +23 -0
  58. package/dist_ts_kvm/plugins.d.ts +6 -0
  59. package/dist_ts_kvm/plugins.js +10 -0
  60. package/dist_ts_kvm/tools.d.ts +15 -0
  61. package/dist_ts_kvm/tools.js +40 -0
  62. package/dist_ts_mcp/index.d.ts +86 -0
  63. package/dist_ts_mcp/index.js +284 -0
  64. package/dist_ts_mcp/requestcontext.d.ts +11 -0
  65. package/dist_ts_mcp/requestcontext.js +42 -0
  66. package/dist_ts_media/index.d.ts +8 -0
  67. package/dist_ts_media/index.js +21 -0
  68. package/dist_ts_media/plugins.d.ts +2 -0
  69. package/dist_ts_media/plugins.js +3 -0
  70. package/dist_ts_ocr/classes.imageocr.d.ts +19 -0
  71. package/dist_ts_ocr/classes.imageocr.js +27 -0
  72. package/dist_ts_ocr/index.d.ts +2 -0
  73. package/dist_ts_ocr/index.js +3 -0
  74. package/dist_ts_ocr/ocr.mistral.d.ts +75 -0
  75. package/dist_ts_ocr/ocr.mistral.js +77 -0
  76. package/dist_ts_tools/index.d.ts +17 -0
  77. package/dist_ts_tools/index.js +10 -0
  78. package/dist_ts_tools/plugins.d.ts +7 -0
  79. package/dist_ts_tools/plugins.js +6 -0
  80. package/dist_ts_tools/tool.browser.d.ts +11 -0
  81. package/dist_ts_tools/tool.browser.js +128 -0
  82. package/dist_ts_tools/tool.context.d.ts +4 -0
  83. package/dist_ts_tools/tool.context.js +23 -0
  84. package/dist_ts_tools/tool.filesystem.d.ts +11 -0
  85. package/dist_ts_tools/tool.filesystem.js +106 -0
  86. package/dist_ts_tools/tool.http.d.ts +2 -0
  87. package/dist_ts_tools/tool.http.js +65 -0
  88. package/dist_ts_tools/tool.json.d.ts +2 -0
  89. package/dist_ts_tools/tool.json.js +47 -0
  90. package/dist_ts_tools/tool.shell.d.ts +15 -0
  91. package/dist_ts_tools/tool.shell.js +329 -0
  92. package/dist_ts_tools/utils.truncation.d.ts +10 -0
  93. package/dist_ts_tools/utils.truncation.js +26 -0
  94. package/dist_ts_tools_node/index.d.ts +5 -0
  95. package/dist_ts_tools_node/index.js +4 -0
  96. package/dist_ts_tools_node/plugins.d.ts +13 -0
  97. package/dist_ts_tools_node/plugins.js +13 -0
  98. package/dist_ts_tools_node/tool.context.d.ts +31 -0
  99. package/dist_ts_tools_node/tool.context.js +837 -0
  100. package/dist_ts_tools_node/tool.persistence.d.ts +15 -0
  101. package/dist_ts_tools_node/tool.persistence.js +129 -0
  102. package/dist_ts_tools_node/tools.local.d.ts +11 -0
  103. package/dist_ts_tools_node/tools.local.js +15 -0
  104. package/package.json +112 -4
  105. package/readme.md +122 -66
  106. package/ts/00_commitinfo_data.ts +1 -1
  107. package/ts/readme.md +122 -66
  108. package/ts_chat/classes.chatsession.ts +116 -0
  109. package/ts_chat/index.ts +8 -0
  110. package/ts_chat/interfaces.ts +64 -0
  111. package/ts_chat/plugins.ts +7 -0
  112. package/ts_chat/readme.md +49 -0
  113. package/ts_chat_cli/components.chatapp.ts +103 -0
  114. package/ts_chat_cli/components.inputarea.ts +29 -0
  115. package/ts_chat_cli/components.message.ts +48 -0
  116. package/ts_chat_cli/components.messagelist.ts +45 -0
  117. package/ts_chat_cli/components.statusbar.ts +31 -0
  118. package/ts_chat_cli/index.ts +2 -0
  119. package/ts_chat_cli/plugins.ts +21 -0
  120. package/ts_chat_cli/readme.md +40 -0
  121. package/ts_chat_cli/startchat.ts +34 -0
  122. package/ts_chat_web/flexchat-input.ts +184 -0
  123. package/ts_chat_web/flexchat-message.ts +185 -0
  124. package/ts_chat_web/flexchat-window.ts +416 -0
  125. package/ts_chat_web/index.ts +3 -0
  126. package/ts_chat_web/plugins.ts +9 -0
  127. package/ts_chat_web/readme.md +46 -0
  128. package/ts_compaction/index.ts +2 -0
  129. package/ts_compaction/plugins.ts +6 -0
  130. package/ts_compaction/readme.md +37 -0
  131. package/ts_compaction/smartagent.compaction.ts +59 -0
  132. package/ts_document/index.ts +82 -0
  133. package/ts_document/plugins.ts +3 -0
  134. package/ts_document/readme.md +49 -0
  135. package/ts_kvm/classes.browserkvm.ts +335 -0
  136. package/ts_kvm/classes.kvmterminal.ts +103 -0
  137. package/ts_kvm/commandwrappers.ts +83 -0
  138. package/ts_kvm/index.ts +6 -0
  139. package/ts_kvm/interfaces.ts +152 -0
  140. package/ts_kvm/ocr.ts +41 -0
  141. package/ts_kvm/plugins.ts +13 -0
  142. package/ts_kvm/readme.md +482 -0
  143. package/ts_kvm/tools.ts +58 -0
  144. package/ts_mcp/index.ts +470 -0
  145. package/ts_mcp/readme.md +37 -0
  146. package/ts_mcp/requestcontext.ts +66 -0
  147. package/ts_media/index.ts +29 -0
  148. package/ts_media/plugins.ts +2 -0
  149. package/ts_media/readme.md +37 -0
  150. package/ts_ocr/classes.imageocr.ts +53 -0
  151. package/ts_ocr/index.ts +2 -0
  152. package/ts_ocr/ocr.mistral.ts +192 -0
  153. package/ts_ocr/readme.md +48 -0
  154. package/ts_tools/index.ts +49 -0
  155. package/ts_tools/plugins.ts +7 -0
  156. package/ts_tools/readme.md +37 -0
  157. package/ts_tools/tool.browser.ts +159 -0
  158. package/ts_tools/tool.context.ts +23 -0
  159. package/ts_tools/tool.filesystem.ts +144 -0
  160. package/ts_tools/tool.http.ts +78 -0
  161. package/ts_tools/tool.json.ts +53 -0
  162. package/ts_tools/tool.shell.ts +418 -0
  163. package/ts_tools/utils.truncation.ts +39 -0
  164. package/ts_tools_node/index.ts +5 -0
  165. package/ts_tools_node/plugins.ts +16 -0
  166. package/ts_tools_node/readme.md +37 -0
  167. package/ts_tools_node/tool.context.ts +991 -0
  168. package/ts_tools_node/tool.persistence.ts +146 -0
  169. package/ts_tools_node/tools.local.ts +26 -0
@@ -0,0 +1,837 @@
1
+ import * as plugins from './plugins.js';
2
+ const DEFAULT_LOCAL_SHELL_MAX_OUTPUT_BYTES = 1024 * 1024;
3
+ const LOCAL_SHELL_KILL_GRACE_MS = 1000;
4
+ export const createLocalToolExecutionContext = (options = {}) => {
5
+ const cwd = options.cwd ?? process.cwd();
6
+ const rootDir = options.rootDir;
7
+ const additionalReadOnlyRoots = [...new Set((options.additionalReadOnlyRoots ?? []).map((rootDirArg, index) => {
8
+ if (typeof rootDirArg !== 'string' || !rootDirArg.trim()) {
9
+ throw new Error(`additionalReadOnlyRoots[${index}] must be a non-empty path.`);
10
+ }
11
+ return plugins.path.resolve(rootDirArg);
12
+ }))];
13
+ const maxShellOutputBytes = options.maxShellOutputBytes ?? DEFAULT_LOCAL_SHELL_MAX_OUTPUT_BYTES;
14
+ if (!Number.isSafeInteger(maxShellOutputBytes) || maxShellOutputBytes <= 0) {
15
+ throw new Error('maxShellOutputBytes must be a positive integer.');
16
+ }
17
+ const maxRetainedJobs = options.maxRetainedJobs ?? 100;
18
+ if (!Number.isSafeInteger(maxRetainedJobs) || maxRetainedJobs < 0) {
19
+ throw new Error('maxRetainedJobs must be a non-negative integer.');
20
+ }
21
+ const outputListenerTimeoutMs = options.outputListenerTimeoutMs ?? 30_000;
22
+ if (!Number.isSafeInteger(outputListenerTimeoutMs) || outputListenerTimeoutMs <= 0) {
23
+ throw new Error('outputListenerTimeoutMs must be a positive integer.');
24
+ }
25
+ const jobStoreOperationTimeoutMs = options.jobStoreOperationTimeoutMs
26
+ ?? outputListenerTimeoutMs;
27
+ if (!Number.isSafeInteger(jobStoreOperationTimeoutMs) || jobStoreOperationTimeoutMs <= 0) {
28
+ throw new Error('jobStoreOperationTimeoutMs must be a positive integer.');
29
+ }
30
+ const jobs = createLocalToolJobContext({
31
+ cwd,
32
+ rootDir,
33
+ maxOutputBytes: maxShellOutputBytes,
34
+ maxRetainedJobs,
35
+ jobStore: options.jobStore,
36
+ outputListenerTimeoutMs,
37
+ jobStoreOperationTimeoutMs,
38
+ settleOrphanedJob: options.settleOrphanedJob,
39
+ beforeOperation: options.beforeOperation,
40
+ abortSignal: options.abortSignal,
41
+ });
42
+ return {
43
+ cwd,
44
+ rootDir,
45
+ additionalReadOnlyRoots,
46
+ abortSignal: options.abortSignal,
47
+ requestPermission: options.requestPermission,
48
+ shell: {
49
+ run: (command, runOptions) => runLocalShellCommand(command, {
50
+ cwd: resolveLocalPath(runOptions?.cwd ?? cwd, rootDir),
51
+ timeoutMs: runOptions?.timeoutMs,
52
+ abortSignal: runOptions?.abortSignal ?? options.abortSignal,
53
+ onOutput: runOptions?.onOutput,
54
+ outputListenerTimeoutMs,
55
+ maxOutputBytes: maxShellOutputBytes,
56
+ beforeOperation: options.beforeOperation,
57
+ }),
58
+ runStructured: (command, runOptions) => runLocalStructuredCommand(command, {
59
+ cwd: resolveLocalPath(runOptions?.cwd ?? cwd, rootDir),
60
+ timeoutMs: runOptions?.timeoutMs,
61
+ abortSignal: runOptions?.abortSignal ?? options.abortSignal,
62
+ onOutput: runOptions?.onOutput,
63
+ outputListenerTimeoutMs,
64
+ maxOutputBytes: maxShellOutputBytes,
65
+ beforeOperation: options.beforeOperation,
66
+ }),
67
+ },
68
+ jobs,
69
+ fs: {
70
+ readFile: async (filePath, readOptions, invocationOptions) => {
71
+ const abortSignal = invocationOptions?.abortSignal ?? options.abortSignal;
72
+ throwIfAborted(abortSignal);
73
+ const resolved = resolveLocalReadPath(filePath, rootDir, cwd);
74
+ const readRoots = plugins.path.isAbsolute(filePath)
75
+ ? [...(rootDir ? [rootDir] : []), ...additionalReadOnlyRoots]
76
+ : rootDir
77
+ ? [rootDir]
78
+ : [];
79
+ const operationPath = readRoots.length > 0
80
+ ? await resolveCanonicalExistingLocalReadPath(resolved, filePath, readRoots)
81
+ : resolved;
82
+ await runBeforeLocalOperation(options.beforeOperation, abortSignal);
83
+ const content = await plugins.fs.promises.readFile(operationPath, 'utf8');
84
+ throwIfAborted(abortSignal);
85
+ if (readOptions?.startLine !== undefined || readOptions?.endLine !== undefined) {
86
+ const lines = content.split('\n');
87
+ const start = Math.max((readOptions.startLine ?? 1) - 1, 0);
88
+ const end = Math.max(readOptions.endLine ?? lines.length, start);
89
+ return lines.slice(start, end).join('\n');
90
+ }
91
+ return content;
92
+ },
93
+ writeFile: async (filePath, content, invocationOptions) => {
94
+ const abortSignal = invocationOptions?.abortSignal ?? options.abortSignal;
95
+ throwIfAborted(abortSignal);
96
+ const resolved = resolveLocalPath(filePath, rootDir, cwd);
97
+ const parentPath = plugins.path.dirname(resolved);
98
+ const canonicalBoundary = rootDir
99
+ ? {
100
+ rootDir,
101
+ canonicalRoot: await resolveCanonicalProspectivePath(plugins.path.resolve(rootDir)),
102
+ }
103
+ : undefined;
104
+ if (canonicalBoundary) {
105
+ const canonicalProspectiveParent = await resolveCanonicalProspectivePath(parentPath);
106
+ assertCanonicalPathAllowed(canonicalProspectiveParent, canonicalBoundary.canonicalRoot, filePath, canonicalBoundary.rootDir);
107
+ await assertExistingWriteTargetAllowed(resolved, canonicalBoundary.canonicalRoot, filePath, canonicalBoundary.rootDir);
108
+ }
109
+ await runBeforeLocalOperation(options.beforeOperation, abortSignal);
110
+ await plugins.fs.promises.mkdir(parentPath, { recursive: true });
111
+ throwIfAborted(abortSignal);
112
+ if (canonicalBoundary) {
113
+ const canonicalParent = await plugins.fs.promises.realpath(parentPath);
114
+ assertCanonicalPathAllowed(canonicalParent, canonicalBoundary.canonicalRoot, filePath, canonicalBoundary.rootDir);
115
+ await assertExistingWriteTargetAllowed(resolved, canonicalBoundary.canonicalRoot, filePath, canonicalBoundary.rootDir);
116
+ }
117
+ await plugins.fs.promises.writeFile(resolved, content, 'utf8');
118
+ throwIfAborted(abortSignal);
119
+ return `Written ${Buffer.byteLength(content, 'utf8')} bytes to ${filePath}`;
120
+ },
121
+ listDirectory: async (directoryPath, listOptions, invocationOptions) => {
122
+ const abortSignal = invocationOptions?.abortSignal ?? options.abortSignal;
123
+ throwIfAborted(abortSignal);
124
+ const resolved = resolveLocalReadPath(directoryPath, rootDir, cwd);
125
+ const readRoots = plugins.path.isAbsolute(directoryPath)
126
+ ? [...(rootDir ? [rootDir] : []), ...additionalReadOnlyRoots]
127
+ : rootDir
128
+ ? [rootDir]
129
+ : [];
130
+ const operationPath = readRoots.length > 0
131
+ ? await resolveCanonicalExistingLocalReadPath(resolved, directoryPath, readRoots)
132
+ : resolved;
133
+ await runBeforeLocalOperation(options.beforeOperation, abortSignal);
134
+ const result = await listLocalDirectory(operationPath, !!listOptions?.recursive, abortSignal);
135
+ throwIfAborted(abortSignal);
136
+ return result;
137
+ },
138
+ deletePath: async (targetPath, invocationOptions) => {
139
+ const abortSignal = invocationOptions?.abortSignal ?? options.abortSignal;
140
+ throwIfAborted(abortSignal);
141
+ const resolved = resolveLocalPath(targetPath, rootDir, cwd);
142
+ if (rootDir) {
143
+ await resolveCanonicalExistingLocalPath(resolved, targetPath, rootDir);
144
+ }
145
+ await runBeforeLocalOperation(options.beforeOperation, abortSignal);
146
+ await plugins.fs.promises.rm(resolved, { recursive: false, force: false });
147
+ throwIfAborted(abortSignal);
148
+ return `Deleted ${targetPath}`;
149
+ },
150
+ },
151
+ };
152
+ };
153
+ const resolveLocalPath = (targetPath, rootDir, baseDir) => {
154
+ const base = rootDir ?? baseDir ?? process.cwd();
155
+ const resolved = plugins.path.isAbsolute(targetPath)
156
+ ? plugins.path.resolve(targetPath)
157
+ : plugins.path.resolve(base, targetPath);
158
+ if (rootDir) {
159
+ const resolvedRoot = plugins.path.resolve(rootDir);
160
+ if (resolved !== resolvedRoot && !resolved.startsWith(resolvedRoot + plugins.path.sep)) {
161
+ throw new Error(`Access denied: "${targetPath}" is outside allowed root "${rootDir}"`);
162
+ }
163
+ }
164
+ return resolved;
165
+ };
166
+ const resolveLocalReadPath = (targetPath, rootDir, baseDir) => plugins.path.isAbsolute(targetPath)
167
+ ? plugins.path.resolve(targetPath)
168
+ : plugins.path.resolve(rootDir ?? baseDir ?? process.cwd(), targetPath);
169
+ const resolveCanonicalExistingLocalReadPath = async (resolvedPath, targetPath, readRoots) => {
170
+ const canonicalPath = await plugins.fs.promises.realpath(resolvedPath);
171
+ for (const readRoot of readRoots) {
172
+ const canonicalRoot = await resolveCanonicalProspectivePath(plugins.path.resolve(readRoot));
173
+ if (canonicalPathIsAllowed(canonicalPath, canonicalRoot))
174
+ return canonicalPath;
175
+ }
176
+ throw new Error(`Access denied: "${targetPath}" resolves outside allowed read roots.`);
177
+ };
178
+ const resolveCanonicalExistingLocalPath = async (resolvedPath, targetPath, rootDir) => {
179
+ const canonicalRoot = await resolveCanonicalProspectivePath(plugins.path.resolve(rootDir));
180
+ const canonicalPath = await plugins.fs.promises.realpath(resolvedPath);
181
+ assertCanonicalPathAllowed(canonicalPath, canonicalRoot, targetPath, rootDir);
182
+ return canonicalPath;
183
+ };
184
+ const resolveCanonicalProspectivePath = async (targetPath) => {
185
+ let existingAncestor = targetPath;
186
+ while (true) {
187
+ try {
188
+ const canonicalAncestor = await plugins.fs.promises.realpath(existingAncestor);
189
+ return plugins.path.resolve(canonicalAncestor, plugins.path.relative(existingAncestor, targetPath));
190
+ }
191
+ catch (error) {
192
+ const errorCode = error.code;
193
+ if (errorCode !== 'ENOENT' && errorCode !== 'ENOTDIR') {
194
+ throw error;
195
+ }
196
+ const parentPath = plugins.path.dirname(existingAncestor);
197
+ if (parentPath === existingAncestor) {
198
+ throw error;
199
+ }
200
+ existingAncestor = parentPath;
201
+ }
202
+ }
203
+ };
204
+ const assertExistingWriteTargetAllowed = async (resolvedPath, canonicalRoot, targetPath, rootDir) => {
205
+ try {
206
+ await plugins.fs.promises.lstat(resolvedPath);
207
+ }
208
+ catch (error) {
209
+ if (error.code === 'ENOENT') {
210
+ return;
211
+ }
212
+ throw error;
213
+ }
214
+ let canonicalTarget;
215
+ try {
216
+ canonicalTarget = await plugins.fs.promises.realpath(resolvedPath);
217
+ }
218
+ catch (error) {
219
+ if (error.code === 'ENOENT') {
220
+ throw createAccessDeniedError(targetPath, rootDir);
221
+ }
222
+ throw error;
223
+ }
224
+ assertCanonicalPathAllowed(canonicalTarget, canonicalRoot, targetPath, rootDir);
225
+ };
226
+ const assertCanonicalPathAllowed = (canonicalPath, canonicalRoot, targetPath, rootDir) => {
227
+ if (!canonicalPathIsAllowed(canonicalPath, canonicalRoot)) {
228
+ throw createAccessDeniedError(targetPath, rootDir);
229
+ }
230
+ };
231
+ const canonicalPathIsAllowed = (canonicalPath, canonicalRoot) => {
232
+ const relativePath = plugins.path.relative(canonicalRoot, canonicalPath);
233
+ return relativePath !== '..'
234
+ && !relativePath.startsWith(`..${plugins.path.sep}`)
235
+ && !plugins.path.isAbsolute(relativePath);
236
+ };
237
+ const createAccessDeniedError = (targetPath, rootDir) => new Error(`Access denied: "${targetPath}" resolves outside canonical root "${rootDir}"`);
238
+ const throwIfAborted = (abortSignal) => {
239
+ abortSignal?.throwIfAborted();
240
+ };
241
+ const runBeforeLocalOperation = async (beforeOperation, abortSignal) => {
242
+ throwIfAborted(abortSignal);
243
+ if (!beforeOperation)
244
+ return;
245
+ const guardPromise = Promise.resolve().then(() => beforeOperation());
246
+ void guardPromise.catch(() => undefined);
247
+ if (!abortSignal) {
248
+ await guardPromise;
249
+ return;
250
+ }
251
+ let onAbort;
252
+ const aborted = new Promise((_resolve, reject) => {
253
+ onAbort = () => reject(abortSignal.reason ?? new DOMException('Local operation aborted', 'AbortError'));
254
+ abortSignal.addEventListener('abort', onAbort, { once: true });
255
+ if (abortSignal.aborted)
256
+ onAbort();
257
+ });
258
+ try {
259
+ await Promise.race([guardPromise, aborted]);
260
+ }
261
+ finally {
262
+ abortSignal.removeEventListener('abort', onAbort);
263
+ }
264
+ throwIfAborted(abortSignal);
265
+ };
266
+ const listLocalDirectory = async (directoryPath, recursive, abortSignal) => {
267
+ throwIfAborted(abortSignal);
268
+ const entries = await plugins.fs.promises.readdir(directoryPath, { withFileTypes: true });
269
+ throwIfAborted(abortSignal);
270
+ const result = [];
271
+ for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
272
+ throwIfAborted(abortSignal);
273
+ const relativePath = entry.name + (entry.isDirectory() ? '/' : '');
274
+ result.push(relativePath);
275
+ if (recursive && entry.isDirectory()) {
276
+ const childEntries = await listLocalDirectory(plugins.path.join(directoryPath, entry.name), true, abortSignal);
277
+ result.push(...childEntries.map((childEntry) => `${entry.name}/${childEntry}`));
278
+ }
279
+ }
280
+ throwIfAborted(abortSignal);
281
+ return result;
282
+ };
283
+ /** @internal */
284
+ export const handleLocalShellChildError = (error, childPid, handlers) => {
285
+ if (childPid === undefined) {
286
+ handlers.settleSpawnFailure(error);
287
+ return;
288
+ }
289
+ handlers.retainError(error);
290
+ handlers.requestTermination();
291
+ };
292
+ const runLocalShellCommand = async (command, options) => runLocalProcessCommand(command, options);
293
+ const runLocalStructuredCommand = async (command, options) => {
294
+ validateLocalStructuredCommand(command);
295
+ return runLocalProcessCommand(command, options);
296
+ };
297
+ const validateLocalStructuredCommand = (command) => {
298
+ if (!command.executable.trim())
299
+ throw new Error('Structured shell executable must not be empty.');
300
+ if (!command.args.every((argument) => typeof argument === 'string')) {
301
+ throw new Error('Structured shell arguments must all be strings.');
302
+ }
303
+ };
304
+ const runLocalProcessCommand = async (command, options) => {
305
+ if (options.beforeOperation) {
306
+ await runBeforeLocalOperation(options.beforeOperation, options.abortSignal);
307
+ }
308
+ else {
309
+ throwIfAborted(options.abortSignal);
310
+ }
311
+ return new Promise((resolve) => {
312
+ const ownsProcessGroup = process.platform !== 'win32';
313
+ const executable = typeof command === 'string' ? 'bash' : command.executable;
314
+ const args = typeof command === 'string' ? ['-lc', command] : command.args;
315
+ const child = plugins.childProcess.spawn(executable, args, {
316
+ cwd: options.cwd,
317
+ detached: ownsProcessGroup,
318
+ shell: false,
319
+ stdio: ['ignore', 'pipe', 'pipe'],
320
+ });
321
+ const stdoutChunks = [];
322
+ const stderrChunks = [];
323
+ let capturedBytes = 0;
324
+ let settled = false;
325
+ let terminationReason;
326
+ let childError;
327
+ let signalError;
328
+ let outputListenerError;
329
+ let outputQueue = Promise.resolve();
330
+ const outputAbortController = new AbortController();
331
+ const outputDecoders = {
332
+ stdout: new plugins.StringDecoder('utf8'),
333
+ stderr: new plugins.StringDecoder('utf8'),
334
+ };
335
+ let killTimer;
336
+ const timeoutTimer = options.timeoutMs && options.timeoutMs > 0
337
+ ? setTimeout(() => requestTermination('timeout'), options.timeoutMs)
338
+ : undefined;
339
+ const signalProcess = (signal) => {
340
+ if (child.pid === undefined)
341
+ return;
342
+ if (ownsProcessGroup) {
343
+ try {
344
+ process.kill(-child.pid, signal);
345
+ return;
346
+ }
347
+ catch (error) {
348
+ if (error.code === 'ESRCH')
349
+ return;
350
+ signalError = error;
351
+ }
352
+ }
353
+ try {
354
+ child.kill(signal);
355
+ }
356
+ catch (error) {
357
+ if (error.code !== 'ESRCH') {
358
+ signalError = error;
359
+ }
360
+ }
361
+ };
362
+ function requestTermination(reason) {
363
+ if (terminationReason)
364
+ return;
365
+ terminationReason = reason;
366
+ outputAbortController.abort(new Error(`Command output delivery stopped because the command is terminating (${reason}).`));
367
+ signalProcess('SIGTERM');
368
+ killTimer = setTimeout(() => signalProcess('SIGKILL'), LOCAL_SHELL_KILL_GRACE_MS);
369
+ }
370
+ const onAbort = () => requestTermination('abort');
371
+ const deliverOutput = async (stream, text) => {
372
+ const listenerPromise = Promise.resolve(options.onOutput(stream, text));
373
+ void listenerPromise.catch(() => undefined);
374
+ let timeoutTimer;
375
+ let onOutputAbort;
376
+ const aborted = new Promise((_resolve, reject) => {
377
+ onOutputAbort = () => reject(outputAbortController.signal.reason);
378
+ outputAbortController.signal.addEventListener('abort', onOutputAbort, { once: true });
379
+ if (outputAbortController.signal.aborted)
380
+ onOutputAbort();
381
+ });
382
+ const timeout = options.outputListenerTimeoutMs === undefined
383
+ ? undefined
384
+ : new Promise((_resolve, reject) => {
385
+ timeoutTimer = setTimeout(() => reject(new Error(`Command output listener timed out after ${options.outputListenerTimeoutMs}ms.`)), options.outputListenerTimeoutMs);
386
+ });
387
+ try {
388
+ await Promise.race([listenerPromise, aborted, ...(timeout ? [timeout] : [])]);
389
+ }
390
+ finally {
391
+ if (timeoutTimer)
392
+ clearTimeout(timeoutTimer);
393
+ outputAbortController.signal.removeEventListener('abort', onOutputAbort);
394
+ }
395
+ };
396
+ const enqueueOutput = (stream, source, text) => {
397
+ if (!text || !options.onOutput)
398
+ return;
399
+ source?.pause();
400
+ outputQueue = outputQueue
401
+ .then(() => outputListenerError ? undefined : deliverOutput(stream, text))
402
+ .catch((error) => {
403
+ outputListenerError = error instanceof Error ? error : new Error(String(error));
404
+ requestTermination('output-listener');
405
+ })
406
+ .finally(() => source?.resume());
407
+ };
408
+ const captureChunk = (stream, chunks, source, chunk) => {
409
+ const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
410
+ const remainingBytes = Math.max(options.maxOutputBytes - capturedBytes, 0);
411
+ if (remainingBytes > 0) {
412
+ const capturedChunk = chunkBuffer.subarray(0, remainingBytes);
413
+ chunks.push(capturedChunk);
414
+ capturedBytes += capturedChunk.byteLength;
415
+ enqueueOutput(stream, source, outputDecoders[stream].write(capturedChunk));
416
+ }
417
+ if (chunkBuffer.byteLength > remainingBytes) {
418
+ requestTermination('output-limit');
419
+ }
420
+ };
421
+ const onStdout = (chunk) => captureChunk('stdout', stdoutChunks, child.stdout, chunk);
422
+ const onStderr = (chunk) => captureChunk('stderr', stderrChunks, child.stderr, chunk);
423
+ const cleanup = () => {
424
+ if (timeoutTimer)
425
+ clearTimeout(timeoutTimer);
426
+ if (killTimer)
427
+ clearTimeout(killTimer);
428
+ options.abortSignal?.removeEventListener('abort', onAbort);
429
+ child.stdout?.removeListener('data', onStdout);
430
+ child.stderr?.removeListener('data', onStderr);
431
+ child.removeListener('error', onChildError);
432
+ child.removeListener('exit', onChildExit);
433
+ child.removeListener('close', onChildClose);
434
+ };
435
+ const settle = (result) => {
436
+ if (settled)
437
+ return;
438
+ settled = true;
439
+ cleanup();
440
+ resolve(result);
441
+ };
442
+ const buildOutput = () => ({
443
+ stdout: Buffer.concat(stdoutChunks).toString('utf8'),
444
+ stderr: Buffer.concat(stderrChunks).toString('utf8'),
445
+ });
446
+ function onChildError(error) {
447
+ handleLocalShellChildError(error, child.pid, {
448
+ settleSpawnFailure: (spawnError) => {
449
+ const output = buildOutput();
450
+ settle({
451
+ exitCode: 1,
452
+ stdout: output.stdout,
453
+ stderr: `${output.stderr}${spawnError.message}`,
454
+ });
455
+ },
456
+ retainError: (processError) => {
457
+ childError = processError;
458
+ },
459
+ requestTermination: () => requestTermination('error'),
460
+ });
461
+ }
462
+ function onChildExit() {
463
+ if (ownsProcessGroup)
464
+ signalProcess('SIGKILL');
465
+ }
466
+ async function finishChildClose(code, signal) {
467
+ enqueueOutput('stdout', child.stdout, outputDecoders.stdout.end());
468
+ enqueueOutput('stderr', child.stderr, outputDecoders.stderr.end());
469
+ // Process outcome is fixed at close. Later aborts/timeouts must not reclassify it while
470
+ // already-received output finishes its bounded listener delivery.
471
+ if (timeoutTimer)
472
+ clearTimeout(timeoutTimer);
473
+ if (killTimer)
474
+ clearTimeout(killTimer);
475
+ options.abortSignal?.removeEventListener('abort', onAbort);
476
+ await outputQueue;
477
+ if (terminationReason) {
478
+ signalProcess('SIGKILL');
479
+ }
480
+ const output = buildOutput();
481
+ const statusMessage = terminationReason === 'timeout'
482
+ ? `Command timed out after ${options.timeoutMs}ms.`
483
+ : terminationReason === 'output-limit'
484
+ ? `Command output exceeded the local limit of ${options.maxOutputBytes} bytes and was terminated.`
485
+ : terminationReason === 'output-listener'
486
+ ? `Command output listener failed and the command was terminated: ${outputListenerError?.message ?? 'unknown listener error'}`
487
+ : terminationReason === 'abort'
488
+ ? 'Command was aborted.'
489
+ : '';
490
+ const signalErrorMessage = signalError ? `Failed to signal command process: ${signalError.message}` : '';
491
+ const childErrorMessage = childError ? `Command process error: ${childError.message}` : '';
492
+ settle({
493
+ exitCode: terminationReason === 'timeout'
494
+ ? 124
495
+ : terminationReason === 'abort'
496
+ ? 130
497
+ : terminationReason === 'output-limit'
498
+ ? 1
499
+ : terminationReason === 'output-listener'
500
+ ? 1
501
+ : terminationReason === 'error'
502
+ ? 1
503
+ : code ?? 1,
504
+ stdout: output.stdout,
505
+ stderr: [output.stderr, statusMessage, childErrorMessage, signalErrorMessage].filter(Boolean).join('\n').trim(),
506
+ signal: signal ?? undefined,
507
+ });
508
+ }
509
+ function onChildClose(code, signal) {
510
+ void finishChildClose(code, signal);
511
+ }
512
+ options.abortSignal?.addEventListener('abort', onAbort, { once: true });
513
+ if (options.abortSignal?.aborted)
514
+ onAbort();
515
+ child.stdout?.on('data', onStdout);
516
+ child.stderr?.on('data', onStderr);
517
+ child.once('error', onChildError);
518
+ child.once('exit', onChildExit);
519
+ child.once('close', onChildClose);
520
+ });
521
+ };
522
+ const assertOrphanSettlement = (persistedJob, settledJob) => {
523
+ if (!settledJob
524
+ || settledJob.executionId !== persistedJob.executionId
525
+ || settledJob.type !== persistedJob.type
526
+ || !['finished', 'failed', 'aborted'].includes(settledJob.state)) {
527
+ throw new Error(`Orphan settlement for background execution "${persistedJob.executionId}" must return a terminal state with the same executionId and type.`);
528
+ }
529
+ };
530
+ const createLocalToolJobContext = (options) => {
531
+ const states = new Map();
532
+ const controllers = new Map();
533
+ const completions = new Map();
534
+ const terminalExecutionIds = [];
535
+ const listeners = new Set();
536
+ let persistenceRevision = 0;
537
+ let persistenceError;
538
+ let persistenceQueue = Promise.resolve();
539
+ const reportListenerError = (error) => {
540
+ process.emitWarning(error instanceof Error ? error : String(error), {
541
+ code: 'SMARTAGENT_JOB_LISTENER_ERROR',
542
+ });
543
+ };
544
+ const runJobStoreOperation = async (operation) => {
545
+ const controller = new AbortController();
546
+ const timeoutError = new Error(`Job store operation timed out after ${options.jobStoreOperationTimeoutMs}ms.`);
547
+ let timer;
548
+ const operationPromise = Promise.resolve().then(() => operation(controller.signal));
549
+ const timeoutPromise = new Promise((_resolve, reject) => {
550
+ timer = setTimeout(() => {
551
+ controller.abort(timeoutError);
552
+ reject(timeoutError);
553
+ }, options.jobStoreOperationTimeoutMs);
554
+ });
555
+ try {
556
+ return await Promise.race([operationPromise, timeoutPromise]);
557
+ }
558
+ finally {
559
+ if (timer)
560
+ clearTimeout(timer);
561
+ }
562
+ };
563
+ const persist = () => {
564
+ if (!options.jobStore)
565
+ return Promise.resolve();
566
+ const snapshot = structuredClone([...states.values()]);
567
+ const operation = persistenceQueue.then(async () => {
568
+ if (persistenceError !== undefined)
569
+ throw persistenceError;
570
+ persistenceRevision = await runJobStoreOperation((abortSignal) => options.jobStore.save(snapshot, persistenceRevision, abortSignal));
571
+ });
572
+ persistenceQueue = operation.catch((error) => {
573
+ persistenceError ??= error;
574
+ });
575
+ return operation;
576
+ };
577
+ const flushPersistence = async () => {
578
+ if (persistenceError !== undefined)
579
+ throw persistenceError;
580
+ await persistenceQueue;
581
+ if (persistenceError !== undefined)
582
+ throw persistenceError;
583
+ };
584
+ const emitLifecycle = (event) => {
585
+ for (const listener of [...listeners]) {
586
+ try {
587
+ const result = listener(event);
588
+ if (result && typeof result.then === 'function') {
589
+ void result.catch(reportListenerError);
590
+ }
591
+ }
592
+ catch (error) {
593
+ reportListenerError(error);
594
+ }
595
+ }
596
+ };
597
+ const emitOutput = async (event) => {
598
+ for (const listener of [...listeners]) {
599
+ let timer;
600
+ try {
601
+ await Promise.race([
602
+ Promise.resolve().then(() => listener(event)),
603
+ new Promise((_resolve, reject) => {
604
+ timer = setTimeout(() => reject(new Error(`Job output listener timed out after ${options.outputListenerTimeoutMs}ms.`)), options.outputListenerTimeoutMs);
605
+ }),
606
+ ]);
607
+ }
608
+ finally {
609
+ if (timer)
610
+ clearTimeout(timer);
611
+ }
612
+ }
613
+ };
614
+ const ready = (async () => {
615
+ const snapshot = options.jobStore
616
+ ? await runJobStoreOperation((abortSignal) => options.jobStore.load(abortSignal))
617
+ : undefined;
618
+ if (!snapshot)
619
+ return;
620
+ persistenceRevision = snapshot.revision;
621
+ let changed = false;
622
+ for (const restoredState of snapshot.jobs) {
623
+ let state = structuredClone(restoredState);
624
+ if (state.state === 'running') {
625
+ if (options.settleOrphanedJob) {
626
+ const settledState = await runJobStoreOperation(async (abortSignal) => options.settleOrphanedJob(structuredClone(state), abortSignal));
627
+ assertOrphanSettlement(state, settledState);
628
+ state = structuredClone(settledState);
629
+ }
630
+ else {
631
+ const now = Date.now();
632
+ state.state = 'failed';
633
+ state.exitCode = null;
634
+ state.stderr = [state.stderr, 'Background execution was interrupted by a host restart.']
635
+ .filter(Boolean)
636
+ .join('\n');
637
+ state.updatedAt = now;
638
+ state.finishedAt = now;
639
+ }
640
+ changed = true;
641
+ }
642
+ states.set(state.executionId, state);
643
+ terminalExecutionIds.push(state.executionId);
644
+ }
645
+ while (terminalExecutionIds.length > options.maxRetainedJobs) {
646
+ const expiredExecutionId = terminalExecutionIds.shift();
647
+ if (expiredExecutionId) {
648
+ states.delete(expiredExecutionId);
649
+ changed = true;
650
+ }
651
+ }
652
+ if (changed)
653
+ await persist();
654
+ })();
655
+ return {
656
+ start: async (request, invocationOptions) => {
657
+ await ready;
658
+ await flushPersistence();
659
+ const operationAbortSignal = invocationOptions?.abortSignal ?? options.abortSignal;
660
+ const clonedRequest = structuredClone(request);
661
+ if (clonedRequest.type !== 'shell' || !clonedRequest.command) {
662
+ throw new Error('The local job context only supports structured shell jobs.');
663
+ }
664
+ validateLocalStructuredCommand(clonedRequest.command);
665
+ const commandCwd = resolveLocalPath(clonedRequest.cwd ?? options.cwd, options.rootDir);
666
+ await runBeforeLocalOperation(options.beforeOperation, operationAbortSignal);
667
+ const executionId = `shell_${plugins.crypto.randomUUID()}`;
668
+ const startedAt = Date.now();
669
+ const runningState = {
670
+ executionId,
671
+ type: 'shell',
672
+ state: 'running',
673
+ request: clonedRequest,
674
+ stdout: '',
675
+ stderr: '',
676
+ startedAt,
677
+ updatedAt: startedAt,
678
+ };
679
+ const startedEvent = structuredClone({
680
+ type: 'started',
681
+ job: runningState,
682
+ });
683
+ const controller = new AbortController();
684
+ states.set(executionId, runningState);
685
+ controllers.set(executionId, controller);
686
+ try {
687
+ await persist();
688
+ }
689
+ catch (error) {
690
+ states.delete(executionId);
691
+ controllers.delete(executionId);
692
+ throw error;
693
+ }
694
+ try {
695
+ throwIfAborted(operationAbortSignal);
696
+ }
697
+ catch (error) {
698
+ states.delete(executionId);
699
+ controllers.delete(executionId);
700
+ try {
701
+ await persist();
702
+ }
703
+ catch (rollbackError) {
704
+ process.emitWarning(rollbackError instanceof Error ? rollbackError : String(rollbackError), { code: 'SMARTAGENT_JOB_ADMISSION_ROLLBACK_ERROR' });
705
+ }
706
+ throw error;
707
+ }
708
+ let outputSequence = 0;
709
+ let outputPersistenceFailed = false;
710
+ let resolveProcessResult;
711
+ let rejectProcessResult;
712
+ const processResult = new Promise((resolve, reject) => {
713
+ resolveProcessResult = resolve;
714
+ rejectProcessResult = reject;
715
+ });
716
+ const completion = (async () => {
717
+ let terminalState;
718
+ try {
719
+ const result = await processResult;
720
+ const finishedAt = Date.now();
721
+ terminalState = {
722
+ executionId,
723
+ type: 'shell',
724
+ state: controller.signal.aborted
725
+ ? 'aborted'
726
+ : result.exitCode === 0
727
+ ? 'finished'
728
+ : 'failed',
729
+ request: clonedRequest,
730
+ exitCode: result.exitCode,
731
+ stdout: result.stdout,
732
+ stderr: result.stderr ?? '',
733
+ signal: result.signal,
734
+ startedAt,
735
+ updatedAt: finishedAt,
736
+ finishedAt,
737
+ };
738
+ }
739
+ catch (error) {
740
+ const finishedAt = Date.now();
741
+ terminalState = {
742
+ executionId,
743
+ type: 'shell',
744
+ state: controller.signal.aborted ? 'aborted' : 'failed',
745
+ request: clonedRequest,
746
+ exitCode: null,
747
+ stdout: states.get(executionId)?.stdout ?? '',
748
+ stderr: [
749
+ states.get(executionId)?.stderr,
750
+ error instanceof Error ? error.message : String(error),
751
+ ].filter(Boolean).join('\n'),
752
+ startedAt,
753
+ updatedAt: finishedAt,
754
+ finishedAt,
755
+ };
756
+ }
757
+ states.set(executionId, terminalState);
758
+ controllers.delete(executionId);
759
+ completions.delete(executionId);
760
+ terminalExecutionIds.push(executionId);
761
+ while (terminalExecutionIds.length > options.maxRetainedJobs) {
762
+ const expiredExecutionId = terminalExecutionIds.shift();
763
+ if (expiredExecutionId)
764
+ states.delete(expiredExecutionId);
765
+ }
766
+ if (!outputPersistenceFailed)
767
+ await persist();
768
+ emitLifecycle({ type: 'finished', job: structuredClone(terminalState) });
769
+ return terminalState;
770
+ })();
771
+ completions.set(executionId, completion);
772
+ const handle = { executionId, state: 'running', completion };
773
+ const processCompletion = runLocalProcessCommand(clonedRequest.command, {
774
+ cwd: commandCwd,
775
+ timeoutMs: clonedRequest.timeoutMs,
776
+ abortSignal: controller.signal,
777
+ maxOutputBytes: options.maxOutputBytes,
778
+ onOutput: async (stream, chunk) => {
779
+ const state = states.get(executionId);
780
+ if (!state || state.state !== 'running')
781
+ return;
782
+ if (stream === 'stdout')
783
+ state.stdout = `${state.stdout ?? ''}${chunk}`;
784
+ else
785
+ state.stderr = `${state.stderr ?? ''}${chunk}`;
786
+ state.updatedAt = Date.now();
787
+ try {
788
+ await persist();
789
+ }
790
+ catch (error) {
791
+ outputPersistenceFailed = true;
792
+ persistenceError ??= error;
793
+ throw error;
794
+ }
795
+ await emitOutput({
796
+ type: 'output',
797
+ job: structuredClone(state),
798
+ stream,
799
+ chunk,
800
+ sequence: ++outputSequence,
801
+ });
802
+ },
803
+ });
804
+ void processCompletion.then(resolveProcessResult, rejectProcessResult);
805
+ emitLifecycle(startedEvent);
806
+ return handle;
807
+ },
808
+ get: async (executionId) => {
809
+ await ready;
810
+ await flushPersistence();
811
+ const state = states.get(executionId);
812
+ if (!state)
813
+ throw new Error(`Unknown background execution "${executionId}".`);
814
+ return structuredClone(state);
815
+ },
816
+ list: async () => {
817
+ await ready;
818
+ await flushPersistence();
819
+ return structuredClone([...states.values()]);
820
+ },
821
+ abort: async (executionId) => {
822
+ await ready;
823
+ const state = states.get(executionId);
824
+ if (!state)
825
+ throw new Error(`Unknown background execution "${executionId}".`);
826
+ if (state.state !== 'running')
827
+ return;
828
+ controllers.get(executionId)?.abort(new DOMException('Background execution aborted', 'AbortError'));
829
+ await completions.get(executionId);
830
+ },
831
+ subscribe: (listener) => {
832
+ listeners.add(listener);
833
+ return () => listeners.delete(listener);
834
+ },
835
+ };
836
+ };
837
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC5jb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfdG9vbHNfbm9kZS90b29sLmNvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUE4QnhDLE1BQU0sb0NBQW9DLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN6RCxNQUFNLHlCQUF5QixHQUFHLElBQUksQ0FBQztBQUV2QyxNQUFNLENBQUMsTUFBTSwrQkFBK0IsR0FBRyxDQUFDLFVBQTZDLEVBQUUsRUFBeUIsRUFBRTtJQUN4SCxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN6QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBQ2hDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLHVCQUF1QixJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FDckYsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDcEIsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFDekQsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsS0FBSyw2QkFBNkIsQ0FBQyxDQUFDO1lBQ2pGLENBQUM7WUFDRCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FDRixDQUFDLENBQUMsQ0FBQztJQUNKLE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixJQUFJLG9DQUFvQyxDQUFDO0lBQ2hHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLElBQUksbUJBQW1CLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDM0Us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