@nocobase/app-plugin-agents 1.0.0-beta.16 → 1.0.0-beta.18

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 (207) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +32 -21
  3. package/dist/client/chat/api.d.ts +1 -1
  4. package/dist/client/chat/api.d.ts.map +1 -1
  5. package/dist/client/chat/api.js +2 -2
  6. package/dist/client/chat/api.js.map +1 -1
  7. package/dist/client/chat/keys.d.ts +1 -0
  8. package/dist/client/chat/keys.d.ts.map +1 -1
  9. package/dist/client/chat/keys.js +1 -0
  10. package/dist/client/chat/keys.js.map +1 -1
  11. package/dist/client/chat/provider.d.ts +10 -4
  12. package/dist/client/chat/provider.d.ts.map +1 -1
  13. package/dist/client/chat/provider.js +86 -15
  14. package/dist/client/chat/provider.js.map +1 -1
  15. package/dist/client/chat/use-chat.d.ts +3 -1
  16. package/dist/client/chat/use-chat.d.ts.map +1 -1
  17. package/dist/client/chat/use-chat.js +2 -2
  18. package/dist/client/chat/use-chat.js.map +1 -1
  19. package/dist/client/chat/use-conversation-model.d.ts +12 -0
  20. package/dist/client/chat/use-conversation-model.d.ts.map +1 -0
  21. package/dist/client/chat/use-conversation-model.js +64 -0
  22. package/dist/client/chat/use-conversation-model.js.map +1 -0
  23. package/dist/client/chat.d.ts +1 -0
  24. package/dist/client/chat.d.ts.map +1 -1
  25. package/dist/client/chat.js +1 -0
  26. package/dist/client/chat.js.map +1 -1
  27. package/dist/client/model-suggestion.d.ts.map +1 -1
  28. package/dist/client/model-suggestion.js +4 -2
  29. package/dist/client/model-suggestion.js.map +1 -1
  30. package/dist/client/pages/usage/index.d.ts.map +1 -1
  31. package/dist/client/pages/usage/index.js +17 -5
  32. package/dist/client/pages/usage/index.js.map +1 -1
  33. package/dist/client/pages/usage/prices/model.d.ts +4 -4
  34. package/dist/client/pages/usage/prices/model.d.ts.map +1 -1
  35. package/dist/client/pages/usage/prices/model.js +2 -2
  36. package/dist/client/pages/usage/prices/model.js.map +1 -1
  37. package/dist/client/pages/usage/prices/price-cells.js +2 -2
  38. package/dist/client/pages/usage/prices/price-cells.js.map +1 -1
  39. package/dist/client/pages/usage/prices/prices-section.d.ts.map +1 -1
  40. package/dist/client/pages/usage/prices/prices-section.js +13 -13
  41. package/dist/client/pages/usage/prices/prices-section.js.map +1 -1
  42. package/dist/package.json +5 -2
  43. package/dist/server/cli/online-credential.d.ts +16 -0
  44. package/dist/server/cli/online-credential.d.ts.map +1 -0
  45. package/dist/server/cli/online-credential.js +51 -0
  46. package/dist/server/cli/online-credential.js.map +1 -0
  47. package/dist/server/cli/run-credential.d.ts +2 -0
  48. package/dist/server/cli/run-credential.d.ts.map +1 -1
  49. package/dist/server/cli/run-credential.js +12 -1
  50. package/dist/server/cli/run-credential.js.map +1 -1
  51. package/dist/server/cli/surface.js +2 -2
  52. package/dist/server/cli/surface.js.map +1 -1
  53. package/dist/server/composition.d.ts +2 -0
  54. package/dist/server/composition.d.ts.map +1 -1
  55. package/dist/server/composition.js +25 -4
  56. package/dist/server/composition.js.map +1 -1
  57. package/dist/server/core/agents/agent.service.d.ts +5 -0
  58. package/dist/server/core/agents/agent.service.d.ts.map +1 -1
  59. package/dist/server/core/agents/agent.service.js +6 -1
  60. package/dist/server/core/agents/agent.service.js.map +1 -1
  61. package/dist/server/core/agents/agent.views.d.ts +2 -0
  62. package/dist/server/core/agents/agent.views.d.ts.map +1 -1
  63. package/dist/server/core/agents/agent.views.js +4 -3
  64. package/dist/server/core/agents/agent.views.js.map +1 -1
  65. package/dist/server/core/brief/brief.js +1 -1
  66. package/dist/server/core/brief/brief.js.map +1 -1
  67. package/dist/server/core/conversations/chat-settings.d.ts +1 -0
  68. package/dist/server/core/conversations/chat-settings.d.ts.map +1 -1
  69. package/dist/server/core/conversations/chat-settings.js +71 -57
  70. package/dist/server/core/conversations/chat-settings.js.map +1 -1
  71. package/dist/server/core/conversations/conversation.service.d.ts.map +1 -1
  72. package/dist/server/core/conversations/conversation.service.js +3 -4
  73. package/dist/server/core/conversations/conversation.service.js.map +1 -1
  74. package/dist/server/core/reports/report.service.d.ts +1 -0
  75. package/dist/server/core/reports/report.service.d.ts.map +1 -1
  76. package/dist/server/core/reports/report.service.js +5 -2
  77. package/dist/server/core/reports/report.service.js.map +1 -1
  78. package/dist/server/core/runs/claim.d.ts +3 -1
  79. package/dist/server/core/runs/claim.d.ts.map +1 -1
  80. package/dist/server/core/runs/claim.js +370 -60
  81. package/dist/server/core/runs/claim.js.map +1 -1
  82. package/dist/server/core/runs/extensions.d.ts +22 -2
  83. package/dist/server/core/runs/extensions.d.ts.map +1 -1
  84. package/dist/server/core/runs/extensions.js +21 -2
  85. package/dist/server/core/runs/extensions.js.map +1 -1
  86. package/dist/server/core/runs/git-credentials.d.ts +5 -1
  87. package/dist/server/core/runs/git-credentials.d.ts.map +1 -1
  88. package/dist/server/core/runs/git-credentials.js +15 -2
  89. package/dist/server/core/runs/git-credentials.js.map +1 -1
  90. package/dist/server/core/runs/lifecycle.d.ts.map +1 -1
  91. package/dist/server/core/runs/lifecycle.js +9 -5
  92. package/dist/server/core/runs/lifecycle.js.map +1 -1
  93. package/dist/server/core/runs/runner-affinity.d.ts +6 -0
  94. package/dist/server/core/runs/runner-affinity.d.ts.map +1 -0
  95. package/dist/server/core/runs/runner-affinity.js +16 -0
  96. package/dist/server/core/runs/runner-affinity.js.map +1 -0
  97. package/dist/server/core/skills/skill.service.d.ts +2 -0
  98. package/dist/server/core/skills/skill.service.d.ts.map +1 -1
  99. package/dist/server/core/skills/skill.service.js +1 -0
  100. package/dist/server/core/skills/skill.service.js.map +1 -1
  101. package/dist/server/jobs/job.service.d.ts.map +1 -1
  102. package/dist/server/jobs/job.service.js +7 -4
  103. package/dist/server/jobs/job.service.js.map +1 -1
  104. package/dist/server/kernel/values.d.ts +5 -0
  105. package/dist/server/kernel/values.d.ts.map +1 -1
  106. package/dist/server/kernel/values.js +19 -0
  107. package/dist/server/kernel/values.js.map +1 -1
  108. package/dist/server/online/agent/configuration.d.ts +2 -2
  109. package/dist/server/online/agent/configuration.d.ts.map +1 -1
  110. package/dist/server/online/agent/configuration.js +21 -7
  111. package/dist/server/online/agent/configuration.js.map +1 -1
  112. package/dist/server/online/agent/index.d.ts +2 -1
  113. package/dist/server/online/agent/index.d.ts.map +1 -1
  114. package/dist/server/online/agent/index.js.map +1 -1
  115. package/dist/server/online/agent/native/backend.d.ts +2 -0
  116. package/dist/server/online/agent/native/backend.d.ts.map +1 -1
  117. package/dist/server/online/agent/native/backend.js +14 -12
  118. package/dist/server/online/agent/native/backend.js.map +1 -1
  119. package/dist/server/online/agent/native/execution.d.ts +2 -0
  120. package/dist/server/online/agent/native/execution.d.ts.map +1 -1
  121. package/dist/server/online/agent/native/execution.js +51 -22
  122. package/dist/server/online/agent/native/execution.js.map +1 -1
  123. package/dist/server/online/agent/native/types.d.ts +6 -0
  124. package/dist/server/online/agent/native/types.d.ts.map +1 -1
  125. package/dist/server/online/agent/runner/backend.d.ts.map +1 -1
  126. package/dist/server/online/agent/runner/backend.js +4 -3
  127. package/dist/server/online/agent/runner/backend.js.map +1 -1
  128. package/dist/server/online/agent/service.d.ts +2 -0
  129. package/dist/server/online/agent/service.d.ts.map +1 -1
  130. package/dist/server/online/agent/service.js +3 -1
  131. package/dist/server/online/agent/service.js.map +1 -1
  132. package/dist/server/online/agent/types.d.ts +15 -1
  133. package/dist/server/online/agent/types.d.ts.map +1 -1
  134. package/dist/server/online/sandbox/cli-command.d.ts +6 -0
  135. package/dist/server/online/sandbox/cli-command.d.ts.map +1 -0
  136. package/dist/server/online/sandbox/cli-command.js +370 -0
  137. package/dist/server/online/sandbox/cli-command.js.map +1 -0
  138. package/dist/server/online/sandbox/execution.d.ts +25 -0
  139. package/dist/server/online/sandbox/execution.d.ts.map +1 -0
  140. package/dist/server/online/sandbox/execution.js +63 -0
  141. package/dist/server/online/sandbox/execution.js.map +1 -0
  142. package/dist/server/online/sandbox/filesystem.d.ts +8 -0
  143. package/dist/server/online/sandbox/filesystem.d.ts.map +1 -0
  144. package/dist/server/online/sandbox/filesystem.js +72 -0
  145. package/dist/server/online/sandbox/filesystem.js.map +1 -0
  146. package/dist/server/online/sandbox/limits.d.ts +4 -0
  147. package/dist/server/online/sandbox/limits.d.ts.map +1 -0
  148. package/dist/server/online/sandbox/limits.js +46 -0
  149. package/dist/server/online/sandbox/limits.js.map +1 -0
  150. package/dist/server/online/sandbox/provider.d.ts +9 -0
  151. package/dist/server/online/sandbox/provider.d.ts.map +1 -0
  152. package/dist/server/online/sandbox/provider.js +237 -0
  153. package/dist/server/online/sandbox/provider.js.map +1 -0
  154. package/dist/server/online/sandbox/skills.d.ts +14 -0
  155. package/dist/server/online/sandbox/skills.d.ts.map +1 -0
  156. package/dist/server/online/sandbox/skills.js +56 -0
  157. package/dist/server/online/sandbox/skills.js.map +1 -0
  158. package/dist/server/online/sandbox/tools.d.ts +3 -0
  159. package/dist/server/online/sandbox/tools.d.ts.map +1 -0
  160. package/dist/server/online/sandbox/tools.js +35 -0
  161. package/dist/server/online/sandbox/tools.js.map +1 -0
  162. package/dist/server/online/sandbox/types.d.ts +72 -0
  163. package/dist/server/online/sandbox/types.d.ts.map +1 -0
  164. package/dist/server/online/sandbox/types.js +2 -0
  165. package/dist/server/online/sandbox/types.js.map +1 -0
  166. package/dist/server/providers/agents.d.ts +5 -2
  167. package/dist/server/providers/agents.d.ts.map +1 -1
  168. package/dist/server/providers/agents.js +63 -2
  169. package/dist/server/providers/agents.js.map +1 -1
  170. package/dist/server/routes/admin.d.ts.map +1 -1
  171. package/dist/server/routes/admin.js +1 -0
  172. package/dist/server/routes/admin.js.map +1 -1
  173. package/dist/server/routes/chat.d.ts +1 -1
  174. package/dist/server/routes/chat.d.ts.map +1 -1
  175. package/dist/server/routes/chat.js +15 -6
  176. package/dist/server/routes/chat.js.map +1 -1
  177. package/dist/server/routes/index.d.ts.map +1 -1
  178. package/dist/server/routes/index.js +17 -2
  179. package/dist/server/routes/index.js.map +1 -1
  180. package/dist/server/routes/openapi.js +1 -1
  181. package/dist/server/routes/openapi.js.map +1 -1
  182. package/dist/server/routes/schemas.js +1 -1
  183. package/dist/server/routes/schemas.js.map +1 -1
  184. package/dist/server/runners/runner.service.d.ts +1 -1
  185. package/dist/server/runners/runner.service.d.ts.map +1 -1
  186. package/dist/server/runners/runner.service.js +5 -1
  187. package/dist/server/runners/runner.service.js.map +1 -1
  188. package/dist/server/runners/runner.store.d.ts.map +1 -1
  189. package/dist/server/runners/runner.store.js +3 -1
  190. package/dist/server/runners/runner.store.js.map +1 -1
  191. package/dist/server/vendor/THIRD_PARTY_LICENSES.txt +782 -0
  192. package/dist/server/vendor/just-bash.d.ts +137 -0
  193. package/dist/server/vendor/just-bash.js +2102 -0
  194. package/dist/shared/conversations.d.ts +2 -1
  195. package/dist/shared/conversations.d.ts.map +1 -1
  196. package/dist/shared/conversations.js.map +1 -1
  197. package/dist/shared/runners.d.ts +1 -1
  198. package/dist/shared/runners.d.ts.map +1 -1
  199. package/dist/shared/runners.js +2 -0
  200. package/dist/shared/runners.js.map +1 -1
  201. package/docs/native-sandbox.md +55 -0
  202. package/docs/runner-agents.md +2 -0
  203. package/docs/ui-message-clients.md +10 -0
  204. package/package.json +11 -8
  205. package/skills/nocobase-app-plugin-agents/SKILL.md +1 -0
  206. package/skills/nocobase-app-plugin-agents/references/extension-points.md +21 -19
  207. package/skills/nocobase-app-plugin-agents/references/online-agent.md +2 -2
@@ -0,0 +1,370 @@
1
+ /**
2
+ * The application's CLI inside an OnlineAgent shell, built from the same command manifest as the real CLI.
3
+ * Each command sends one request through the authenticated application surface.
4
+ * Help works offline: `acme --help`, `acme <area> --help`, `acme <command> --help`, and `acme docs [command]`.
5
+ * Commands use the CLI parser, print human-readable output or a JSON envelope, and retain the CLI's exit codes.
6
+ * Parameter files and exported variables come from the virtual shell, never from the host.
7
+ */
8
+ import { EXIT_CODES, readErrorBody, } from '@nocobase/agent-protocol';
9
+ import { apiExitCode, CliParseError, commandWords, helpColumns, needsLocalFiles, parseCommandLine, renderCommandHelp, renderTopicHelp, } from '@nocobase/app-cli-client/parse';
10
+ import { fillRequest, requestText } from '@nocobase/app-cli-client/request';
11
+ import { commandFailureJson, commandSuccessJson, } from '@nocobase/cli-envelope';
12
+ import { defineCommand, } from '../../vendor/just-bash.js';
13
+ import { responseText } from './limits.js';
14
+ const words = (id) => id.split(':').join(' ');
15
+ class Failure extends Error {
16
+ error;
17
+ exit;
18
+ constructor(error, exit) {
19
+ super(error.message);
20
+ this.error = error;
21
+ this.exit = exit;
22
+ }
23
+ }
24
+ const usage = (message, code = 'INVALID_USAGE') => new Failure({ code, message, suggestions: [] }, EXIT_CODES.validation);
25
+ /** The flags every command of the shell takes. */
26
+ const SHELL_FLAGS = [
27
+ ['--json', 'Print the answer as one JSON document.'],
28
+ ];
29
+ function commandList(bin, commands, prefix) {
30
+ const topic = renderTopicHelp(bin, commands, prefix);
31
+ if (topic === undefined)
32
+ return null;
33
+ return `${topic}\n\nRun \`${bin} <command> --help\` for a command's arguments and flags, \`${bin} docs <command>\` for all it does. Add --json to read an answer as JSON.`;
34
+ }
35
+ function commandHelp(bin, command) {
36
+ return renderCommandHelp(command, {
37
+ bin,
38
+ globalFlags: SHELL_FLAGS,
39
+ localFiles: false,
40
+ });
41
+ }
42
+ function commandDocs(bin, command) {
43
+ const output = command.output.kind === 'list'
44
+ ? 'A list; `--json` has the items in `result.data` and paging in `result.meta`.'
45
+ : command.output.kind === 'empty'
46
+ ? 'Nothing: "Done." on success.'
47
+ : 'One record; `--json` has it in `result.data`.';
48
+ return [
49
+ commandHelp(bin, command),
50
+ '',
51
+ 'OUTPUT',
52
+ ` ${output}`,
53
+ '',
54
+ 'REQUEST',
55
+ ` ${command.method} ${command.path}`,
56
+ ...(command.action ? ['', 'ACTION', ` ${command.action}`] : []),
57
+ ...(needsLocalFiles(command)
58
+ ? [
59
+ '',
60
+ 'NOTE',
61
+ ' It needs a file on your machine, or saves one there: not available in this shell.',
62
+ ]
63
+ : []),
64
+ ].join('\n');
65
+ }
66
+ /** The areas of the manifest, with how many commands each has. */
67
+ function areas(bin, commands) {
68
+ const counts = new Map();
69
+ for (const command of commands) {
70
+ const area = command.id.split(':')[0] ?? command.id;
71
+ counts.set(area, (counts.get(area) ?? 0) + 1);
72
+ }
73
+ return [
74
+ `\`${bin} docs <command words>\` documents one command; \`${bin} <area> --help\` lists an area's commands.`,
75
+ '',
76
+ 'AREAS',
77
+ ...helpColumns([...counts].map(([area, count]) => [area, `${count} command${count === 1 ? '' : 's'}`])),
78
+ ].join('\n');
79
+ }
80
+ /** The command whose words start `args`, the longest one; and the arguments after them. */
81
+ function resolve(commands, args) {
82
+ const leading = [];
83
+ for (const word of args) {
84
+ if (word.startsWith('-'))
85
+ break;
86
+ leading.push(word);
87
+ }
88
+ for (let length = leading.length; length > 0; length--) {
89
+ const id = leading.slice(0, length).join(':');
90
+ const command = commands.find((candidate) => candidate.id === id);
91
+ if (command)
92
+ return { command, rest: args.slice(length) };
93
+ }
94
+ return null;
95
+ }
96
+ /** The shell, as the parser reads it: its files, and its exported variables. No files to send, and no one to ask. */
97
+ function shellIo(ctx) {
98
+ return {
99
+ readText: async (path) => {
100
+ try {
101
+ return await ctx.fs.readFile(ctx.fs.resolvePath(ctx.cwd, path));
102
+ }
103
+ catch {
104
+ return undefined;
105
+ }
106
+ },
107
+ env: (name) => ctx.exportedEnv?.[name],
108
+ };
109
+ }
110
+ /** Whether the line asks for help: `--help` or `-h` before any `--`. */
111
+ function asksHelp(rest) {
112
+ for (const word of rest) {
113
+ if (word === '--')
114
+ return false;
115
+ if (word === '--help' || word === '-h')
116
+ return true;
117
+ }
118
+ return false;
119
+ }
120
+ function cell(value) {
121
+ if (value === null || value === undefined)
122
+ return '';
123
+ const text = typeof value === 'string'
124
+ ? value
125
+ : typeof value === 'number' || typeof value === 'boolean'
126
+ ? String(value)
127
+ : JSON.stringify(value);
128
+ const line = text.replace(/\s+/gu, ' ').trim();
129
+ return line.length > 80 ? `${line.slice(0, 79)}…` : line;
130
+ }
131
+ function valueAt(row, column) {
132
+ let current = row;
133
+ for (const key of column.split('.')) {
134
+ if (!current || typeof current !== 'object')
135
+ return undefined;
136
+ current = current[key];
137
+ }
138
+ return current;
139
+ }
140
+ const isScalar = (value) => value === null || ['string', 'number', 'boolean'].includes(typeof value);
141
+ /** What a person reads of an answer: a list as a table, a record field by field, or its message. */
142
+ function render(command, data, meta) {
143
+ const message = typeof meta?.message === 'string' ? meta.message : undefined;
144
+ if (Array.isArray(data)) {
145
+ const first = data[0];
146
+ const keys = command.output.columns?.length
147
+ ? [...command.output.columns]
148
+ : first && typeof first === 'object'
149
+ ? Object.entries(first)
150
+ .filter(([, value]) => isScalar(value))
151
+ .map(([key]) => key)
152
+ .slice(0, 6)
153
+ : ['value'];
154
+ const rows = data.map((row) => keys.map((key) => cell(key === 'value' ? row : valueAt(row, key))));
155
+ const widths = keys.map((key, at) => Math.max(key.length, ...rows.map((row) => row[at].length)));
156
+ const line = (cells) => cells
157
+ .map((value, at) => value.padEnd(widths[at]))
158
+ .join(' ')
159
+ .trimEnd();
160
+ const table = data.length === 0
161
+ ? '(none)'
162
+ : [line(keys.map((key) => key.toUpperCase())), ...rows.map(line)].join('\n');
163
+ const more = typeof meta?.nextPageToken === 'string'
164
+ ? `\n(more: --page-token ${meta.nextPageToken})`
165
+ : '';
166
+ return `${message ? `${message}\n` : ''}${table}${more}`;
167
+ }
168
+ if (message)
169
+ return message;
170
+ if (data === null || data === undefined)
171
+ return 'Done.';
172
+ if (typeof data === 'object')
173
+ return Object.entries(data)
174
+ .map(([key, value]) => `${key}: ${isScalar(value) ? String(value) : JSON.stringify(value)}`)
175
+ .join('\n');
176
+ return typeof data === 'string' ? data : JSON.stringify(data);
177
+ }
178
+ /** The request body: JSON, or a form for a `multipart/form-data` command (no files: the shell has none to send). */
179
+ function bodyOf(command, fields) {
180
+ if (!command.body)
181
+ return undefined;
182
+ if (command.body.media !== 'multipart/form-data')
183
+ return JSON.stringify(fields);
184
+ const form = new FormData();
185
+ for (const [field, value] of Object.entries(fields))
186
+ for (const item of Array.isArray(value) ? value : [value])
187
+ if (item !== undefined && item !== null)
188
+ form.append(field, requestText(item));
189
+ return form;
190
+ }
191
+ async function call(surface, command, parsed, signal) {
192
+ if (command.readBinding) {
193
+ const binding = command.readBinding;
194
+ const values = Object.entries(binding.params).map(([field, source]) => {
195
+ const entry = [...parsed.values].find(([parameter]) => parameter.in === 'path' && parameter.field === source);
196
+ return [{ in: 'path', field }, entry?.[1]];
197
+ });
198
+ const request = fillRequest({ method: 'GET', path: binding.path }, values);
199
+ const read = await call(surface, {
200
+ ...command,
201
+ method: 'GET',
202
+ path: request.path,
203
+ body: undefined,
204
+ readBinding: undefined,
205
+ }, { ...parsed, values: new Map(), bodyFile: undefined }, signal);
206
+ const value = valueAt(read, binding.responseField);
207
+ if (value === undefined || value === null || value === '')
208
+ throw usage('There is no current value for this decision; refresh it before deciding.', 'READ_BINDING_MISSING');
209
+ parsed = {
210
+ ...parsed,
211
+ bodyFile: { ...parsed.bodyFile, [binding.bodyField]: value },
212
+ };
213
+ }
214
+ const filled = fillRequest(command, parsed.values, parsed.bodyFile);
215
+ signal.throwIfAborted();
216
+ const body = bodyOf(command, filled.fields);
217
+ const response = await surface.send({
218
+ method: filled.method,
219
+ path: filled.path,
220
+ ...(body === undefined ? {} : { body }),
221
+ }, signal);
222
+ if (response.status >= 300 && response.status < 400) {
223
+ await response.body?.cancel();
224
+ throw usage('CLI redirects are not supported.', 'REDIRECT_UNSUPPORTED');
225
+ }
226
+ const text = await responseText(response, signal);
227
+ let answer;
228
+ try {
229
+ answer = text === '' ? undefined : JSON.parse(text);
230
+ }
231
+ catch {
232
+ answer = undefined;
233
+ }
234
+ if (!response.ok) {
235
+ const error = readErrorBody(answer);
236
+ const reason = error?.reason ?? `HTTP_${response.status}`;
237
+ throw new Failure({
238
+ code: reason,
239
+ message: (error?.message ??
240
+ `${filled.method} ${filled.path.split('?')[0]} answered ${response.status}`) +
241
+ (filled.method !== 'GET' && response.status >= 500
242
+ ? ' The write result may be unknown; query the record before retrying. Cancellation does not imply rollback.'
243
+ : ''),
244
+ suggestions: [],
245
+ details: {
246
+ httpStatus: response.status,
247
+ ...(error?.status ? { status: error.status } : {}),
248
+ ...(error?.metadata === undefined
249
+ ? {}
250
+ : { metadata: error.metadata }),
251
+ },
252
+ }, apiExitCode(response.status, reason, error?.status));
253
+ }
254
+ const record = answer && typeof answer === 'object'
255
+ ? answer
256
+ : {};
257
+ return {
258
+ data: record.data ?? null,
259
+ ...(record.meta && typeof record.meta === 'object'
260
+ ? { meta: record.meta }
261
+ : {}),
262
+ };
263
+ }
264
+ const out = (stdout, exitCode = 0) => ({
265
+ stdout: stdout.endsWith('\n') ? stdout : `${stdout}\n`,
266
+ stderr: '',
267
+ exitCode,
268
+ });
269
+ /** The application CLI inside an execution's shell. */
270
+ export function cliCommand(surface, signal) {
271
+ const { bin, commands } = surface;
272
+ return defineCommand(bin, async (args, ctx) => {
273
+ const commandSignal = ctx.signal
274
+ ? AbortSignal.any([signal, ctx.signal])
275
+ : signal;
276
+ const json = args.includes('--json');
277
+ const fail = (name, failure) => json
278
+ ? {
279
+ stdout: `${JSON.stringify(commandFailureJson(name, failure.error, []))}\n`,
280
+ stderr: '',
281
+ exitCode: failure.exit,
282
+ }
283
+ : {
284
+ stdout: '',
285
+ stderr: `Error: ${failure.error.message} (${failure.error.code})\n${failure.error.suggestions
286
+ .map((suggestion) => ` ${suggestion.message}\n`)
287
+ .join('')}`,
288
+ exitCode: failure.exit,
289
+ };
290
+ const plain = args.filter((arg) => arg !== '--json');
291
+ if (plain.length === 0 || plain[0] === '--help' || plain[0] === '-h')
292
+ return out(commandList(bin, commands, []));
293
+ if (plain[0] === 'docs') {
294
+ const target = plain.slice(1).filter((arg) => !arg.startsWith('-'));
295
+ if (target.length === 0)
296
+ return out(areas(bin, commands));
297
+ const found = resolve(commands, target);
298
+ if (found && found.rest.length === 0)
299
+ return out(commandDocs(bin, found.command));
300
+ const list = commandList(bin, commands, target);
301
+ if (list)
302
+ return out(list);
303
+ return fail('docs', new Failure({
304
+ code: 'COMMAND_UNKNOWN',
305
+ message: `There is no command ${target.join(' ')}.`,
306
+ suggestions: [
307
+ {
308
+ message: 'List the commands.',
309
+ run: { command: bin, args: ['--help'] },
310
+ },
311
+ ],
312
+ }, EXIT_CODES.notFound));
313
+ }
314
+ // The line as typed when it starts with the command's words, so `--json` is read where it stands, as the CLI does.
315
+ const found = resolve(commands, args) ?? resolve(commands, plain);
316
+ if (!found) {
317
+ const prefix = plain.filter((arg) => !arg.startsWith('-'));
318
+ const list = commandList(bin, commands, prefix);
319
+ if (list)
320
+ return out(list);
321
+ return fail(prefix.join(' '), new Failure({
322
+ code: 'COMMAND_UNKNOWN',
323
+ message: `There is no command ${prefix.join(' ')} for you. Run \`${bin} --help\` for the ones you may run.`,
324
+ suggestions: [
325
+ {
326
+ message: 'List the commands.',
327
+ run: { command: bin, args: ['--help'] },
328
+ },
329
+ ],
330
+ }, EXIT_CODES.notFound));
331
+ }
332
+ const { command, rest } = found;
333
+ const name = words(command.id);
334
+ try {
335
+ if (needsLocalFiles(command) && !asksHelp(rest))
336
+ throw usage(`${bin} ${commandWords(command)} requires file transfer; not available in this shell.`, 'FILES_UNAVAILABLE');
337
+ if (command.confirm && !asksHelp(rest))
338
+ throw usage(command.confirm + ' Nothing was done without explicit confirmation.', 'CONFIRMATION_REQUIRED');
339
+ const parsed = await parseCommandLine(command, rest.includes('--json') || !json ? rest : [...rest, '--json'], { bin, io: shellIo(ctx) });
340
+ if (parsed.help)
341
+ return out(commandHelp(bin, command));
342
+ if (parsed.uploads.size || parsed.ticket || parsed.out || parsed.changed)
343
+ throw usage('File transfer is not available in this shell.', 'FILES_UNAVAILABLE');
344
+ const answer = await call(surface, command, parsed, commandSignal);
345
+ return parsed.json
346
+ ? out(JSON.stringify(commandSuccessJson(name, 'success', answer, [])))
347
+ : out(render(command, answer.data, answer.meta));
348
+ }
349
+ catch (error) {
350
+ commandSignal.throwIfAborted();
351
+ if (error instanceof Failure)
352
+ return fail(name, error);
353
+ if (error instanceof CliParseError)
354
+ return fail(name, new Failure({
355
+ code: error.code,
356
+ message: error.message,
357
+ suggestions: [...error.suggestions],
358
+ ...(error.details === undefined
359
+ ? {}
360
+ : { details: error.details }),
361
+ }, error.exit));
362
+ return fail(name, new Failure({
363
+ code: 'UNEXPECTED',
364
+ message: error instanceof Error ? error.message : String(error),
365
+ suggestions: [],
366
+ }, EXIT_CODES.general));
367
+ }
368
+ });
369
+ }
370
+ //# sourceMappingURL=cli-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-command.js","sourceRoot":"","sources":["../../../../server/online/sandbox/cli-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { OnlineAgentToolExecution } from '../agent/types.js';
2
+ import type { OnlineAgentSandbox, OnlineAgentSandboxInput, OnlineAgentSandboxProvider } from './types.js';
3
+ /** Execution-local capabilities; only the first shell call allocates a Sandbox. */
4
+ export declare class NativeToolExecution implements OnlineAgentToolExecution {
5
+ readonly id: string;
6
+ private readonly owner;
7
+ private readonly input;
8
+ private readonly provider;
9
+ private prepared;
10
+ private closed;
11
+ private cleanup;
12
+ constructor(id: string, owner: {
13
+ sandbox?: Promise<OnlineAgentSandbox>;
14
+ }, input: OnlineAgentSandboxInput, provider: OnlineAgentSandboxProvider | undefined);
15
+ private available;
16
+ private preparation;
17
+ instructions(tools: readonly string[]): Promise<string>;
18
+ getSandbox(): Promise<OnlineAgentSandbox>;
19
+ readSkill(name: string): Promise<{
20
+ ok: boolean;
21
+ output: string;
22
+ }>;
23
+ dispose(): Promise<void>;
24
+ }
25
+ //# sourceMappingURL=execution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../../../server/online/sandbox/execution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,KAAK,EACV,kBAAkB,EAClB,uBAAuB,EAEvB,0BAA0B,EAC3B,MAAM,YAAY,CAAC;AAEpB,mFAAmF;AACnF,qBAAa,mBAAoB,YAAW,wBAAwB;IAMhE,QAAQ,CAAC,EAAE,EAAE,MAAM;IACnB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAR3B,OAAO,CAAC,QAAQ,CAAqD;IACrE,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAA4B;gBAGhC,EAAE,EAAE,MAAM,EACF,KAAK,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAA;KAAE,EAChD,KAAK,EAAE,uBAAuB,EAC9B,QAAQ,EAAE,0BAA0B,GAAG,SAAS;IAGnE,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,WAAW;IAMb,YAAY,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAKvD,UAAU,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAYzC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAMvE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAezB"}
@@ -0,0 +1,63 @@
1
+ /** Execution-local capabilities; only the first shell call allocates a Sandbox. */
2
+ export class NativeToolExecution {
3
+ id;
4
+ owner;
5
+ input;
6
+ provider;
7
+ prepared;
8
+ closed = false;
9
+ cleanup;
10
+ constructor(id, owner, input, provider) {
11
+ this.id = id;
12
+ this.owner = owner;
13
+ this.input = input;
14
+ this.provider = provider;
15
+ }
16
+ available() {
17
+ if (this.closed)
18
+ throw new Error('Execution is closed.');
19
+ this.input.context.signal.throwIfAborted();
20
+ }
21
+ preparation() {
22
+ this.available();
23
+ if (!this.provider)
24
+ throw new Error('Sandbox provider is unavailable.');
25
+ return (this.prepared ??= this.provider.prepare(this.input));
26
+ }
27
+ async instructions(tools) {
28
+ if (!tools.some((name) => name === 'bash' || name === 'skill'))
29
+ return '';
30
+ return (await this.preparation()).instructions;
31
+ }
32
+ async getSandbox() {
33
+ this.available();
34
+ const sandbox = await (this.owner.sandbox ??= this.preparation().then((prepared) => {
35
+ this.available();
36
+ return prepared.create();
37
+ }));
38
+ this.available();
39
+ return sandbox;
40
+ }
41
+ async readSkill(name) {
42
+ const prepared = await this.preparation();
43
+ this.available();
44
+ return prepared.readSkill(name);
45
+ }
46
+ dispose() {
47
+ if (this.cleanup)
48
+ return this.cleanup;
49
+ this.closed = true;
50
+ this.cleanup = (async () => {
51
+ // Creation failures release partial resources in the provider, not here.
52
+ const sandbox = await this.owner.sandbox?.catch(() => undefined);
53
+ await sandbox?.dispose();
54
+ const prepared = await this.prepared?.catch(() => undefined);
55
+ prepared?.dispose();
56
+ })().catch((error) => {
57
+ this.cleanup = undefined;
58
+ throw error;
59
+ });
60
+ return this.cleanup;
61
+ }
62
+ }
63
+ //# sourceMappingURL=execution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution.js","sourceRoot":"","sources":["../../../../server/online/sandbox/execution.ts"],"names":[],"mappings":"AAQA,mFAAmF;AACnF,MAAM,OAAO,mBAAmB;IAMnB;IACQ;IACA;IACA;IARX,QAAQ,CAAqD;IAC7D,MAAM,GAAG,KAAK,CAAC;IACf,OAAO,CAA4B;IAE3C,YACW,EAAU,EACF,KAAgD,EAChD,KAA8B,EAC9B,QAAgD;QAHxD,OAAE,GAAF,EAAE,CAAQ;QACF,UAAK,GAAL,KAAK,CAA2C;QAChD,UAAK,GAAL,KAAK,CAAyB;QAC9B,aAAQ,GAAR,QAAQ,CAAwC;IAChE,CAAC;IAEI,SAAS;QACf,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;IAC7C,CAAC;IAEO,WAAW;QACjB,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAwB;QACzC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO,CAAC;YAAE,OAAO,EAAE,CAAC;QAC1E,OAAO,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,YAAY,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CACnE,CAAC,QAAQ,EAAE,EAAE;YACX,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC3B,CAAC,CACF,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY;QAC1B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,OAAO,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE;YACzB,yEAAyE;YACzE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACjE,MAAM,OAAO,EAAE,OAAO,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC7D,QAAQ,EAAE,OAAO,EAAE,CAAC;QACtB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YAC5B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;YACzB,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import { type IFileSystem } from '../../vendor/just-bash.js';
2
+ /** The historical read-only guard over just-bash's filesystem; storage and quotas belong to InMemoryFs. */
3
+ export declare function createSandboxFilesystem(files: Record<string, string>, maxTotalBytes?: number, unreadable?: ReadonlyMap<string, string>): {
4
+ fs: IFileSystem;
5
+ lock(): void;
6
+ dispose(): Promise<void>;
7
+ };
8
+ //# sourceMappingURL=filesystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../../../server/online/sandbox/filesystem.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,2BAA2B,CAAC;AA2BzE,2GAA2G;AAC3G,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,aAAa,GAAE,MAAsC,EACrD,UAAU,GAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAa,GAClD;IAAE,EAAE,EAAE,WAAW,CAAC;IAAC,IAAI,IAAI,IAAI,CAAC;IAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CA8C7D"}
@@ -0,0 +1,72 @@
1
+ import { posix } from 'node:path';
2
+ import { InMemoryFs } from '../../vendor/just-bash.js';
3
+ import { sandboxLimits } from './limits.js';
4
+ const MUTATORS = new Set([
5
+ 'writeFile',
6
+ 'appendFile',
7
+ 'mkdir',
8
+ 'mkdirSync',
9
+ 'rm',
10
+ 'cp',
11
+ 'mv',
12
+ 'chmod',
13
+ 'utimes',
14
+ 'createExclusive',
15
+ 'writeFileSync',
16
+ 'writeFileLazy',
17
+ ]);
18
+ class FsError extends Error {
19
+ code;
20
+ constructor(code, message) {
21
+ super(message);
22
+ this.code = code;
23
+ }
24
+ }
25
+ /** The historical read-only guard over just-bash's filesystem; storage and quotas belong to InMemoryFs. */
26
+ export function createSandboxFilesystem(files, maxTotalBytes = sandboxLimits.filesystemBytes, unreadable = new Map()) {
27
+ const inner = new InMemoryFs(files, { maxTotalBytes });
28
+ inner.writeFileSync('/tmp/.keep', '');
29
+ let locked = false;
30
+ const writable = (path) => {
31
+ if (typeof path !== 'string' || path.includes('\0'))
32
+ return false;
33
+ const normalized = posix.resolve('/', path);
34
+ return normalized === '/tmp' || normalized.startsWith('/tmp/');
35
+ };
36
+ const fs = new Proxy(inner, {
37
+ get(target, property, receiver) {
38
+ const value = Reflect.get(target, property, receiver);
39
+ if (typeof value !== 'function')
40
+ return value;
41
+ const name = String(property);
42
+ return (...args) => {
43
+ if (['readFile', 'readFileBytes', 'readFileBuffer', 'cp'].includes(name) &&
44
+ typeof args[0] === 'string') {
45
+ const reason = unreadable.get(posix.resolve('/', args[0]));
46
+ if (reason)
47
+ throw new FsError('EACCES', reason);
48
+ }
49
+ // Skills contain no links; refusing new links keeps the guard's normalized paths authoritative.
50
+ if (locked && (name === 'symlink' || name === 'link'))
51
+ throw new FsError('EPERM', 'EPERM: links are unavailable.');
52
+ if (locked && MUTATORS.has(name)) {
53
+ const written = name === 'cp' || name === 'mv' ? args[1] : args[0];
54
+ const touched = name === 'mv' ? [args[0], args[1]] : [written];
55
+ if (!touched.every(writable))
56
+ throw new FsError('EROFS', 'EROFS: only /tmp is writable.');
57
+ }
58
+ return value.apply(target, args);
59
+ };
60
+ },
61
+ });
62
+ return {
63
+ fs,
64
+ lock() {
65
+ locked = true;
66
+ },
67
+ async dispose() {
68
+ await inner.rm('/', { recursive: true, force: true });
69
+ },
70
+ };
71
+ }
72
+ //# sourceMappingURL=filesystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../../../server/online/sandbox/filesystem.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare const sandboxLimits: Readonly<Record<'skillBytes' | 'filesystemBytes' | 'durationMs' | 'shellOutput' | 'modelOutput', number>>;
2
+ export declare function clip(value: string): string;
3
+ export declare function responseText(response: Response, signal?: AbortSignal): Promise<string>;
4
+ //# sourceMappingURL=limits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../../../../server/online/sandbox/limits.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,EAAE,QAAQ,CAClC,MAAM,CACF,YAAY,GACZ,iBAAiB,GACjB,YAAY,GACZ,aAAa,GACb,aAAa,EACf,MAAM,CACP,CAQD,CAAC;AACH,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI1C;AACD,wBAAsB,YAAY,CAChC,QAAQ,EAAE,QAAQ,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC,CA2BjB"}
@@ -0,0 +1,46 @@
1
+ export const sandboxLimits = Object.freeze({
2
+ skillBytes: 5 * 1024 * 1024,
3
+ // Historical aggregate budget: 5 MiB Skill mount + 1 MiB nominal scratch + 1 MiB overhead.
4
+ filesystemBytes: 7 * 1024 * 1024,
5
+ durationMs: 10000,
6
+ shellOutput: 1024 * 1024,
7
+ modelOutput: 24000,
8
+ });
9
+ export function clip(value) {
10
+ return value.length > sandboxLimits.modelOutput
11
+ ? value.slice(0, sandboxLimits.modelOutput) + '\n[Output truncated]'
12
+ : value;
13
+ }
14
+ export async function responseText(response, signal) {
15
+ if (!response.body)
16
+ return '';
17
+ const reader = response.body.getReader();
18
+ const chunks = [];
19
+ let cancellation;
20
+ const cancel = () => (cancellation ??= reader.cancel(signal?.reason));
21
+ const onAbort = () => {
22
+ void cancel().catch(() => { });
23
+ };
24
+ signal?.addEventListener('abort', onAbort, { once: true });
25
+ try {
26
+ signal?.throwIfAborted();
27
+ for (;;) {
28
+ const part = await reader.read();
29
+ signal?.throwIfAborted();
30
+ if (part.done)
31
+ break;
32
+ chunks.push(part.value);
33
+ }
34
+ return Buffer.concat(chunks).toString('utf8');
35
+ }
36
+ finally {
37
+ signal?.removeEventListener('abort', onAbort);
38
+ try {
39
+ await cancel();
40
+ }
41
+ finally {
42
+ reader.releaseLock();
43
+ }
44
+ }
45
+ }
46
+ //# sourceMappingURL=limits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limits.js","sourceRoot":"","sources":["../../../../server/online/sandbox/limits.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAStB,MAAM,CAAC,MAAM,CAAC;IAChB,UAAU,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI;IAC3B,2FAA2F;IAC3F,eAAe,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI;IAChC,UAAU,EAAE,KAAK;IACjB,WAAW,EAAE,IAAI,GAAG,IAAI;IACxB,WAAW,EAAE,KAAK;CACnB,CAAC,CAAC;AACH,MAAM,UAAU,IAAI,CAAC,KAAa;IAChC,OAAO,KAAK,CAAC,MAAM,GAAG,aAAa,CAAC,WAAW;QAC7C,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,sBAAsB;QACpE,CAAC,CAAC,KAAK,CAAC;AACZ,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAkB,EAClB,MAAoB;IAEpB,IAAI,CAAC,QAAQ,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IACzC,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,YAAuC,CAAC;IAC5C,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,YAAY,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,KAAK,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC;IACF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,IAAI,CAAC;QACH,MAAM,EAAE,cAAc,EAAE,CAAC;QACzB,SAAS,CAAC;YACR,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACjC,MAAM,EAAE,cAAc,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,IAAI;gBAAE,MAAM;YACrB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,MAAM,EAAE,CAAC;QACjB,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;AACH,CAAC"}