@apify/actors-mcp-server 0.10.5-beta.6 → 0.10.5-beta.8
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.
- package/dist/mcp/server.d.ts +0 -2
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +12 -20
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/utils.d.ts +1 -1
- package/dist/mcp/utils.js +1 -1
- package/dist/tools/actor_executor.d.ts +10 -0
- package/dist/tools/actor_executor.d.ts.map +1 -0
- package/dist/tools/actor_executor.js +79 -0
- package/dist/tools/actor_executor.js.map +1 -0
- package/dist/tools/apps/call_actor.d.ts +0 -1
- package/dist/tools/apps/call_actor.d.ts.map +1 -1
- package/dist/tools/apps/call_actor.js +8 -54
- package/dist/tools/apps/call_actor.js.map +1 -1
- package/dist/tools/apps/call_actor_widget.d.ts.map +1 -1
- package/dist/tools/apps/call_actor_widget.js +8 -52
- package/dist/tools/apps/call_actor_widget.js.map +1 -1
- package/dist/tools/apps/get_actor_run_widget.d.ts.map +1 -1
- package/dist/tools/apps/get_actor_run_widget.js +15 -9
- package/dist/tools/apps/get_actor_run_widget.js.map +1 -1
- package/dist/tools/categories.d.ts +6 -0
- package/dist/tools/categories.d.ts.map +1 -1
- package/dist/tools/categories.js +7 -1
- package/dist/tools/categories.js.map +1 -1
- package/dist/tools/core/actor_run_response.d.ts +127 -0
- package/dist/tools/core/actor_run_response.d.ts.map +1 -0
- package/dist/tools/core/actor_run_response.js +551 -0
- package/dist/tools/core/actor_run_response.js.map +1 -0
- package/dist/tools/core/actor_tools_factory.d.ts +8 -3
- package/dist/tools/core/actor_tools_factory.d.ts.map +1 -1
- package/dist/tools/core/actor_tools_factory.js +40 -11
- package/dist/tools/core/actor_tools_factory.js.map +1 -1
- package/dist/tools/core/call_actor_common.d.ts +16 -39
- package/dist/tools/core/call_actor_common.d.ts.map +1 -1
- package/dist/tools/core/call_actor_common.js +171 -140
- package/dist/tools/core/call_actor_common.js.map +1 -1
- package/dist/tools/core/get_actor_run_common.d.ts +10 -49
- package/dist/tools/core/get_actor_run_common.d.ts.map +1 -1
- package/dist/tools/core/get_actor_run_common.js +51 -86
- package/dist/tools/core/get_actor_run_common.js.map +1 -1
- package/dist/tools/default/call_actor.d.ts +0 -2
- package/dist/tools/default/call_actor.d.ts.map +1 -1
- package/dist/tools/default/call_actor.js +5 -85
- package/dist/tools/default/call_actor.js.map +1 -1
- package/dist/tools/default/get_actor_run.d.ts +1 -2
- package/dist/tools/default/get_actor_run.d.ts.map +1 -1
- package/dist/tools/default/get_actor_run.js +12 -6
- package/dist/tools/default/get_actor_run.js.map +1 -1
- package/dist/tools/index.d.ts +1 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/structured_output_schemas.d.ts +254 -51
- package/dist/tools/structured_output_schemas.d.ts.map +1 -1
- package/dist/tools/structured_output_schemas.js +124 -68
- package/dist/tools/structured_output_schemas.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +20 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/progress.d.ts +1 -0
- package/dist/utils/progress.d.ts.map +1 -1
- package/dist/utils/progress.js +1 -1
- package/dist/utils/progress.js.map +1 -1
- package/dist/utils/server-instructions/index.d.ts.map +1 -1
- package/dist/utils/server-instructions/index.js +6 -7
- package/dist/utils/server-instructions/index.js.map +1 -1
- package/dist/utils/tools_loader.d.ts.map +1 -1
- package/dist/utils/tools_loader.js +9 -3
- package/dist/utils/tools_loader.js.map +1 -1
- package/dist/web/dist/actor-detail-widget.js +3 -0
- package/dist/web/dist/actor-run-widget.js +219 -216
- package/dist/web/dist/search-actors-widget.js +3 -0
- package/package.json +1 -1
- package/dist/tools/apps/actor_executor.d.ts +0 -8
- package/dist/tools/apps/actor_executor.d.ts.map +0 -1
- package/dist/tools/apps/actor_executor.js +0 -29
- package/dist/tools/apps/actor_executor.js.map +0 -1
- package/dist/tools/core/actor_execution.d.ts +0 -39
- package/dist/tools/core/actor_execution.d.ts.map +0 -1
- package/dist/tools/core/actor_execution.js +0 -135
- package/dist/tools/core/actor_execution.js.map +0 -1
- package/dist/tools/core/actor_response.d.ts +0 -37
- package/dist/tools/core/actor_response.d.ts.map +0 -1
- package/dist/tools/core/actor_response.js +0 -94
- package/dist/tools/core/actor_response.js.map +0 -1
- package/dist/tools/default/actor_executor.d.ts +0 -7
- package/dist/tools/default/actor_executor.d.ts.map +0 -1
- package/dist/tools/default/actor_executor.js +0 -31
- package/dist/tools/default/actor_executor.js.map +0 -1
|
@@ -0,0 +1,551 @@
|
|
|
1
|
+
import log from '@apify/log';
|
|
2
|
+
import { FAILURE_CATEGORY, HelperTools, TOOL_STATUS } from '../../const.js';
|
|
3
|
+
import { getWidgetConfig, WIDGET_URIS } from '../../resources/widgets.js';
|
|
4
|
+
import { logHttpError } from '../../utils/logging.js';
|
|
5
|
+
import { buildMCPResponse } from '../../utils/mcp.js';
|
|
6
|
+
import { formatRunStatusMessage, TERMINAL_RUN_STATUSES } from '../../utils/progress.js';
|
|
7
|
+
/** Cap on `storages.keyValueStores.default.keys` array length. */
|
|
8
|
+
const KV_KEYS_LIMIT = 50;
|
|
9
|
+
/** nextStep text for widget-rendered responses: suppresses LLM polling. */
|
|
10
|
+
export const WIDGET_NO_POLL_NEXT_STEP = 'Widget is rendering live progress. Do NOT poll — the widget self-updates until completion.';
|
|
11
|
+
/** Maximum value for `waitSecs`. Stays under the 60s tool-call ceiling several MCP clients impose. */
|
|
12
|
+
export const WAIT_SECS_MAX = 45;
|
|
13
|
+
/** Default seconds to wait for completion on `call-actor` and direct actor tools. `get-actor-run` also defaults to 30. */
|
|
14
|
+
export const CALL_ACTOR_WAIT_SECS_DEFAULT = 30;
|
|
15
|
+
const POLL_HINT_WAIT_SECS = 30;
|
|
16
|
+
/** Limit for the dataset metadata `itemCount=0` lag-fallback probe. */
|
|
17
|
+
const ITEM_COUNT_PROBE_LIMIT = 1;
|
|
18
|
+
/**
|
|
19
|
+
* Delays before each `itemCount=0` lag-fallback probe. Apify docs state `itemCount` / `cleanItemCount`
|
|
20
|
+
* can lag up to ~5s after `pushItem`. We probe immediately, then again at +1s/+3s/+5s so a
|
|
21
|
+
* SUCCEEDED-but-empty dataset has the full propagation window to surface real items.
|
|
22
|
+
*/
|
|
23
|
+
const ITEM_COUNT_PROBE_DELAYS_MS = [0, 1000, 2000, 2000];
|
|
24
|
+
async function sleep(ms) {
|
|
25
|
+
await new Promise((resolve) => { setTimeout(resolve, ms); });
|
|
26
|
+
}
|
|
27
|
+
/** Sentinel used by `raceAbort` to signal that the abort signal won the race. */
|
|
28
|
+
const ABORT = Symbol('ABORT');
|
|
29
|
+
/**
|
|
30
|
+
* Race a promise against an abort signal. Returns the resolved value, or {@link ABORT} if the
|
|
31
|
+
* signal fires first. Cleans up its abort listener on either branch so callers never leak.
|
|
32
|
+
*/
|
|
33
|
+
async function raceAbort(promise, abortSignal) {
|
|
34
|
+
if (!abortSignal)
|
|
35
|
+
return promise;
|
|
36
|
+
// Already aborted: `addEventListener('abort', ...)` won't fire (the event has passed), so the
|
|
37
|
+
// listener would never resolve and the race would block on `promise`.
|
|
38
|
+
if (abortSignal.aborted)
|
|
39
|
+
return ABORT;
|
|
40
|
+
let listener;
|
|
41
|
+
const abortPromise = new Promise((resolve) => {
|
|
42
|
+
listener = () => resolve(ABORT);
|
|
43
|
+
abortSignal.addEventListener('abort', listener, { once: true });
|
|
44
|
+
});
|
|
45
|
+
try {
|
|
46
|
+
return await Promise.race([promise, abortPromise]);
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
if (listener)
|
|
50
|
+
abortSignal.removeEventListener('abort', listener);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// -----------------------------------------------------------------------------
|
|
54
|
+
// Helpers
|
|
55
|
+
// -----------------------------------------------------------------------------
|
|
56
|
+
/** Translate Apify slash-notation field paths to dot-notation. */
|
|
57
|
+
function slashToDot(field) {
|
|
58
|
+
return field.replace(/\//g, '.');
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Drop undefined and null keys. Apify's SDK returns null for fields it doesn't have (e.g.
|
|
62
|
+
* an unnamed default dataset's `name`), and the response shape declares no nullable fields, so we
|
|
63
|
+
* filter both to keep the response clean and pass `getActorRunOutputSchema` validation.
|
|
64
|
+
*/
|
|
65
|
+
function omitNullish(obj) {
|
|
66
|
+
const out = {};
|
|
67
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
68
|
+
if (v !== undefined && v !== null)
|
|
69
|
+
out[k] = v;
|
|
70
|
+
}
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
function toIsoString(value) {
|
|
74
|
+
if (!value)
|
|
75
|
+
return undefined;
|
|
76
|
+
return value instanceof Date ? value.toISOString() : value;
|
|
77
|
+
}
|
|
78
|
+
function buildStats(run) {
|
|
79
|
+
const stats = run.stats;
|
|
80
|
+
if (!stats)
|
|
81
|
+
return undefined;
|
|
82
|
+
const out = omitNullish({
|
|
83
|
+
runTimeSecs: stats.runTimeSecs,
|
|
84
|
+
computeUnits: stats.computeUnits,
|
|
85
|
+
memMaxBytes: stats.memMaxBytes,
|
|
86
|
+
});
|
|
87
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
88
|
+
}
|
|
89
|
+
function buildRunDataset(run, datasetMeta, resolvedItemCount) {
|
|
90
|
+
var _a;
|
|
91
|
+
if (!run.defaultDatasetId)
|
|
92
|
+
return undefined;
|
|
93
|
+
if (!datasetMeta) {
|
|
94
|
+
return { id: run.defaultDatasetId };
|
|
95
|
+
}
|
|
96
|
+
return omitNullish({
|
|
97
|
+
id: datasetMeta.id,
|
|
98
|
+
name: datasetMeta.name,
|
|
99
|
+
title: datasetMeta.title,
|
|
100
|
+
itemCount: resolvedItemCount !== null && resolvedItemCount !== void 0 ? resolvedItemCount : datasetMeta.itemCount,
|
|
101
|
+
cleanItemCount: datasetMeta.cleanItemCount,
|
|
102
|
+
fields: (_a = datasetMeta.fields) === null || _a === void 0 ? void 0 : _a.map(slashToDot),
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
function buildRunKeyValueStore(run, listKeysResult) {
|
|
106
|
+
if (!run.defaultKeyValueStoreId)
|
|
107
|
+
return undefined;
|
|
108
|
+
if (!listKeysResult) {
|
|
109
|
+
return { id: run.defaultKeyValueStoreId };
|
|
110
|
+
}
|
|
111
|
+
const keys = listKeysResult.items.map((k) => k.key);
|
|
112
|
+
// Empty KV: surface only the id (matches non-terminal shape) instead of `keys: [], keyCount: 0`.
|
|
113
|
+
if (keys.length === 0 && !listKeysResult.isTruncated) {
|
|
114
|
+
return { id: run.defaultKeyValueStoreId };
|
|
115
|
+
}
|
|
116
|
+
// The Apify listKeys endpoint does not report a true total. When the page is not truncated,
|
|
117
|
+
// we know the page count equals the total; when truncated, omit keyCount and let the agent
|
|
118
|
+
// detect "more keys exist" from `keys.length === KV_KEYS_LIMIT`.
|
|
119
|
+
const keyCount = listKeysResult.isTruncated ? undefined : keys.length;
|
|
120
|
+
return omitNullish({ id: run.defaultKeyValueStoreId, keys, keyCount });
|
|
121
|
+
}
|
|
122
|
+
function errMessage(error) {
|
|
123
|
+
return error instanceof Error ? error.message : String(error);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Apify's pagination counter is eventually consistent (~5s post-terminal). Probe with `listItems({ limit: 1 })`
|
|
127
|
+
* when `itemCount === 0` on a SUCCEEDED run — if the probe returns items, surface the larger count.
|
|
128
|
+
* Returns the resolved item count, or `undefined` if the dataset id is unknown / we shouldn't override.
|
|
129
|
+
*/
|
|
130
|
+
async function resolveItemCountWithLagFallback(client, run, datasetMeta, waitSecs, mcpSessionId, abortSignal) {
|
|
131
|
+
var _a;
|
|
132
|
+
if (run.status !== 'SUCCEEDED' || !datasetMeta || !run.defaultDatasetId)
|
|
133
|
+
return datasetMeta === null || datasetMeta === void 0 ? void 0 : datasetMeta.itemCount;
|
|
134
|
+
if (datasetMeta.itemCount > 0)
|
|
135
|
+
return datasetMeta.itemCount;
|
|
136
|
+
try {
|
|
137
|
+
// `total` is the dataset's true count from the SDK; `items.length` is capped by `limit` and
|
|
138
|
+
// would undercount whenever lag has hidden more than `ITEM_COUNT_PROBE_LIMIT` items.
|
|
139
|
+
// When `waitSecs === 0` the caller asked for an immediate response (e.g. the widget's initial
|
|
140
|
+
// render), so we do a single immediate probe and skip the delayed retries — otherwise the
|
|
141
|
+
// ~5s lag-recovery schedule would block "immediate" callers for the full window.
|
|
142
|
+
const delays = waitSecs !== 0 ? ITEM_COUNT_PROBE_DELAYS_MS : [0];
|
|
143
|
+
let lastTotal = 0;
|
|
144
|
+
for (const delay of delays) {
|
|
145
|
+
if (delay > 0) {
|
|
146
|
+
const sleepResult = await raceAbort(sleep(delay), abortSignal);
|
|
147
|
+
if (sleepResult === ABORT)
|
|
148
|
+
return lastTotal;
|
|
149
|
+
}
|
|
150
|
+
const result = await raceAbort(client.dataset(run.defaultDatasetId).listItems({ limit: ITEM_COUNT_PROBE_LIMIT }), abortSignal);
|
|
151
|
+
if (result === ABORT)
|
|
152
|
+
return lastTotal;
|
|
153
|
+
lastTotal = (_a = result.total) !== null && _a !== void 0 ? _a : 0;
|
|
154
|
+
if (lastTotal > 0)
|
|
155
|
+
return lastTotal;
|
|
156
|
+
}
|
|
157
|
+
return lastTotal;
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
log.warning('itemCount lag-fallback probe failed', { datasetId: run.defaultDatasetId, mcpSessionId, errMessage: errMessage(error) });
|
|
161
|
+
return datasetMeta.itemCount;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
async function actorNameForActorId(client, actorId, mcpSessionId) {
|
|
165
|
+
if (!actorId)
|
|
166
|
+
return undefined;
|
|
167
|
+
try {
|
|
168
|
+
const actor = await client.actor(actorId).get();
|
|
169
|
+
return actor ? `${actor.username}/${actor.name}` : undefined;
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
log.warning('Failed to fetch actor name', { actId: actorId, mcpSessionId, errMessage: errMessage(error) });
|
|
173
|
+
return undefined;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// -----------------------------------------------------------------------------
|
|
177
|
+
// Status templates — one summary + nextStep per Apify status
|
|
178
|
+
// -----------------------------------------------------------------------------
|
|
179
|
+
function elapsedSecs(run) {
|
|
180
|
+
if (!run.startedAt)
|
|
181
|
+
return 0;
|
|
182
|
+
const startedAtMs = run.startedAt instanceof Date ? run.startedAt.getTime() : new Date(run.startedAt).getTime();
|
|
183
|
+
return Math.max(0, Math.round((Date.now() - startedAtMs) / 1000));
|
|
184
|
+
}
|
|
185
|
+
function pollHint(runId) {
|
|
186
|
+
return `Use ${HelperTools.ACTOR_RUNS_GET} with runId=${runId} and waitSecs=${POLL_HINT_WAIT_SECS} to`;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Render an upstream `statusMessage` as a clearly-attributed suffix (` Actor status: "..."`).
|
|
190
|
+
* Attribution prevents readers from mistaking the upstream message (which can be stale relative
|
|
191
|
+
* to elapsed time) for our own narrative; the trailing period is stripped so the surrounding
|
|
192
|
+
* template's period doesn't produce `..`.
|
|
193
|
+
*/
|
|
194
|
+
function statusMessageLine(statusMessage) {
|
|
195
|
+
if (!statusMessage)
|
|
196
|
+
return '';
|
|
197
|
+
const trimmed = statusMessage.trim().replace(/\.+$/, '');
|
|
198
|
+
if (!trimmed)
|
|
199
|
+
return '';
|
|
200
|
+
return ` Actor status: "${trimmed}".`;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Suffix surfacing partial dataset progress on non-terminal runs (e.g. " 127 results so far.").
|
|
204
|
+
* Empty when the count is unknown or zero so callers don't see "0 results so far" on early polls.
|
|
205
|
+
* Worded generically — Actors aren't always scraping; "results" reads naturally for any output.
|
|
206
|
+
*/
|
|
207
|
+
function progressSuffix(dataset) {
|
|
208
|
+
const n = dataset === null || dataset === void 0 ? void 0 : dataset.itemCount;
|
|
209
|
+
if (n === undefined || n === 0)
|
|
210
|
+
return '';
|
|
211
|
+
return ` ${n} ${n === 1 ? 'result' : 'results'} so far.`;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* `buildRunKeyValueStore` omits `keyCount` on truncation; surface that as "at least N keys"
|
|
215
|
+
* instead of silently substituting `keys.length`.
|
|
216
|
+
*/
|
|
217
|
+
function summarizeKv(keyValueStore) {
|
|
218
|
+
var _a;
|
|
219
|
+
const kvId = keyValueStore === null || keyValueStore === void 0 ? void 0 : keyValueStore.id;
|
|
220
|
+
const keys = (_a = keyValueStore === null || keyValueStore === void 0 ? void 0 : keyValueStore.keys) !== null && _a !== void 0 ? _a : [];
|
|
221
|
+
if (!kvId || keys.length === 0) {
|
|
222
|
+
return { hasKv: false, summarySuffix: '' };
|
|
223
|
+
}
|
|
224
|
+
const reportedKeyCount = keyValueStore.keyCount;
|
|
225
|
+
const kvTruncated = reportedKeyCount === undefined && keys.length === KV_KEYS_LIMIT;
|
|
226
|
+
const n = reportedKeyCount !== null && reportedKeyCount !== void 0 ? reportedKeyCount : keys.length;
|
|
227
|
+
const keyCountLabel = kvTruncated ? `at least ${KV_KEYS_LIMIT} keys` : `${n} ${n === 1 ? 'key' : 'keys'}`;
|
|
228
|
+
return { hasKv: true, kvId, keys, keyCountLabel, summarySuffix: ` Key-value store has ${keyCountLabel}.` };
|
|
229
|
+
}
|
|
230
|
+
// TODO: Apify's fields list expands array indices (e.g. `entities.hashtags.0.text`,
|
|
231
|
+
// `entities.hashtags.1.text`, ... `entities.hashtags.14.text`), so deeply-nested or array-heavy
|
|
232
|
+
// schemas balloon into hundreds of paths and bloat nextStep. Real example: a Twitter dataset
|
|
233
|
+
// returned 174 expanded paths for ~30 unique schema fields. Two viable fixes — collapse `.N`
|
|
234
|
+
// segments to the array root (`entities.hashtags`) and dedupe (all paths stay projection-valid,
|
|
235
|
+
// schema detail lost inside arrays), or collapse `.N.` to `[]` (preserves shape but produces
|
|
236
|
+
// paths that aren't directly valid for `fields="..."`). Deferred pending a real-world choice.
|
|
237
|
+
function fieldsProjectionHint(fields) {
|
|
238
|
+
if (!fields || fields.length === 0)
|
|
239
|
+
return '';
|
|
240
|
+
return ` Available fields (dot notation): ${fields.join(', ')} — pass via fields="..." to project.`;
|
|
241
|
+
}
|
|
242
|
+
function buildSucceededSummaryNextStep(runTimeSecs, statusMessage, dataset, keyValueStore) {
|
|
243
|
+
var _a;
|
|
244
|
+
const itemCount = dataset === null || dataset === void 0 ? void 0 : dataset.itemCount;
|
|
245
|
+
const datasetId = dataset === null || dataset === void 0 ? void 0 : dataset.id;
|
|
246
|
+
const kv = summarizeKv(keyValueStore);
|
|
247
|
+
// Dataset is primary. nextStep stays dataset-only (one primary action) but the summary mentions
|
|
248
|
+
// KV when both exist so the caller can see the run also produced key-value records.
|
|
249
|
+
if (itemCount !== undefined && itemCount > 0 && datasetId) {
|
|
250
|
+
const fields = (_a = dataset === null || dataset === void 0 ? void 0 : dataset.fields) !== null && _a !== void 0 ? _a : [];
|
|
251
|
+
return {
|
|
252
|
+
summary: `SUCCEEDED in ${runTimeSecs}s. ${itemCount} ${itemCount === 1 ? 'item' : 'items'}; ${fields.length} fields available.${kv.summarySuffix}`,
|
|
253
|
+
nextStep: `Use ${HelperTools.DATASET_GET_ITEMS} with datasetId=${datasetId} and limit=20 to fetch items (${itemCount} total).${fieldsProjectionHint(fields)}`,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
// datasetId known but metadata unavailable (transient fetch failure on a terminal run). Don't
|
|
257
|
+
// claim "no output found" — point the agent at dataset items so they can verify directly.
|
|
258
|
+
if (itemCount === undefined && datasetId) {
|
|
259
|
+
return {
|
|
260
|
+
summary: `SUCCEEDED in ${runTimeSecs}s. Dataset metadata unavailable.${statusMessageLine(statusMessage)}${kv.summarySuffix}`,
|
|
261
|
+
nextStep: `Use ${HelperTools.DATASET_GET_ITEMS} with datasetId=${datasetId} and limit=20 to inspect output.`,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
// Metadata can report itemCount === 0 briefly after SUCCEEDED (eventual consistency). Surface the
|
|
265
|
+
// same fetch-first guidance as TIMED-OUT with an empty partial dataset — never imply "re-run only".
|
|
266
|
+
if (itemCount === 0 && datasetId) {
|
|
267
|
+
return {
|
|
268
|
+
summary: `SUCCEEDED in ${runTimeSecs}s. No dataset items found.${statusMessageLine(statusMessage)}${kv.summarySuffix}`,
|
|
269
|
+
nextStep: `Use ${HelperTools.DATASET_GET_ITEMS} with datasetId=${datasetId} and limit=20 to verify output (metadata reports 0 items).${fieldsProjectionHint(dataset === null || dataset === void 0 ? void 0 : dataset.fields)}`,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
// KV store is rarely the primary output for Apify actors (mostly SDK state / intermediate data),
|
|
273
|
+
// so we don't recommend it as `nextStep` — but `kv.summarySuffix` keeps it visible in the summary
|
|
274
|
+
// when records exist, so callers can still discover them. Surface the upstream statusMessage so
|
|
275
|
+
// a text-only reader sees the actor's own diagnostic (often the only signal here).
|
|
276
|
+
return {
|
|
277
|
+
summary: `SUCCEEDED in ${runTimeSecs}s. No dataset items found.${statusMessageLine(statusMessage)}${kv.summarySuffix}`,
|
|
278
|
+
nextStep: `Inspect statusMessage and stats in this response; if the missing output was unexpected, re-run ${HelperTools.ACTOR_CALL} with adjusted input.`,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
function buildTimedOutSummaryNextStep(runTimeSecs, dataset, keyValueStore) {
|
|
282
|
+
var _a, _b;
|
|
283
|
+
const datasetId = dataset === null || dataset === void 0 ? void 0 : dataset.id;
|
|
284
|
+
const kv = summarizeKv(keyValueStore);
|
|
285
|
+
// TIMED-OUT branches on `datasetId` (not `itemCount > 0`) so an empty partial dataset is still
|
|
286
|
+
// surfaced as the primary follow-up — partial output is the diagnostic signal here.
|
|
287
|
+
if (datasetId) {
|
|
288
|
+
const itemCount = (_a = dataset === null || dataset === void 0 ? void 0 : dataset.itemCount) !== null && _a !== void 0 ? _a : 0;
|
|
289
|
+
const fields = (_b = dataset === null || dataset === void 0 ? void 0 : dataset.fields) !== null && _b !== void 0 ? _b : [];
|
|
290
|
+
return {
|
|
291
|
+
summary: `TIMED-OUT after ${runTimeSecs}s.${kv.summarySuffix}`,
|
|
292
|
+
nextStep: `Use ${HelperTools.DATASET_GET_ITEMS} with datasetId=${datasetId} and limit=20 to fetch any partial output (${itemCount} ${itemCount === 1 ? 'item' : 'items'} written). Available fields: ${fields.length > 0 ? fields.join(', ') : 'none'}.`,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
return {
|
|
296
|
+
summary: `TIMED-OUT after ${runTimeSecs}s.${kv.summarySuffix}`,
|
|
297
|
+
nextStep: `Inspect statusMessage and stats in this response; the run produced no dataset to fetch.`,
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Build {summary, nextStep} per status. Returns one primary action — never two.
|
|
302
|
+
*/
|
|
303
|
+
export function buildStatusSummaryNextStep(params) {
|
|
304
|
+
var _a, _b;
|
|
305
|
+
const { run, dataset, keyValueStore } = params;
|
|
306
|
+
const { id: runId, status, statusMessage } = run;
|
|
307
|
+
// The platform usually populates stats.runTimeSecs on terminal runs, but not always (e.g.
|
|
308
|
+
// ABORTED before stats flushed). Fall back to `elapsedSecs(run)` so summaries don't render
|
|
309
|
+
// as literal "undefined".
|
|
310
|
+
const runTimeSecs = (_b = (_a = run.stats) === null || _a === void 0 ? void 0 : _a.runTimeSecs) !== null && _b !== void 0 ? _b : elapsedSecs(run);
|
|
311
|
+
switch (status) {
|
|
312
|
+
case 'READY':
|
|
313
|
+
return {
|
|
314
|
+
summary: `READY. Run ${runId} was created and is about to start.`,
|
|
315
|
+
nextStep: `${pollHint(runId)} wait for progress.`,
|
|
316
|
+
};
|
|
317
|
+
case 'RUNNING':
|
|
318
|
+
return {
|
|
319
|
+
summary: `RUNNING for ${elapsedSecs(run)}s.${statusMessageLine(statusMessage) || ' In progress.'}${progressSuffix(dataset)}`,
|
|
320
|
+
nextStep: `${pollHint(runId)} poll for completion.`,
|
|
321
|
+
};
|
|
322
|
+
case 'TIMING-OUT':
|
|
323
|
+
return {
|
|
324
|
+
summary: `TIMING-OUT after ${elapsedSecs(run)}s.${statusMessageLine(statusMessage) || ' Run-time limit reached; cleanup in progress.'}${progressSuffix(dataset)}`,
|
|
325
|
+
nextStep: `${pollHint(runId)} observe terminal state.`,
|
|
326
|
+
};
|
|
327
|
+
case 'ABORTING':
|
|
328
|
+
return {
|
|
329
|
+
summary: `ABORTING after ${elapsedSecs(run)}s.${statusMessageLine(statusMessage) || ' Cancellation in progress.'}${progressSuffix(dataset)}`,
|
|
330
|
+
nextStep: `${pollHint(runId)} observe terminal state.`,
|
|
331
|
+
};
|
|
332
|
+
case 'SUCCEEDED':
|
|
333
|
+
return buildSucceededSummaryNextStep(runTimeSecs, statusMessage, dataset, keyValueStore);
|
|
334
|
+
case 'FAILED':
|
|
335
|
+
return {
|
|
336
|
+
summary: `FAILED after ${runTimeSecs}s.${statusMessageLine(statusMessage)}`,
|
|
337
|
+
nextStep: `Diagnose using statusMessage and exitCode in this response; re-run ${HelperTools.ACTOR_CALL} with adjusted input if the cause is fixable.`,
|
|
338
|
+
};
|
|
339
|
+
case 'ABORTED':
|
|
340
|
+
return {
|
|
341
|
+
summary: `ABORTED after ${runTimeSecs}s.${statusMessageLine(statusMessage)}`,
|
|
342
|
+
nextStep: `Use ${HelperTools.ACTOR_CALL} again if you want to rerun the Actor.`,
|
|
343
|
+
};
|
|
344
|
+
case 'TIMED-OUT':
|
|
345
|
+
return buildTimedOutSummaryNextStep(runTimeSecs, dataset, keyValueStore);
|
|
346
|
+
default:
|
|
347
|
+
return {
|
|
348
|
+
summary: `${status}. Run ${runId}.`,
|
|
349
|
+
nextStep: `${pollHint(runId)} check current state.`,
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Wait for an Actor run to reach a terminal state, racing against an optional client abort signal.
|
|
355
|
+
*
|
|
356
|
+
* `onAbort` is invoked when the client cancels the request mid-wait, before the function returns
|
|
357
|
+
* `{ kind: 'aborted' }`. Callers that need to cancel the underlying run on client abort pass it;
|
|
358
|
+
* read-only callers omit it.
|
|
359
|
+
*/
|
|
360
|
+
async function waitForRunWithProgress(opts) {
|
|
361
|
+
var _a, _b, _c;
|
|
362
|
+
const { client, runId, waitSecs, progressTracker, abortSignal, mcpSessionId, onAbort } = opts;
|
|
363
|
+
if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) {
|
|
364
|
+
await (onAbort === null || onAbort === void 0 ? void 0 : onAbort(runId, client));
|
|
365
|
+
return { kind: 'aborted' };
|
|
366
|
+
}
|
|
367
|
+
// Race the initial run.get() against the abort signal so a mid-call cancel returns promptly
|
|
368
|
+
// instead of blocking on the HTTP fetch (the SDK does not accept an AbortSignal directly).
|
|
369
|
+
const initial = await raceAbort(client.run(runId).get(), abortSignal);
|
|
370
|
+
if (initial === ABORT) {
|
|
371
|
+
await (onAbort === null || onAbort === void 0 ? void 0 : onAbort(runId, client));
|
|
372
|
+
return { kind: 'aborted' };
|
|
373
|
+
}
|
|
374
|
+
if (!initial)
|
|
375
|
+
return { kind: 'not-found' };
|
|
376
|
+
let run = initial;
|
|
377
|
+
// Callers that already know the actor name (e.g. `call-actor` just started the run) supply it to
|
|
378
|
+
// skip the lookup entirely. Otherwise kick off the fetch in parallel with the wait/progress branch
|
|
379
|
+
// below — it's only strictly needed for the progressTracker label and the response field.
|
|
380
|
+
const actorNamePromise = opts.actorName !== undefined
|
|
381
|
+
? Promise.resolve(opts.actorName)
|
|
382
|
+
: actorNameForActorId(client, run.actId, mcpSessionId);
|
|
383
|
+
if ((waitSecs === undefined || waitSecs > 0) && !TERMINAL_RUN_STATUSES.has(run.status)) {
|
|
384
|
+
if (progressTracker) {
|
|
385
|
+
const trackerLabel = (_a = (await actorNamePromise)) !== null && _a !== void 0 ? _a : 'actor';
|
|
386
|
+
await progressTracker.updateProgress(formatRunStatusMessage(trackerLabel, run));
|
|
387
|
+
progressTracker.startActorRunUpdates(runId, client, trackerLabel, run);
|
|
388
|
+
}
|
|
389
|
+
// Race waitForFinish against the client's abort signal so a cancelled request returns
|
|
390
|
+
// promptly instead of blocking up to `waitSecs`. Behavior on abort is delegated to `onAbort`.
|
|
391
|
+
let raced;
|
|
392
|
+
try {
|
|
393
|
+
raced = await raceAbort(client.run(runId).waitForFinish({ waitSecs }), abortSignal);
|
|
394
|
+
}
|
|
395
|
+
finally {
|
|
396
|
+
progressTracker === null || progressTracker === void 0 ? void 0 : progressTracker.stop();
|
|
397
|
+
}
|
|
398
|
+
if (raced === ABORT) {
|
|
399
|
+
await (onAbort === null || onAbort === void 0 ? void 0 : onAbort(runId, client));
|
|
400
|
+
return { kind: 'aborted' };
|
|
401
|
+
}
|
|
402
|
+
run = raced;
|
|
403
|
+
// The platform may write the final statusMessage just after the status flips; re-fetch on
|
|
404
|
+
// terminal so the response (and any final progress emission) sees the freshest snapshot.
|
|
405
|
+
if (TERMINAL_RUN_STATUSES.has(run.status)) {
|
|
406
|
+
const finalRun = (_b = (await client.run(runId).get().catch(() => undefined))) !== null && _b !== void 0 ? _b : run;
|
|
407
|
+
if (progressTracker) {
|
|
408
|
+
await progressTracker.updateProgress(formatRunStatusMessage((_c = (await actorNamePromise)) !== null && _c !== void 0 ? _c : 'actor', finalRun));
|
|
409
|
+
}
|
|
410
|
+
run = finalRun;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
return { kind: 'ok', run, actorName: await actorNamePromise };
|
|
414
|
+
}
|
|
415
|
+
// -----------------------------------------------------------------------------
|
|
416
|
+
// Immediate start response — for callers that return without waiting
|
|
417
|
+
// -----------------------------------------------------------------------------
|
|
418
|
+
/**
|
|
419
|
+
* Build a RunResponse from an already-started ActorRun without waiting.
|
|
420
|
+
* Used when waitSecs=0 (default and apps modes) and by widget variants that return immediately.
|
|
421
|
+
* Storage metadata contains IDs only; pollers/widgets fetch updates via get-actor-run.
|
|
422
|
+
*
|
|
423
|
+
* Pass `widget: true` for widget-rendered responses: nextStep is replaced with a no-poll
|
|
424
|
+
* message and widget _meta is included so the UI renders automatically.
|
|
425
|
+
*
|
|
426
|
+
* Invariant: `widget: true` is only valid from `*-widget` tools. Non-widget tools (call-actor,
|
|
427
|
+
* direct actor tools) must omit it or pass `false`.
|
|
428
|
+
*/
|
|
429
|
+
export function buildStartRunResponse(params) {
|
|
430
|
+
var _a, _b;
|
|
431
|
+
const { actorName, actorRun, widget } = params;
|
|
432
|
+
const dataset = actorRun.defaultDatasetId ? { id: actorRun.defaultDatasetId } : undefined;
|
|
433
|
+
const keyValueStore = actorRun.defaultKeyValueStoreId ? { id: actorRun.defaultKeyValueStoreId } : undefined;
|
|
434
|
+
const { summary, nextStep: computedNextStep } = buildStatusSummaryNextStep({
|
|
435
|
+
run: actorRun,
|
|
436
|
+
dataset,
|
|
437
|
+
keyValueStore,
|
|
438
|
+
});
|
|
439
|
+
const nextStep = widget ? WIDGET_NO_POLL_NEXT_STEP : computedNextStep;
|
|
440
|
+
const structuredContent = {
|
|
441
|
+
runId: actorRun.id,
|
|
442
|
+
actorId: actorRun.actId,
|
|
443
|
+
actorName,
|
|
444
|
+
status: actorRun.status,
|
|
445
|
+
startedAt: toIsoString(actorRun.startedAt),
|
|
446
|
+
storages: {
|
|
447
|
+
...(dataset && { datasets: { default: dataset } }),
|
|
448
|
+
...(keyValueStore && { keyValueStores: { default: keyValueStore } }),
|
|
449
|
+
},
|
|
450
|
+
summary,
|
|
451
|
+
nextStep,
|
|
452
|
+
};
|
|
453
|
+
const widgetMeta = widget
|
|
454
|
+
? {
|
|
455
|
+
...((_b = (_a = getWidgetConfig(WIDGET_URIS.ACTOR_RUN)) === null || _a === void 0 ? void 0 : _a.meta) !== null && _b !== void 0 ? _b : {}),
|
|
456
|
+
'openai/widgetDescription': `Actor run progress for ${actorName}`,
|
|
457
|
+
}
|
|
458
|
+
: undefined;
|
|
459
|
+
return buildMCPResponse({
|
|
460
|
+
texts: [JSON.stringify(structuredContent), `${summary}\n${nextStep}`],
|
|
461
|
+
structuredContent,
|
|
462
|
+
...(widgetMeta && { _meta: widgetMeta }),
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
// -----------------------------------------------------------------------------
|
|
466
|
+
// Main fetch — used by both default and widget variants
|
|
467
|
+
// -----------------------------------------------------------------------------
|
|
468
|
+
/**
|
|
469
|
+
* Default `onAbort` for callers that want the run cancelled when the MCP request is cancelled.
|
|
470
|
+
* Logs and swallows abort failures so a transient API error doesn't override the original
|
|
471
|
+
* cancellation result.
|
|
472
|
+
*/
|
|
473
|
+
export const abortRunOnSignal = async (runId, client) => {
|
|
474
|
+
await client.run(runId).abort({ gracefully: false }).catch((error) => {
|
|
475
|
+
logHttpError(error, 'Error aborting Actor run', { runId });
|
|
476
|
+
});
|
|
477
|
+
};
|
|
478
|
+
export async function fetchActorRunData(params) {
|
|
479
|
+
var _a, _b;
|
|
480
|
+
const { runId, waitSecs, client, progressTracker, abortSignal, mcpSessionId, onAbort } = params;
|
|
481
|
+
const waitResult = await waitForRunWithProgress({
|
|
482
|
+
client, runId, waitSecs, actorName: params.actorName, progressTracker, abortSignal, mcpSessionId, onAbort,
|
|
483
|
+
});
|
|
484
|
+
if (waitResult.kind === 'aborted')
|
|
485
|
+
return { aborted: true };
|
|
486
|
+
if (waitResult.kind === 'not-found') {
|
|
487
|
+
return {
|
|
488
|
+
error: buildMCPResponse({
|
|
489
|
+
texts: [`Run with ID '${runId}' not found.`],
|
|
490
|
+
isError: true,
|
|
491
|
+
telemetry: { toolStatus: TOOL_STATUS.SOFT_FAIL, failureCategory: FAILURE_CATEGORY.INVALID_INPUT },
|
|
492
|
+
}),
|
|
493
|
+
};
|
|
494
|
+
}
|
|
495
|
+
const { run, actorName } = waitResult;
|
|
496
|
+
log.debug('Get Actor run', { runId, status: run.status, mcpSessionId, waitSecs });
|
|
497
|
+
let datasetInfo = null;
|
|
498
|
+
let kvListResult = null;
|
|
499
|
+
// Dataset metadata is fetched on every poll (not just terminal) so the summary can surface
|
|
500
|
+
// partial progress on long-running scrapes (e.g. "127 results so far"), giving polling agents
|
|
501
|
+
// real movement instead of the same "In progress." each cycle. The extra round-trip is the
|
|
502
|
+
// accepted UX tradeoff. KV listKeys stays terminal-only — non-terminal summaries don't
|
|
503
|
+
// reference KV records, so fetching them on every poll would be pure waste on the hot path.
|
|
504
|
+
// Per-promise catches: a single transient metadata fetch failure must not hard-fail the
|
|
505
|
+
// whole call. The response still carries the storage id, which is enough for the agent
|
|
506
|
+
// to fetch items / records directly.
|
|
507
|
+
const isTerminal = TERMINAL_RUN_STATUSES.has(run.status);
|
|
508
|
+
const [datasetFetched, kvFetched] = await Promise.all([
|
|
509
|
+
run.defaultDatasetId
|
|
510
|
+
? client.dataset(run.defaultDatasetId).get().catch((error) => {
|
|
511
|
+
log.warning('Failed to fetch dataset metadata', { datasetId: run.defaultDatasetId, mcpSessionId, errMessage: errMessage(error) });
|
|
512
|
+
return null;
|
|
513
|
+
})
|
|
514
|
+
: Promise.resolve(null),
|
|
515
|
+
run.defaultKeyValueStoreId && isTerminal
|
|
516
|
+
? client.keyValueStore(run.defaultKeyValueStoreId).listKeys({ limit: KV_KEYS_LIMIT }).catch((error) => {
|
|
517
|
+
log.warning('Failed to list KV store keys', {
|
|
518
|
+
keyValueStoreId: run.defaultKeyValueStoreId,
|
|
519
|
+
mcpSessionId,
|
|
520
|
+
errMessage: errMessage(error),
|
|
521
|
+
});
|
|
522
|
+
return null;
|
|
523
|
+
})
|
|
524
|
+
: Promise.resolve(null),
|
|
525
|
+
]);
|
|
526
|
+
datasetInfo = datasetFetched !== null && datasetFetched !== void 0 ? datasetFetched : null;
|
|
527
|
+
kvListResult = kvFetched !== null && kvFetched !== void 0 ? kvFetched : null;
|
|
528
|
+
const resolvedItemCount = await resolveItemCountWithLagFallback(client, run, datasetInfo, waitSecs, mcpSessionId, abortSignal);
|
|
529
|
+
const dataset = buildRunDataset(run, datasetInfo, resolvedItemCount);
|
|
530
|
+
const keyValueStore = buildRunKeyValueStore(run, kvListResult);
|
|
531
|
+
const { summary, nextStep } = buildStatusSummaryNextStep({ run, dataset, keyValueStore });
|
|
532
|
+
const structuredContent = {
|
|
533
|
+
runId: run.id,
|
|
534
|
+
actorId: run.actId,
|
|
535
|
+
actorName,
|
|
536
|
+
status: run.status,
|
|
537
|
+
statusMessage: (_a = run.statusMessage) !== null && _a !== void 0 ? _a : undefined,
|
|
538
|
+
exitCode: (_b = run.exitCode) !== null && _b !== void 0 ? _b : undefined,
|
|
539
|
+
startedAt: toIsoString(run.startedAt),
|
|
540
|
+
finishedAt: toIsoString(run.finishedAt),
|
|
541
|
+
stats: buildStats(run),
|
|
542
|
+
storages: {
|
|
543
|
+
...(dataset && { datasets: { default: dataset } }),
|
|
544
|
+
...(keyValueStore && { keyValueStores: { default: keyValueStore } }),
|
|
545
|
+
},
|
|
546
|
+
summary,
|
|
547
|
+
nextStep,
|
|
548
|
+
};
|
|
549
|
+
return { result: { run, structuredContent } };
|
|
550
|
+
}
|
|
551
|
+
//# sourceMappingURL=actor_run_response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actor_run_response.js","sourceRoot":"","sources":["../../../src/tools/core/actor_run_response.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import type { ApifyClient } from '../../apify_client.js';
|
|
2
2
|
import type { ActorInfo, ActorStore, ApifyToken, ToolEntry } from '../../types.js';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* For each direct actor tool with a known historical item schema, replaces the generic
|
|
5
|
+
* `getActorRunOutputSchema` with a per-tool variant that declares
|
|
6
|
+
* `storages.datasets.default.itemsSchema` — letting an LLM plan field projection from
|
|
7
|
+
* `tools/list` alone, before any call.
|
|
8
|
+
*
|
|
9
|
+
* Uses `Promise.allSettled` so a single store failure doesn't block other tools. Individual
|
|
10
|
+
* misses (null / empty properties / thrown errors) leave the tool on the generic schema.
|
|
6
11
|
*/
|
|
7
12
|
export declare function enrichActorToolOutputSchemas(tools: ToolEntry[], actorStore: ActorStore): Promise<void>;
|
|
8
13
|
/**
|
|
@@ -23,7 +28,7 @@ export declare function enrichActorToolOutputSchemas(tools: ToolEntry[], actorSt
|
|
|
23
28
|
* 5. Enums are added to descriptions with examples using addEnumsToDescriptionsWithExamples()
|
|
24
29
|
*
|
|
25
30
|
* @param {ActorInfo[]} actorsInfo - An array of ActorInfo objects with webServerMcpPath, definition, and Actor.
|
|
26
|
-
* @param options - Optional settings: mcpSessionId for telemetry correlation, actorStore for
|
|
31
|
+
* @param options - Optional settings: mcpSessionId for telemetry correlation, actorStore for per-Actor itemsSchema enrichment.
|
|
27
32
|
* @returns {Promise<ToolEntry[]>} - A promise that resolves to an array of MCP tools.
|
|
28
33
|
*/
|
|
29
34
|
export declare function getNormalActorsAsTools(actorsInfo: ActorInfo[], options?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actor_tools_factory.d.ts","sourceRoot":"","sources":["../../../src/tools/core/actor_tools_factory.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAWzD,OAAO,KAAK,EACR,SAAS,EACT,UAAU,EAEV,UAAU,EACV,SAAS,EAEZ,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"actor_tools_factory.d.ts","sourceRoot":"","sources":["../../../src/tools/core/actor_tools_factory.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAWzD,OAAO,KAAK,EACR,SAAS,EACT,UAAU,EAEV,UAAU,EACV,SAAS,EAEZ,MAAM,gBAAgB,CAAC;AAuBxB;;;;;;;;GAQG;AACH,wBAAsB,4BAA4B,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB5G;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,sBAAsB,CACxC,UAAU,EAAE,SAAS,EAAE,EACvB,OAAO,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,UAAU,CAAA;CAAE,GAC7D,OAAO,CAAC,SAAS,EAAE,CAAC,CA+EtB;AAED,wBAAsB,oBAAoB,CACtC,UAAU,EAAE,SAAS,EAAE,EACvB,UAAU,EAAE,UAAU,EACtB,YAAY,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,SAAS,EAAE,CAAC,CAuDtB;AAKD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAUlG;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAY3D;AAED,wBAAsB,gBAAgB,CAClC,eAAe,EAAE,MAAM,EAAE,EACzB,WAAW,EAAE,WAAW,EACxB,OAAO,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,UAAU,CAAA;CAAE,GAC7D,OAAO,CAAC,SAAS,EAAE,CAAC,CAgEtB"}
|