@hanhnd/agent-kit 1.0.38 → 1.0.40

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.
@@ -1 +1,2 @@
1
1
  export declare function withTimeout<T>(promise: Promise<T>, timeoutMs: number, createError: () => Error): Promise<T>;
2
+ export declare function mapLimit<T, R>(items: readonly T[], limit: number, worker: (item: T, index: number) => Promise<R>): Promise<R[]>;
@@ -13,3 +13,20 @@ export async function withTimeout(promise, timeoutMs, createError) {
13
13
  clearTimeout(timer);
14
14
  }
15
15
  }
16
+ export async function mapLimit(items, limit, worker) {
17
+ if (items.length === 0)
18
+ return [];
19
+ const concurrency = Math.max(1, Math.floor(limit));
20
+ const results = new Array(items.length);
21
+ let nextIndex = 0;
22
+ async function runWorker() {
23
+ while (nextIndex < items.length) {
24
+ const currentIndex = nextIndex;
25
+ nextIndex++;
26
+ results[currentIndex] = await worker(items[currentIndex], currentIndex);
27
+ }
28
+ }
29
+ const runners = Array.from({ length: Math.min(concurrency, items.length) }, () => runWorker());
30
+ await Promise.all(runners);
31
+ return results;
32
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,48 @@
1
+ import * as assert from 'node:assert/strict';
2
+ import { describe, test } from 'node:test';
3
+ import { mapLimit } from './async.js';
4
+ describe('mapLimit', () => {
5
+ test('returns an empty array for empty input', async () => {
6
+ const results = await mapLimit([], 3, async (item) => item);
7
+ assert.deepEqual(results, []);
8
+ });
9
+ test('preserves result order while workers resolve out of order', async () => {
10
+ const results = await mapLimit([30, 10, 20], 3, async (delayMs, index) => {
11
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
12
+ return index;
13
+ });
14
+ assert.deepEqual(results, [0, 1, 2]);
15
+ });
16
+ test('caps active workers at the configured limit', async () => {
17
+ let active = 0;
18
+ let maxActive = 0;
19
+ await mapLimit([1, 2, 3, 4, 5], 2, async (item) => {
20
+ active++;
21
+ maxActive = Math.max(maxActive, active);
22
+ await new Promise((resolve) => setTimeout(resolve, 5));
23
+ active--;
24
+ return item;
25
+ });
26
+ assert.equal(maxActive, 2);
27
+ });
28
+ test('clamps invalid limits to one worker', async () => {
29
+ let active = 0;
30
+ let maxActive = 0;
31
+ await mapLimit([1, 2, 3], 0, async (item) => {
32
+ active++;
33
+ maxActive = Math.max(maxActive, active);
34
+ await new Promise((resolve) => setTimeout(resolve, 5));
35
+ active--;
36
+ return item;
37
+ });
38
+ assert.equal(maxActive, 1);
39
+ });
40
+ test('rejects with the original worker error', async () => {
41
+ const expected = new Error('worker failed');
42
+ await assert.rejects(mapLimit([1, 2], 2, async (item) => {
43
+ if (item === 2)
44
+ throw expected;
45
+ return item;
46
+ }), expected);
47
+ });
48
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hanhnd/agent-kit",
3
- "version": "1.0.38",
3
+ "version": "1.0.40",
4
4
  "description": "Agent Kit MCP server for software development agent workflows",
5
5
  "type": "module",
6
6
  "main": "dist/server.js",