@shardworks/spider-apparatus 0.1.115

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 (50) hide show
  1. package/LICENSE +15 -0
  2. package/dist/engines/draft.d.ts +10 -0
  3. package/dist/engines/draft.d.ts.map +1 -0
  4. package/dist/engines/draft.js +33 -0
  5. package/dist/engines/draft.js.map +1 -0
  6. package/dist/engines/implement.d.ts +12 -0
  7. package/dist/engines/implement.d.ts.map +1 -0
  8. package/dist/engines/implement.js +29 -0
  9. package/dist/engines/implement.js.map +1 -0
  10. package/dist/engines/index.d.ts +6 -0
  11. package/dist/engines/index.d.ts.map +1 -0
  12. package/dist/engines/index.js +6 -0
  13. package/dist/engines/index.js.map +1 -0
  14. package/dist/engines/review.d.ts +17 -0
  15. package/dist/engines/review.d.ts.map +1 -0
  16. package/dist/engines/review.js +140 -0
  17. package/dist/engines/review.js.map +1 -0
  18. package/dist/engines/revise.d.ts +15 -0
  19. package/dist/engines/revise.d.ts.map +1 -0
  20. package/dist/engines/revise.js +90 -0
  21. package/dist/engines/revise.js.map +1 -0
  22. package/dist/engines/seal.d.ts +11 -0
  23. package/dist/engines/seal.d.ts.map +1 -0
  24. package/dist/engines/seal.js +31 -0
  25. package/dist/engines/seal.js.map +1 -0
  26. package/dist/index.d.ts +13 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +13 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/spider.d.ts +20 -0
  31. package/dist/spider.d.ts.map +1 -0
  32. package/dist/spider.js +356 -0
  33. package/dist/spider.js.map +1 -0
  34. package/dist/tools/crawl-continual.d.ts +13 -0
  35. package/dist/tools/crawl-continual.d.ts.map +1 -0
  36. package/dist/tools/crawl-continual.js +63 -0
  37. package/dist/tools/crawl-continual.js.map +1 -0
  38. package/dist/tools/crawl.d.ts +9 -0
  39. package/dist/tools/crawl.d.ts.map +1 -0
  40. package/dist/tools/crawl.js +22 -0
  41. package/dist/tools/crawl.js.map +1 -0
  42. package/dist/tools/index.d.ts +3 -0
  43. package/dist/tools/index.d.ts.map +1 -0
  44. package/dist/tools/index.js +3 -0
  45. package/dist/tools/index.js.map +1 -0
  46. package/dist/types.d.ts +208 -0
  47. package/dist/types.d.ts.map +1 -0
  48. package/dist/types.js +9 -0
  49. package/dist/types.js.map +1 -0
  50. package/package.json +39 -0
package/dist/spider.js ADDED
@@ -0,0 +1,356 @@
1
+ /**
2
+ * The Spider — rig execution engine apparatus.
3
+ *
4
+ * The Spider drives writ-to-completion by managing rigs: ordered pipelines
5
+ * of engine instances. Each crawl() call performs one unit of work:
6
+ *
7
+ * collect > run > spawn (priority order)
8
+ *
9
+ * collect — check running engines for terminal session results
10
+ * run — execute the next pending engine (clockwork inline, quick → launch)
11
+ * spawn — create a new rig for a ready writ with no existing rig
12
+ *
13
+ * CDC on the rigs book (Phase 1 cascade) transitions the associated writ
14
+ * when a rig reaches a terminal state (completed or failed).
15
+ *
16
+ * See: docs/architecture/apparatus/spider.md
17
+ */
18
+ import { guild, generateId } from '@shardworks/nexus-core';
19
+ import { draftEngine, implementEngine, reviewEngine, reviseEngine, sealEngine, } from "./engines/index.js";
20
+ import { crawlTool, crawlContinualTool } from "./tools/index.js";
21
+ // ── Helpers ────────────────────────────────────────────────────────────
22
+ /**
23
+ * Check whether a value is JSON-serializable.
24
+ * Non-serializable yields cause engine failure — the Stacks cannot store them.
25
+ */
26
+ function isJsonSerializable(value) {
27
+ try {
28
+ JSON.stringify(value);
29
+ return true;
30
+ }
31
+ catch {
32
+ return false;
33
+ }
34
+ }
35
+ /**
36
+ * Build the upstream yields map for a rig: all completed engine yields
37
+ * keyed by engine id. Passed as context.upstream to the engine's run().
38
+ */
39
+ function buildUpstreamMap(rig) {
40
+ const upstream = {};
41
+ for (const engine of rig.engines) {
42
+ if (engine.status === 'completed' && engine.yields !== undefined) {
43
+ upstream[engine.id] = engine.yields;
44
+ }
45
+ }
46
+ return upstream;
47
+ }
48
+ /**
49
+ * Find the first pending engine whose entire upstream is completed.
50
+ * Returns null if no runnable engine exists.
51
+ */
52
+ function findRunnableEngine(rig) {
53
+ for (const engine of rig.engines) {
54
+ if (engine.status !== 'pending')
55
+ continue;
56
+ const allUpstreamDone = engine.upstream.every((upstreamId) => {
57
+ const dep = rig.engines.find((e) => e.id === upstreamId);
58
+ return dep?.status === 'completed';
59
+ });
60
+ if (allUpstreamDone)
61
+ return engine;
62
+ }
63
+ return null;
64
+ }
65
+ /**
66
+ * Produce the five-engine static pipeline for a writ.
67
+ * Each engine receives only the givens it needs.
68
+ * Upstream yields arrive via context.upstream at run time.
69
+ */
70
+ function buildStaticEngines(writ, config) {
71
+ const role = config.role ?? 'artificer';
72
+ const reviewGivens = {
73
+ writ,
74
+ role: 'reviewer',
75
+ ...(config.buildCommand !== undefined ? { buildCommand: config.buildCommand } : {}),
76
+ ...(config.testCommand !== undefined ? { testCommand: config.testCommand } : {}),
77
+ };
78
+ return [
79
+ { id: 'draft', designId: 'draft', status: 'pending', upstream: [], givensSpec: { writ } },
80
+ { id: 'implement', designId: 'implement', status: 'pending', upstream: ['draft'], givensSpec: { writ, role } },
81
+ { id: 'review', designId: 'review', status: 'pending', upstream: ['implement'], givensSpec: reviewGivens },
82
+ { id: 'revise', designId: 'revise', status: 'pending', upstream: ['review'], givensSpec: { writ, role } },
83
+ { id: 'seal', designId: 'seal', status: 'pending', upstream: ['revise'], givensSpec: {} },
84
+ ];
85
+ }
86
+ // ── Apparatus factory ──────────────────────────────────────────────────
87
+ export function createSpider() {
88
+ let rigsBook;
89
+ let sessionsBook;
90
+ let writsBook;
91
+ let clerk;
92
+ let fabricator;
93
+ let spiderConfig = {};
94
+ // ── Internal crawl operations ─────────────────────────────────────
95
+ /**
96
+ * Mark an engine failed and propagate failure to the rig (same update).
97
+ */
98
+ async function failEngine(rig, engineId, errorMessage) {
99
+ const now = new Date().toISOString();
100
+ const updatedEngines = rig.engines.map((e) => e.id === engineId
101
+ ? { ...e, status: 'failed', error: errorMessage, completedAt: now }
102
+ : e);
103
+ await rigsBook.patch(rig.id, {
104
+ engines: updatedEngines,
105
+ status: 'failed',
106
+ });
107
+ }
108
+ /**
109
+ * Phase 1 — collect.
110
+ *
111
+ * Find the first running engine with a sessionId whose session has
112
+ * reached a terminal state. Populate yields and advance the engine
113
+ * (and possibly the rig) to completed or failed.
114
+ */
115
+ async function tryCollect() {
116
+ const runningRigs = await rigsBook.find({ where: [['status', '=', 'running']] });
117
+ for (const rig of runningRigs) {
118
+ for (const engine of rig.engines) {
119
+ if (engine.status !== 'running' || !engine.sessionId)
120
+ continue;
121
+ const session = await sessionsBook.get(engine.sessionId);
122
+ if (!session || session.status === 'running')
123
+ continue;
124
+ // Terminal session found — collect.
125
+ const now = new Date().toISOString();
126
+ if (session.status === 'failed' || session.status === 'timeout') {
127
+ await failEngine(rig, engine.id, session.error ?? `Session ${session.status}`);
128
+ return { action: 'rig-completed', rigId: rig.id, writId: rig.writId, outcome: 'failed' };
129
+ }
130
+ // Completed session — assemble engine-specific yields from session record.
131
+ let yields;
132
+ if (engine.id === 'review') {
133
+ // Review collect: parse findings and passed flag from session output;
134
+ // retrieve mechanicalChecks stashed in session metadata by the review engine.
135
+ const findings = session.output ?? '';
136
+ const passed = /^###\s*Overall:\s*PASS/mi.test(findings);
137
+ const mechanicalChecks = session.metadata?.mechanicalChecks ?? [];
138
+ yields = { sessionId: session.id, passed, findings, mechanicalChecks };
139
+ }
140
+ else {
141
+ yields = {
142
+ sessionId: session.id,
143
+ sessionStatus: session.status,
144
+ ...(session.output !== undefined ? { output: session.output } : {}),
145
+ };
146
+ }
147
+ if (!isJsonSerializable(yields)) {
148
+ await failEngine(rig, engine.id, 'Session yields are not JSON-serializable');
149
+ return { action: 'rig-completed', rigId: rig.id, writId: rig.writId, outcome: 'failed' };
150
+ }
151
+ const updatedEngines = rig.engines.map((e) => e.id === engine.id
152
+ ? { ...e, status: 'completed', yields, completedAt: now }
153
+ : e);
154
+ const allCompleted = updatedEngines.every((e) => e.status === 'completed');
155
+ await rigsBook.patch(rig.id, {
156
+ engines: updatedEngines,
157
+ status: allCompleted ? 'completed' : 'running',
158
+ });
159
+ if (allCompleted) {
160
+ return { action: 'rig-completed', rigId: rig.id, writId: rig.writId, outcome: 'completed' };
161
+ }
162
+ return { action: 'engine-completed', rigId: rig.id, engineId: engine.id };
163
+ }
164
+ }
165
+ return null;
166
+ }
167
+ /**
168
+ * Phase 2 — run.
169
+ *
170
+ * Find the first pending engine in any running rig whose upstream is
171
+ * all completed. Execute it:
172
+ * - Clockwork ('completed') → store yields, mark engine completed,
173
+ * check for rig completion.
174
+ * - Quick ('launched') → store sessionId, mark engine running.
175
+ */
176
+ async function tryRun() {
177
+ const runningRigs = await rigsBook.find({ where: [['status', '=', 'running']] });
178
+ for (const rig of runningRigs) {
179
+ const pending = findRunnableEngine(rig);
180
+ if (!pending)
181
+ continue;
182
+ const design = fabricator.getEngineDesign(pending.designId);
183
+ if (!design) {
184
+ await failEngine(rig, pending.id, `No engine design found for "${pending.designId}"`);
185
+ return { action: 'rig-completed', rigId: rig.id, writId: rig.writId, outcome: 'failed' };
186
+ }
187
+ const now = new Date().toISOString();
188
+ const upstream = buildUpstreamMap(rig);
189
+ const givens = { ...pending.givensSpec };
190
+ const context = { engineId: pending.id, upstream };
191
+ let engineResult;
192
+ try {
193
+ // Mark engine as running before executing
194
+ const startedEngines = rig.engines.map((e) => e.id === pending.id ? { ...e, status: 'running', startedAt: now } : e);
195
+ await rigsBook.patch(rig.id, { engines: startedEngines });
196
+ // Re-fetch to get the up-to-date engines list (with startedAt set)
197
+ const updatedRig = { ...rig, engines: startedEngines };
198
+ engineResult = await design.run(givens, context);
199
+ if (engineResult.status === 'launched') {
200
+ // Quick engine — store sessionId, leave engine in 'running'
201
+ const { sessionId } = engineResult;
202
+ const launchedEngines = updatedRig.engines.map((e) => e.id === pending.id
203
+ ? { ...e, status: 'running', sessionId }
204
+ : e);
205
+ await rigsBook.patch(rig.id, { engines: launchedEngines });
206
+ return { action: 'engine-started', rigId: rig.id, engineId: pending.id };
207
+ }
208
+ // Clockwork engine — validate and store yields
209
+ const { yields } = engineResult;
210
+ if (!isJsonSerializable(yields)) {
211
+ await failEngine(updatedRig, pending.id, 'Engine yields are not JSON-serializable');
212
+ return { action: 'rig-completed', rigId: rig.id, writId: rig.writId, outcome: 'failed' };
213
+ }
214
+ const completedAt = new Date().toISOString();
215
+ const completedEngines = updatedRig.engines.map((e) => e.id === pending.id
216
+ ? { ...e, status: 'completed', yields, completedAt }
217
+ : e);
218
+ const allCompleted = completedEngines.every((e) => e.status === 'completed');
219
+ await rigsBook.patch(rig.id, {
220
+ engines: completedEngines,
221
+ status: allCompleted ? 'completed' : 'running',
222
+ });
223
+ if (allCompleted) {
224
+ return { action: 'rig-completed', rigId: rig.id, writId: rig.writId, outcome: 'completed' };
225
+ }
226
+ return { action: 'engine-completed', rigId: rig.id, engineId: pending.id };
227
+ }
228
+ catch (err) {
229
+ const errorMessage = err instanceof Error ? err.message : String(err);
230
+ await failEngine(rig, pending.id, errorMessage);
231
+ return { action: 'rig-completed', rigId: rig.id, writId: rig.writId, outcome: 'failed' };
232
+ }
233
+ }
234
+ return null;
235
+ }
236
+ /**
237
+ * Phase 3 — spawn.
238
+ *
239
+ * Find the oldest ready writ with no existing rig. Create a rig and
240
+ * transition the writ to active so the Clerk tracks it as in-progress.
241
+ */
242
+ async function trySpawn() {
243
+ // Find ready writs ordered by creation time (oldest first)
244
+ const readyWrits = await writsBook.find({
245
+ where: [['status', '=', 'ready']],
246
+ orderBy: ['createdAt', 'asc'],
247
+ limit: 10,
248
+ });
249
+ for (const writ of readyWrits) {
250
+ // Check for existing rig
251
+ const existing = await rigsBook.find({
252
+ where: [['writId', '=', writ.id]],
253
+ limit: 1,
254
+ });
255
+ if (existing.length > 0)
256
+ continue;
257
+ const rigId = generateId('rig', 4);
258
+ const engines = buildStaticEngines(writ, spiderConfig);
259
+ const rig = {
260
+ id: rigId,
261
+ writId: writ.id,
262
+ status: 'running',
263
+ engines,
264
+ };
265
+ await rigsBook.put(rig);
266
+ // Transition writ to active so Clerk tracks it
267
+ try {
268
+ await clerk.transition(writ.id, 'active');
269
+ }
270
+ catch (err) {
271
+ // Only swallow state-transition conflicts (writ already moved past 'ready')
272
+ if (err instanceof Error && err.message.includes('transition')) {
273
+ // Race condition — another spider got here first. The rig is already created,
274
+ // so we continue. The writ is already active or beyond.
275
+ }
276
+ else {
277
+ throw err;
278
+ }
279
+ }
280
+ return { action: 'rig-spawned', rigId, writId: writ.id };
281
+ }
282
+ return null;
283
+ }
284
+ // ── SpiderApi ─────────────────────────────────────────────────────
285
+ const api = {
286
+ async crawl() {
287
+ const collected = await tryCollect();
288
+ if (collected)
289
+ return collected;
290
+ const ran = await tryRun();
291
+ if (ran)
292
+ return ran;
293
+ const spawned = await trySpawn();
294
+ if (spawned)
295
+ return spawned;
296
+ return null;
297
+ },
298
+ };
299
+ // ── Apparatus ─────────────────────────────────────────────────────
300
+ return {
301
+ apparatus: {
302
+ requires: ['stacks', 'clerk', 'fabricator'],
303
+ supportKit: {
304
+ books: {
305
+ rigs: {
306
+ indexes: ['status', 'writId', ['status', 'writId']],
307
+ },
308
+ },
309
+ engines: {
310
+ draft: draftEngine,
311
+ implement: implementEngine,
312
+ review: reviewEngine,
313
+ revise: reviseEngine,
314
+ seal: sealEngine,
315
+ },
316
+ tools: [crawlTool, crawlContinualTool],
317
+ },
318
+ provides: api,
319
+ start(_ctx) {
320
+ const g = guild();
321
+ spiderConfig = g.guildConfig().spider ?? {};
322
+ const stacks = g.apparatus('stacks');
323
+ clerk = g.apparatus('clerk');
324
+ fabricator = g.apparatus('fabricator');
325
+ rigsBook = stacks.book('spider', 'rigs');
326
+ sessionsBook = stacks.readBook('animator', 'sessions');
327
+ writsBook = stacks.readBook('clerk', 'writs');
328
+ // CDC — Phase 1 cascade on rigs book.
329
+ // When a rig reaches a terminal state, transition the associated writ.
330
+ stacks.watch('spider', 'rigs', async (event) => {
331
+ if (event.type !== 'update')
332
+ return;
333
+ const rig = event.entry;
334
+ const prev = event.prev;
335
+ // Only act when status changes to a terminal state
336
+ if (rig.status === prev.status)
337
+ return;
338
+ if (rig.status === 'completed') {
339
+ // Use seal yields as the resolution summary
340
+ const sealEngine = rig.engines.find((e) => e.id === 'seal');
341
+ const resolution = sealEngine?.yields
342
+ ? JSON.stringify(sealEngine.yields)
343
+ : 'Rig completed';
344
+ await clerk.transition(rig.writId, 'completed', { resolution });
345
+ }
346
+ else if (rig.status === 'failed') {
347
+ const failedEngine = rig.engines.find((e) => e.status === 'failed');
348
+ const resolution = failedEngine?.error ?? 'Engine failure';
349
+ await clerk.transition(rig.writId, 'failed', { resolution });
350
+ }
351
+ }, { failOnError: true });
352
+ },
353
+ },
354
+ };
355
+ }
356
+ //# sourceMappingURL=spider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spider.js","sourceRoot":"","sources":["../src/spider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAc3D,OAAO,EACL,WAAW,EACX,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,UAAU,GACX,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEjE,0EAA0E;AAE1E;;;GAGG;AACH,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,GAAW;IACnC,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAC7C,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QACtC,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAS,kBAAkB,CAAC,GAAW;IACrC,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;YAAE,SAAS;QAC1C,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,EAAE;YAC3D,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;YACzD,OAAO,GAAG,EAAE,MAAM,KAAK,WAAW,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,IAAI,eAAe;YAAE,OAAO,MAAM,CAAC;IACrC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,IAAa,EAAE,MAAoB;IAC7D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,WAAW,CAAC;IACxC,MAAM,YAAY,GAA4B;QAC5C,IAAI;QACJ,IAAI,EAAE,UAAU;QAChB,GAAG,CAAC,MAAM,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,GAAG,CAAC,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjF,CAAC;IAEF,OAAO;QACL,EAAE,EAAE,EAAE,OAAO,EAAM,QAAQ,EAAE,OAAO,EAAM,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAY,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE;QAC3G,EAAE,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAM,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAClH,EAAE,EAAE,EAAE,QAAQ,EAAK,QAAQ,EAAE,QAAQ,EAAK,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE;QAChH,EAAE,EAAE,EAAE,QAAQ,EAAK,QAAQ,EAAE,QAAQ,EAAK,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAK,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAClH,EAAE,EAAE,EAAE,MAAM,EAAO,QAAQ,EAAE,MAAM,EAAO,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAK,UAAU,EAAE,EAAE,EAAE;KACvG,CAAC;AACJ,CAAC;AAED,0EAA0E;AAE1E,MAAM,UAAU,YAAY;IAC1B,IAAI,QAAsB,CAAC;IAC3B,IAAI,YAAsC,CAAC;IAC3C,IAAI,SAAgC,CAAC;IACrC,IAAI,KAAe,CAAC;IACpB,IAAI,UAAyB,CAAC;IAC9B,IAAI,YAAY,GAAiB,EAAE,CAAC;IAEpC,qEAAqE;IAErE;;OAEG;IACH,KAAK,UAAU,UAAU,CACvB,GAAW,EACX,QAAgB,EAChB,YAAoB;QAEpB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC3C,CAAC,CAAC,EAAE,KAAK,QAAQ;YACf,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,QAAiB,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,EAAE;YAC5E,CAAC,CAAC,CAAC,CACN,CAAC;QACF,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE;YAC3B,OAAO,EAAE,cAAc;YACvB,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,KAAK,UAAU,UAAU;QACvB,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;QACjF,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBACjC,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS;oBAAE,SAAS;gBAE/D,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACzD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;oBAAE,SAAS;gBAEvD,oCAAoC;gBACpC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAErC,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBAChE,MAAM,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,IAAI,WAAW,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;oBAC/E,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;gBAC3F,CAAC;gBAED,2EAA2E;gBAC3E,IAAI,MAA+B,CAAC;gBACpC,IAAI,MAAM,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;oBAC3B,sEAAsE;oBACtE,8EAA8E;oBAC9E,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;oBACtC,MAAM,MAAM,GAAG,0BAA0B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACzD,MAAM,gBAAgB,GAAI,OAAO,CAAC,QAAQ,EAAE,gBAA8B,IAAI,EAAE,CAAC;oBACjF,MAAM,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;gBACzE,CAAC;qBAAM,CAAC;oBACN,MAAM,GAAG;wBACP,SAAS,EAAE,OAAO,CAAC,EAAE;wBACrB,aAAa,EAAE,OAAO,CAAC,MAAM;wBAC7B,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACpE,CAAC;gBACJ,CAAC;gBAED,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;oBAChC,MAAM,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,0CAA0C,CAAC,CAAC;oBAC7E,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;gBAC3F,CAAC;gBAED,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC3C,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE;oBAChB,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,WAAoB,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE;oBAClE,CAAC,CAAC,CAAC,CACN,CAAC;gBAEF,MAAM,YAAY,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;gBAC3E,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE;oBAC3B,OAAO,EAAE,cAAc;oBACvB,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;iBAC/C,CAAC,CAAC;gBAEH,IAAI,YAAY,EAAE,CAAC;oBACjB,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;gBAC9F,CAAC;gBACD,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;YAC5E,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,UAAU,MAAM;QACnB,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;QACjF,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEvB,MAAM,MAAM,GAAG,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC5D,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,+BAA+B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACtF,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;YAC3F,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;YACvC,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC;YAEnD,IAAI,YAAoD,CAAC;YACzD,IAAI,CAAC;gBACH,0CAA0C;gBAC1C,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC3C,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,SAAkB,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAC/E,CAAC;gBACF,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;gBAE1D,mEAAmE;gBACnE,MAAM,UAAU,GAAG,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;gBAEvD,YAAY,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAEjD,IAAI,YAAY,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;oBACvC,4DAA4D;oBAC5D,MAAM,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC;oBACnC,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACnD,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE;wBACjB,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,SAAkB,EAAE,SAAS,EAAE;wBACjD,CAAC,CAAC,CAAC,CACN,CAAC;oBACF,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;oBAC3D,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;gBAC3E,CAAC;gBAED,+CAA+C;gBAC/C,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;gBAChC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;oBAChC,MAAM,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,yCAAyC,CAAC,CAAC;oBACpF,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;gBAC3F,CAAC;gBAED,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAC7C,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACpD,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE;oBACjB,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,WAAoB,EAAE,MAAM,EAAE,WAAW,EAAE;oBAC7D,CAAC,CAAC,CAAC,CACN,CAAC;gBACF,MAAM,YAAY,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;gBAC7E,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE;oBAC3B,OAAO,EAAE,gBAAgB;oBACzB,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;iBAC/C,CAAC,CAAC;gBAEH,IAAI,YAAY,EAAE,CAAC;oBACjB,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;gBAC9F,CAAC;gBACD,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;YAC7E,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,YAAY,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACtE,MAAM,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;gBAChD,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;YAC3F,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACH,KAAK,UAAU,QAAQ;QACrB,2DAA2D;QAC3D,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC;YACtC,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;YACjC,OAAO,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC;YAC7B,KAAK,EAAE,EAAE;SACV,CAAC,CAAC;QAEH,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,yBAAyB;YACzB,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;gBACnC,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;gBACjC,KAAK,EAAE,CAAC;aACT,CAAC,CAAC;YACH,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS;YAElC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACnC,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YAEvD,MAAM,GAAG,GAAW;gBAClB,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,MAAM,EAAE,SAAS;gBACjB,OAAO;aACR,CAAC;YAEF,MAAM,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAExB,+CAA+C;YAC/C,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAC5C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,4EAA4E;gBAC5E,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC/D,8EAA8E;oBAC9E,wDAAwD;gBAC1D,CAAC;qBAAM,CAAC;oBACN,MAAM,GAAG,CAAC;gBACZ,CAAC;YACH,CAAC;YAED,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;QAC3D,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qEAAqE;IAErE,MAAM,GAAG,GAAc;QACrB,KAAK,CAAC,KAAK;YACT,MAAM,SAAS,GAAG,MAAM,UAAU,EAAE,CAAC;YACrC,IAAI,SAAS;gBAAE,OAAO,SAAS,CAAC;YAEhC,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAC;YAC3B,IAAI,GAAG;gBAAE,OAAO,GAAG,CAAC;YAEpB,MAAM,OAAO,GAAG,MAAM,QAAQ,EAAE,CAAC;YACjC,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAC;YAE5B,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;IAEF,qEAAqE;IAErE,OAAO;QACL,SAAS,EAAE;YACT,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,YAAY,CAAC;YAE3C,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE;wBACJ,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;qBACpD;iBACF;gBACD,OAAO,EAAE;oBACP,KAAK,EAAM,WAAW;oBACtB,SAAS,EAAE,eAAe;oBAC1B,MAAM,EAAK,YAAY;oBACvB,MAAM,EAAK,YAAY;oBACvB,IAAI,EAAO,UAAU;iBACtB;gBACD,KAAK,EAAE,CAAC,SAAS,EAAE,kBAAkB,CAAC;aACvC;YAED,QAAQ,EAAE,GAAG;YAEb,KAAK,CAAC,IAAoB;gBACxB,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;gBAClB,YAAY,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC;gBAE5C,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,CAAY,QAAQ,CAAC,CAAC;gBAChD,KAAK,GAAG,CAAC,CAAC,SAAS,CAAW,OAAO,CAAC,CAAC;gBACvC,UAAU,GAAG,CAAC,CAAC,SAAS,CAAgB,YAAY,CAAC,CAAC;gBAEtD,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAS,QAAQ,EAAE,MAAM,CAAC,CAAC;gBACjD,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAa,UAAU,EAAE,UAAU,CAAC,CAAC;gBACnE,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAU,OAAO,EAAE,OAAO,CAAC,CAAC;gBAEvD,sCAAsC;gBACtC,uEAAuE;gBACvE,MAAM,CAAC,KAAK,CACV,QAAQ,EACR,MAAM,EACN,KAAK,EAAE,KAAK,EAAE,EAAE;oBACd,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;wBAAE,OAAO;oBAEpC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC;oBACxB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;oBAExB,mDAAmD;oBACnD,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;wBAAE,OAAO;oBAEvC,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;wBAC/B,4CAA4C;wBAC5C,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;wBAC5D,MAAM,UAAU,GAAG,UAAU,EAAE,MAAM;4BACnC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;4BACnC,CAAC,CAAC,eAAe,CAAC;wBACpB,MAAM,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;oBAClE,CAAC;yBAAM,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;wBACnC,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;wBACpE,MAAM,UAAU,GAAG,YAAY,EAAE,KAAK,IAAI,gBAAgB,CAAC;wBAC3D,MAAM,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;oBAC/D,CAAC;gBACH,CAAC,EACD,EAAE,WAAW,EAAE,IAAI,EAAE,CACtB,CAAC;YACJ,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * crawlContinual tool — runs the crawl loop continuously.
3
+ *
4
+ * Polls crawl() on a configurable interval until stopped or no remaining
5
+ * work exists for the configured number of consecutive idle cycles.
6
+ */
7
+ import { z } from 'zod';
8
+ declare const _default: import("@shardworks/tools-apparatus").ToolDefinition<{
9
+ maxIdleCycles: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
10
+ pollIntervalMs: z.ZodOptional<z.ZodNumber>;
11
+ }>;
12
+ export default _default;
13
+ //# sourceMappingURL=crawl-continual.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crawl-continual.d.ts","sourceRoot":"","sources":["../../src/tools/crawl-continual.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;;;;;AAKxB,wBA0DG"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * crawlContinual tool — runs the crawl loop continuously.
3
+ *
4
+ * Polls crawl() on a configurable interval until stopped or no remaining
5
+ * work exists for the configured number of consecutive idle cycles.
6
+ */
7
+ import { z } from 'zod';
8
+ import { guild } from '@shardworks/nexus-core';
9
+ import { tool } from '@shardworks/tools-apparatus';
10
+ export default tool({
11
+ name: 'crawlContinual',
12
+ description: "Run the Spider's crawl loop continuously until idle",
13
+ instructions: 'Polls crawl() in a loop, sleeping between steps when idle. ' +
14
+ 'Stops when the configured number of consecutive idle cycles is reached. ' +
15
+ 'Returns a summary of all actions taken.',
16
+ params: {
17
+ maxIdleCycles: z
18
+ .number()
19
+ .optional()
20
+ .default(3)
21
+ .describe('Number of consecutive idle crawl() calls before stopping (default: 3)'),
22
+ pollIntervalMs: z
23
+ .number()
24
+ .optional()
25
+ .describe('Override the configured poll interval in milliseconds'),
26
+ },
27
+ permission: 'spider:write',
28
+ handler: async (params) => {
29
+ const g = guild();
30
+ const spider = g.apparatus('spider');
31
+ const config = g.guildConfig().spider ?? {};
32
+ const intervalMs = params.pollIntervalMs ?? config.pollIntervalMs ?? 5000;
33
+ const maxIdle = params.maxIdleCycles;
34
+ const actions = [];
35
+ let idleCount = 0;
36
+ while (idleCount < maxIdle) {
37
+ let result;
38
+ try {
39
+ result = await spider.crawl();
40
+ }
41
+ catch (err) {
42
+ console.error('[crawlContinual] crawl() error:', err instanceof Error ? err.message : String(err));
43
+ idleCount++;
44
+ if (idleCount < maxIdle) {
45
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
46
+ }
47
+ continue;
48
+ }
49
+ if (result === null) {
50
+ idleCount++;
51
+ if (idleCount < maxIdle) {
52
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
53
+ }
54
+ }
55
+ else {
56
+ idleCount = 0;
57
+ actions.push(result);
58
+ }
59
+ }
60
+ return { actions, totalActions: actions.length };
61
+ },
62
+ });
63
+ //# sourceMappingURL=crawl-continual.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crawl-continual.js","sourceRoot":"","sources":["../../src/tools/crawl-continual.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAGnD,eAAe,IAAI,CAAC;IAClB,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE,qDAAqD;IAClE,YAAY,EACV,6DAA6D;QAC7D,0EAA0E;QAC1E,yCAAyC;IAC3C,MAAM,EAAE;QACN,aAAa,EAAE,CAAC;aACb,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,OAAO,CAAC,CAAC,CAAC;aACV,QAAQ,CACP,uEAAuE,CACxE;QACH,cAAc,EAAE,CAAC;aACd,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,uDAAuD,CACxD;KACJ;IACD,UAAU,EAAE,cAAc;IAC1B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACxB,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,CAAY,QAAQ,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,MAAM,IAAI,EAAkB,CAAC;QAC5D,MAAM,UAAU,GAAG,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC;QAC1E,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC;QAErC,MAAM,OAAO,GAAc,EAAE,CAAC;QAC9B,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,OAAO,SAAS,GAAG,OAAO,EAAE,CAAC;YAC3B,IAAI,MAAgD,CAAC;YACrD,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBACnG,SAAS,EAAE,CAAC;gBACZ,IAAI,SAAS,GAAG,OAAO,EAAE,CAAC;oBACxB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;gBACxE,CAAC;gBACD,SAAS;YACX,CAAC;YACD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,SAAS,EAAE,CAAC;gBACZ,IAAI,SAAS,GAAG,OAAO,EAAE,CAAC;oBACxB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;gBACxE,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,SAAS,GAAG,CAAC,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;IACnD,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * crawl tool — executes a single step of the crawl loop.
3
+ *
4
+ * Returns the CrawlResult or null (idle) from one crawl() call.
5
+ * Useful for manual step-through or testing.
6
+ */
7
+ declare const _default: import("@shardworks/tools-apparatus").ToolDefinition<{}>;
8
+ export default _default;
9
+ //# sourceMappingURL=crawl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crawl.d.ts","sourceRoot":"","sources":["../../src/tools/crawl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;;AAMH,wBAaG"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * crawl tool — executes a single step of the crawl loop.
3
+ *
4
+ * Returns the CrawlResult or null (idle) from one crawl() call.
5
+ * Useful for manual step-through or testing.
6
+ */
7
+ import { guild } from '@shardworks/nexus-core';
8
+ import { tool } from '@shardworks/tools-apparatus';
9
+ export default tool({
10
+ name: 'crawl',
11
+ description: "Execute one step of the Spider's crawl loop",
12
+ instructions: 'Runs a single crawl() step: collect a pending session result, run the next ' +
13
+ 'ready engine, or spawn a rig for a ready writ — in that priority order. ' +
14
+ 'Returns the action taken, or null if there is nothing to do.',
15
+ params: {},
16
+ permission: 'spider:write',
17
+ handler: async () => {
18
+ const spider = guild().apparatus('spider');
19
+ return spider.crawl();
20
+ },
21
+ });
22
+ //# sourceMappingURL=crawl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crawl.js","sourceRoot":"","sources":["../../src/tools/crawl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAGnD,eAAe,IAAI,CAAC;IAClB,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,6CAA6C;IAC1D,YAAY,EACV,6EAA6E;QAC7E,0EAA0E;QAC1E,8DAA8D;IAChE,MAAM,EAAE,EAAE;IACV,UAAU,EAAE,cAAc;IAC1B,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,MAAM,MAAM,GAAG,KAAK,EAAE,CAAC,SAAS,CAAY,QAAQ,CAAC,CAAC;QACtD,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { default as crawlTool } from './crawl.ts';
2
+ export { default as crawlContinualTool } from './crawl-continual.ts';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { default as crawlTool } from "./crawl.js";
2
+ export { default as crawlContinualTool } from "./crawl-continual.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}