@blackms/aistack 1.2.0 → 1.3.1
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/README.md +152 -11
- package/dist/agents/definitions/adversarial.d.ts +6 -0
- package/dist/agents/definitions/adversarial.d.ts.map +1 -0
- package/dist/agents/definitions/adversarial.js +34 -0
- package/dist/agents/definitions/adversarial.js.map +1 -0
- package/dist/agents/definitions/devops.d.ts +6 -0
- package/dist/agents/definitions/devops.d.ts.map +1 -0
- package/dist/agents/definitions/devops.js +65 -0
- package/dist/agents/definitions/devops.js.map +1 -0
- package/dist/agents/definitions/documentation.d.ts +6 -0
- package/dist/agents/definitions/documentation.d.ts.map +1 -0
- package/dist/agents/definitions/documentation.js +72 -0
- package/dist/agents/definitions/documentation.js.map +1 -0
- package/dist/agents/definitions/index.d.ts +4 -0
- package/dist/agents/definitions/index.d.ts.map +1 -1
- package/dist/agents/definitions/index.js +4 -0
- package/dist/agents/definitions/index.js.map +1 -1
- package/dist/agents/definitions/security-auditor.d.ts +6 -0
- package/dist/agents/definitions/security-auditor.d.ts.map +1 -0
- package/dist/agents/definitions/security-auditor.js +100 -0
- package/dist/agents/definitions/security-auditor.js.map +1 -0
- package/dist/agents/registry.d.ts.map +1 -1
- package/dist/agents/registry.js +5 -1
- package/dist/agents/registry.js.map +1 -1
- package/dist/agents/spawner.d.ts +26 -1
- package/dist/agents/spawner.d.ts.map +1 -1
- package/dist/agents/spawner.js +94 -1
- package/dist/agents/spawner.js.map +1 -1
- package/dist/auth/index.d.ts +6 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +6 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/service.d.ts +79 -0
- package/dist/auth/service.d.ts.map +1 -0
- package/dist/auth/service.js +383 -0
- package/dist/auth/service.js.map +1 -0
- package/dist/auth/types.d.ts +48 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +10 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/coordination/index.d.ts +1 -0
- package/dist/coordination/index.d.ts.map +1 -1
- package/dist/coordination/index.js +1 -0
- package/dist/coordination/index.js.map +1 -1
- package/dist/coordination/review-loop.d.ts +89 -0
- package/dist/coordination/review-loop.d.ts.map +1 -0
- package/dist/coordination/review-loop.js +341 -0
- package/dist/coordination/review-loop.js.map +1 -0
- package/dist/integrations/slack-notifier.d.ts +63 -0
- package/dist/integrations/slack-notifier.d.ts.map +1 -0
- package/dist/integrations/slack-notifier.js +224 -0
- package/dist/integrations/slack-notifier.js.map +1 -0
- package/dist/integrations/slack.d.ts +50 -0
- package/dist/integrations/slack.d.ts.map +1 -0
- package/dist/integrations/slack.js +225 -0
- package/dist/integrations/slack.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +1 -0
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +1 -0
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/review-loop-tools.d.ts +210 -0
- package/dist/mcp/tools/review-loop-tools.d.ts.map +1 -0
- package/dist/mcp/tools/review-loop-tools.js +213 -0
- package/dist/mcp/tools/review-loop-tools.js.map +1 -0
- package/dist/memory/index.d.ts +75 -0
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +101 -0
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/sqlite-store.d.ts +85 -1
- package/dist/memory/sqlite-store.d.ts.map +1 -1
- package/dist/memory/sqlite-store.js +647 -15
- package/dist/memory/sqlite-store.js.map +1 -1
- package/dist/monitoring/health.d.ts +68 -0
- package/dist/monitoring/health.d.ts.map +1 -0
- package/dist/monitoring/health.js +220 -0
- package/dist/monitoring/health.js.map +1 -0
- package/dist/monitoring/metrics.d.ts +31 -0
- package/dist/monitoring/metrics.d.ts.map +1 -0
- package/dist/monitoring/metrics.js +230 -0
- package/dist/monitoring/metrics.js.map +1 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +132 -94
- package/dist/providers/index.js.map +1 -1
- package/dist/types.d.ts +69 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +12 -0
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/logger.d.ts +24 -7
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +128 -20
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/retry.d.ts +49 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +160 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/semaphore.d.ts +75 -0
- package/dist/utils/semaphore.d.ts.map +1 -0
- package/dist/utils/semaphore.js +185 -0
- package/dist/utils/semaphore.js.map +1 -0
- package/dist/utils/validation.d.ts +2 -2
- package/dist/web/middleware/auth.d.ts +16 -10
- package/dist/web/middleware/auth.d.ts.map +1 -1
- package/dist/web/middleware/auth.js +152 -12
- package/dist/web/middleware/auth.js.map +1 -1
- package/dist/web/routes/auth.d.ts +50 -0
- package/dist/web/routes/auth.d.ts.map +1 -0
- package/dist/web/routes/auth.js +216 -0
- package/dist/web/routes/auth.js.map +1 -0
- package/dist/web/routes/index.d.ts +2 -0
- package/dist/web/routes/index.d.ts.map +1 -1
- package/dist/web/routes/index.js +2 -0
- package/dist/web/routes/index.js.map +1 -1
- package/dist/web/routes/memory.d.ts.map +1 -1
- package/dist/web/routes/memory.js +188 -0
- package/dist/web/routes/memory.js.map +1 -1
- package/dist/web/routes/review-loops.d.ts +12 -0
- package/dist/web/routes/review-loops.d.ts.map +1 -0
- package/dist/web/routes/review-loops.js +157 -0
- package/dist/web/routes/review-loops.js.map +1 -0
- package/dist/web/routes/sessions.d.ts.map +1 -1
- package/dist/web/routes/sessions.js +14 -0
- package/dist/web/routes/sessions.js.map +1 -1
- package/dist/web/routes/system.d.ts.map +1 -1
- package/dist/web/routes/system.js +34 -23
- package/dist/web/routes/system.js.map +1 -1
- package/dist/web/routes/workflows.d.ts.map +1 -1
- package/dist/web/routes/workflows.js +13 -1
- package/dist/web/routes/workflows.js.map +1 -1
- package/dist/web/server.d.ts +1 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +30 -2
- package/dist/web/server.js.map +1 -1
- package/dist/web/utils/request.d.ts +13 -0
- package/dist/web/utils/request.d.ts.map +1 -0
- package/dist/web/utils/request.js +49 -0
- package/dist/web/utils/request.js.map +1 -0
- package/dist/web/websocket/handler.d.ts +4 -0
- package/dist/web/websocket/handler.d.ts.map +1 -1
- package/dist/web/websocket/handler.js +59 -0
- package/dist/web/websocket/handler.js.map +1 -1
- package/dist/workflows/doc-sync.d.ts.map +1 -1
- package/dist/workflows/doc-sync.js +4 -0
- package/dist/workflows/doc-sync.js.map +1 -1
- package/dist/workflows/full-stack-feature.d.ts +74 -0
- package/dist/workflows/full-stack-feature.d.ts.map +1 -0
- package/dist/workflows/full-stack-feature.js +273 -0
- package/dist/workflows/full-stack-feature.js.map +1 -0
- package/dist/workflows/index.d.ts +1 -0
- package/dist/workflows/index.d.ts.map +1 -1
- package/dist/workflows/index.js +2 -0
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/runner.js.map +1 -1
- package/dist/workflows/types.d.ts +6 -5
- package/dist/workflows/types.d.ts.map +1 -1
- package/package.json +12 -5
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry logic with exponential backoff and circuit breaker
|
|
3
|
+
*/
|
|
4
|
+
import { logger } from './logger.js';
|
|
5
|
+
const log = logger.child('retry');
|
|
6
|
+
/**
|
|
7
|
+
* Circuit Breaker implementation
|
|
8
|
+
* Prevents cascading failures by stopping requests when error rate is too high
|
|
9
|
+
*/
|
|
10
|
+
export class CircuitBreaker {
|
|
11
|
+
state = 'CLOSED';
|
|
12
|
+
failureCount = 0;
|
|
13
|
+
successCount = 0;
|
|
14
|
+
nextAttemptTime = 0;
|
|
15
|
+
failureThreshold;
|
|
16
|
+
successThreshold;
|
|
17
|
+
timeout;
|
|
18
|
+
halfOpenRetryDelayMs;
|
|
19
|
+
name;
|
|
20
|
+
constructor(name, options = {}) {
|
|
21
|
+
this.name = name;
|
|
22
|
+
this.failureThreshold = options.failureThreshold ?? 5;
|
|
23
|
+
this.successThreshold = options.successThreshold ?? 2;
|
|
24
|
+
this.timeout = options.timeout ?? 60000; // 1 minute
|
|
25
|
+
this.halfOpenRetryDelayMs = options.halfOpenRetryDelayMs ?? 30000; // 30 seconds
|
|
26
|
+
}
|
|
27
|
+
getState() {
|
|
28
|
+
return this.state;
|
|
29
|
+
}
|
|
30
|
+
isOpen() {
|
|
31
|
+
if (this.state === 'OPEN') {
|
|
32
|
+
// Check if we should transition to HALF_OPEN
|
|
33
|
+
if (Date.now() >= this.nextAttemptTime) {
|
|
34
|
+
log.info('Circuit breaker transitioning to HALF_OPEN', { name: this.name });
|
|
35
|
+
this.state = 'HALF_OPEN';
|
|
36
|
+
this.successCount = 0;
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
async execute(fn) {
|
|
44
|
+
if (this.isOpen()) {
|
|
45
|
+
throw new Error(`Circuit breaker is OPEN for ${this.name}`);
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
const result = await fn();
|
|
49
|
+
this.onSuccess();
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
this.onFailure();
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
onSuccess() {
|
|
58
|
+
this.failureCount = 0;
|
|
59
|
+
if (this.state === 'HALF_OPEN') {
|
|
60
|
+
this.successCount++;
|
|
61
|
+
if (this.successCount >= this.successThreshold) {
|
|
62
|
+
log.info('Circuit breaker transitioning to CLOSED', { name: this.name });
|
|
63
|
+
this.state = 'CLOSED';
|
|
64
|
+
this.successCount = 0;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
onFailure() {
|
|
69
|
+
this.failureCount++;
|
|
70
|
+
if (this.state === 'HALF_OPEN') {
|
|
71
|
+
log.warn('Circuit breaker transitioning to OPEN (failure in HALF_OPEN)', {
|
|
72
|
+
name: this.name,
|
|
73
|
+
});
|
|
74
|
+
this.state = 'OPEN';
|
|
75
|
+
this.nextAttemptTime = Date.now() + this.timeout;
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (this.failureCount >= this.failureThreshold) {
|
|
79
|
+
log.warn('Circuit breaker transitioning to OPEN', {
|
|
80
|
+
name: this.name,
|
|
81
|
+
failureCount: this.failureCount,
|
|
82
|
+
threshold: this.failureThreshold,
|
|
83
|
+
});
|
|
84
|
+
this.state = 'OPEN';
|
|
85
|
+
this.nextAttemptTime = Date.now() + this.timeout;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
reset() {
|
|
89
|
+
this.state = 'CLOSED';
|
|
90
|
+
this.failureCount = 0;
|
|
91
|
+
this.successCount = 0;
|
|
92
|
+
this.nextAttemptTime = 0;
|
|
93
|
+
log.info('Circuit breaker reset', { name: this.name });
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Retry with exponential backoff
|
|
98
|
+
*/
|
|
99
|
+
export async function retryWithBackoff(fn, options = {}) {
|
|
100
|
+
const maxAttempts = options.maxAttempts ?? 3;
|
|
101
|
+
const initialDelayMs = options.initialDelayMs ?? 1000;
|
|
102
|
+
const maxDelayMs = options.maxDelayMs ?? 30000;
|
|
103
|
+
const backoffMultiplier = options.backoffMultiplier ?? 2;
|
|
104
|
+
const retryableErrors = options.retryableErrors ?? [
|
|
105
|
+
'ECONNRESET',
|
|
106
|
+
'ETIMEDOUT',
|
|
107
|
+
'ENOTFOUND',
|
|
108
|
+
'rate_limit',
|
|
109
|
+
'timeout',
|
|
110
|
+
'429',
|
|
111
|
+
'500',
|
|
112
|
+
'502',
|
|
113
|
+
'503',
|
|
114
|
+
'504',
|
|
115
|
+
];
|
|
116
|
+
let lastError = null;
|
|
117
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
118
|
+
try {
|
|
119
|
+
return await fn();
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
123
|
+
// Check if error is retryable
|
|
124
|
+
const isRetryable = retryableErrors.some((pattern) => {
|
|
125
|
+
if (typeof pattern === 'string') {
|
|
126
|
+
return lastError.message.includes(pattern);
|
|
127
|
+
}
|
|
128
|
+
return pattern.test(lastError.message);
|
|
129
|
+
});
|
|
130
|
+
if (!isRetryable || attempt === maxAttempts) {
|
|
131
|
+
throw lastError;
|
|
132
|
+
}
|
|
133
|
+
// Calculate delay with exponential backoff and jitter
|
|
134
|
+
const baseDelay = Math.min(initialDelayMs * Math.pow(backoffMultiplier, attempt - 1), maxDelayMs);
|
|
135
|
+
const jitter = Math.random() * 0.3 * baseDelay; // Up to 30% jitter
|
|
136
|
+
const delay = baseDelay + jitter;
|
|
137
|
+
log.warn('Retrying after error', {
|
|
138
|
+
attempt,
|
|
139
|
+
maxAttempts,
|
|
140
|
+
delayMs: Math.round(delay),
|
|
141
|
+
error: lastError.message,
|
|
142
|
+
});
|
|
143
|
+
await sleep(delay);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
throw lastError;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Sleep utility
|
|
150
|
+
*/
|
|
151
|
+
function sleep(ms) {
|
|
152
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Retry with circuit breaker
|
|
156
|
+
*/
|
|
157
|
+
export async function retryWithCircuitBreaker(fn, circuitBreaker, retryOptions) {
|
|
158
|
+
return circuitBreaker.execute(() => retryWithBackoff(fn, retryOptions));
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Semaphore for concurrency control
|
|
3
|
+
*/
|
|
4
|
+
export declare class Semaphore {
|
|
5
|
+
private permits;
|
|
6
|
+
private maxPermits;
|
|
7
|
+
private queue;
|
|
8
|
+
private readonly name;
|
|
9
|
+
constructor(name: string, maxPermits: number);
|
|
10
|
+
/**
|
|
11
|
+
* Acquire a permit
|
|
12
|
+
* Waits if no permits available
|
|
13
|
+
*/
|
|
14
|
+
acquire(): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Try to acquire a permit without waiting
|
|
17
|
+
* Returns true if acquired, false otherwise
|
|
18
|
+
*/
|
|
19
|
+
tryAcquire(): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Release a permit
|
|
22
|
+
*/
|
|
23
|
+
release(): void;
|
|
24
|
+
/**
|
|
25
|
+
* Execute function with acquired permit
|
|
26
|
+
* Automatically releases permit when done
|
|
27
|
+
*/
|
|
28
|
+
execute<T>(fn: () => Promise<T>): Promise<T>;
|
|
29
|
+
/**
|
|
30
|
+
* Get current state
|
|
31
|
+
*/
|
|
32
|
+
getState(): {
|
|
33
|
+
available: number;
|
|
34
|
+
maxPermits: number;
|
|
35
|
+
queued: number;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Reset semaphore to initial state
|
|
39
|
+
*/
|
|
40
|
+
reset(): void;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Agent pool for reusing agents
|
|
44
|
+
*/
|
|
45
|
+
export declare class AgentPool {
|
|
46
|
+
private pool;
|
|
47
|
+
private inUse;
|
|
48
|
+
private maxPoolSize;
|
|
49
|
+
constructor(maxPoolSize?: number);
|
|
50
|
+
/**
|
|
51
|
+
* Get an agent from the pool or null if none available
|
|
52
|
+
*/
|
|
53
|
+
acquire(agentType: string): string | null;
|
|
54
|
+
/**
|
|
55
|
+
* Return an agent to the pool
|
|
56
|
+
*/
|
|
57
|
+
release(agentType: string, agentId: string): void;
|
|
58
|
+
/**
|
|
59
|
+
* Remove an agent from the pool
|
|
60
|
+
*/
|
|
61
|
+
remove(agentType: string, agentId: string): void;
|
|
62
|
+
/**
|
|
63
|
+
* Get pool statistics
|
|
64
|
+
*/
|
|
65
|
+
getStats(): Record<string, {
|
|
66
|
+
total: number;
|
|
67
|
+
inUse: number;
|
|
68
|
+
available: number;
|
|
69
|
+
}>;
|
|
70
|
+
/**
|
|
71
|
+
* Clear the pool
|
|
72
|
+
*/
|
|
73
|
+
clear(): void;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=semaphore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semaphore.d.ts","sourceRoot":"","sources":["../../src/utils/semaphore.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;gBAElB,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAM5C;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB9B;;;OAGG;IACH,UAAU,IAAI,OAAO;IAYrB;;OAEG;IACH,OAAO,IAAI,IAAI;IAoBf;;;OAGG;IACG,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IASlD;;OAEG;IACH,QAAQ,IAAI;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;KAChB;IAQD;;OAEG;IACH,KAAK,IAAI,IAAI;CASd;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,IAAI,CAAoC;IAChD,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,GAAE,MAAW;IAIpC;;OAEG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAazC;;OAEG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAWjD;;OAEG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAYhD;;OAEG;IACH,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAe/E;;OAEG;IACH,KAAK,IAAI,IAAI;CAKd"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Semaphore for concurrency control
|
|
3
|
+
*/
|
|
4
|
+
import { logger } from './logger.js';
|
|
5
|
+
const log = logger.child('semaphore');
|
|
6
|
+
export class Semaphore {
|
|
7
|
+
permits;
|
|
8
|
+
maxPermits;
|
|
9
|
+
queue = [];
|
|
10
|
+
name;
|
|
11
|
+
constructor(name, maxPermits) {
|
|
12
|
+
this.name = name;
|
|
13
|
+
this.permits = maxPermits;
|
|
14
|
+
this.maxPermits = maxPermits;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Acquire a permit
|
|
18
|
+
* Waits if no permits available
|
|
19
|
+
*/
|
|
20
|
+
async acquire() {
|
|
21
|
+
if (this.permits > 0) {
|
|
22
|
+
this.permits--;
|
|
23
|
+
log.debug('Permit acquired', {
|
|
24
|
+
name: this.name,
|
|
25
|
+
available: this.permits,
|
|
26
|
+
queued: this.queue.length,
|
|
27
|
+
});
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// Wait for permit
|
|
31
|
+
await new Promise((resolve) => {
|
|
32
|
+
this.queue.push(resolve);
|
|
33
|
+
log.debug('Waiting for permit', {
|
|
34
|
+
name: this.name,
|
|
35
|
+
queued: this.queue.length,
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Try to acquire a permit without waiting
|
|
41
|
+
* Returns true if acquired, false otherwise
|
|
42
|
+
*/
|
|
43
|
+
tryAcquire() {
|
|
44
|
+
if (this.permits > 0) {
|
|
45
|
+
this.permits--;
|
|
46
|
+
log.debug('Permit acquired (try)', {
|
|
47
|
+
name: this.name,
|
|
48
|
+
available: this.permits,
|
|
49
|
+
});
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Release a permit
|
|
56
|
+
*/
|
|
57
|
+
release() {
|
|
58
|
+
const next = this.queue.shift();
|
|
59
|
+
if (next) {
|
|
60
|
+
// Give permit to waiting task
|
|
61
|
+
next();
|
|
62
|
+
log.debug('Permit released (waiting task)', {
|
|
63
|
+
name: this.name,
|
|
64
|
+
available: this.permits,
|
|
65
|
+
queued: this.queue.length,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
// Return permit to pool
|
|
70
|
+
this.permits++;
|
|
71
|
+
log.debug('Permit released', {
|
|
72
|
+
name: this.name,
|
|
73
|
+
available: this.permits,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Execute function with acquired permit
|
|
79
|
+
* Automatically releases permit when done
|
|
80
|
+
*/
|
|
81
|
+
async execute(fn) {
|
|
82
|
+
await this.acquire();
|
|
83
|
+
try {
|
|
84
|
+
return await fn();
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
this.release();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Get current state
|
|
92
|
+
*/
|
|
93
|
+
getState() {
|
|
94
|
+
return {
|
|
95
|
+
available: this.permits,
|
|
96
|
+
maxPermits: this.maxPermits,
|
|
97
|
+
queued: this.queue.length,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Reset semaphore to initial state
|
|
102
|
+
*/
|
|
103
|
+
reset() {
|
|
104
|
+
// Reject all waiting tasks
|
|
105
|
+
for (const resolve of this.queue) {
|
|
106
|
+
resolve();
|
|
107
|
+
}
|
|
108
|
+
this.queue = [];
|
|
109
|
+
this.permits = this.maxPermits;
|
|
110
|
+
log.info('Semaphore reset', { name: this.name });
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Agent pool for reusing agents
|
|
115
|
+
*/
|
|
116
|
+
export class AgentPool {
|
|
117
|
+
pool = new Map(); // type -> agentIds[]
|
|
118
|
+
inUse = new Set();
|
|
119
|
+
maxPoolSize;
|
|
120
|
+
constructor(maxPoolSize = 10) {
|
|
121
|
+
this.maxPoolSize = maxPoolSize;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get an agent from the pool or null if none available
|
|
125
|
+
*/
|
|
126
|
+
acquire(agentType) {
|
|
127
|
+
const available = this.pool.get(agentType) || [];
|
|
128
|
+
const agentId = available.find((id) => !this.inUse.has(id));
|
|
129
|
+
if (agentId) {
|
|
130
|
+
this.inUse.add(agentId);
|
|
131
|
+
log.debug('Agent acquired from pool', { agentType, agentId });
|
|
132
|
+
return agentId;
|
|
133
|
+
}
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Return an agent to the pool
|
|
138
|
+
*/
|
|
139
|
+
release(agentType, agentId) {
|
|
140
|
+
this.inUse.delete(agentId);
|
|
141
|
+
const pool = this.pool.get(agentType) || [];
|
|
142
|
+
if (!pool.includes(agentId) && pool.length < this.maxPoolSize) {
|
|
143
|
+
pool.push(agentId);
|
|
144
|
+
this.pool.set(agentType, pool);
|
|
145
|
+
log.debug('Agent returned to pool', { agentType, agentId });
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Remove an agent from the pool
|
|
150
|
+
*/
|
|
151
|
+
remove(agentType, agentId) {
|
|
152
|
+
this.inUse.delete(agentId);
|
|
153
|
+
const pool = this.pool.get(agentType) || [];
|
|
154
|
+
const index = pool.indexOf(agentId);
|
|
155
|
+
if (index !== -1) {
|
|
156
|
+
pool.splice(index, 1);
|
|
157
|
+
this.pool.set(agentType, pool);
|
|
158
|
+
log.debug('Agent removed from pool', { agentType, agentId });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get pool statistics
|
|
163
|
+
*/
|
|
164
|
+
getStats() {
|
|
165
|
+
const stats = {};
|
|
166
|
+
for (const [agentType, agentIds] of this.pool.entries()) {
|
|
167
|
+
const inUseCount = agentIds.filter((id) => this.inUse.has(id)).length;
|
|
168
|
+
stats[agentType] = {
|
|
169
|
+
total: agentIds.length,
|
|
170
|
+
inUse: inUseCount,
|
|
171
|
+
available: agentIds.length - inUseCount,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
return stats;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Clear the pool
|
|
178
|
+
*/
|
|
179
|
+
clear() {
|
|
180
|
+
this.pool.clear();
|
|
181
|
+
this.inUse.clear();
|
|
182
|
+
log.info('Agent pool cleared');
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=semaphore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semaphore.js","sourceRoot":"","sources":["../../src/utils/semaphore.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AAEtC,MAAM,OAAO,SAAS;IACZ,OAAO,CAAS;IAChB,UAAU,CAAS;IACnB,KAAK,GAAsB,EAAE,CAAC;IACrB,IAAI,CAAS;IAE9B,YAAY,IAAY,EAAE,UAAkB;QAC1C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC;QAC1B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,iBAAiB,EAAE;gBAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,SAAS,EAAE,IAAI,CAAC,OAAO;gBACvB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;aAC1B,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,kBAAkB;QAClB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzB,GAAG,CAAC,KAAK,CAAC,oBAAoB,EAAE;gBAC9B,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;aAC1B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,UAAU;QACR,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,uBAAuB,EAAE;gBACjC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,SAAS,EAAE,IAAI,CAAC,OAAO;aACxB,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,OAAO;QACL,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,IAAI,EAAE,CAAC;YACT,8BAA8B;YAC9B,IAAI,EAAE,CAAC;YACP,GAAG,CAAC,KAAK,CAAC,gCAAgC,EAAE;gBAC1C,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,SAAS,EAAE,IAAI,CAAC,OAAO;gBACvB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;aAC1B,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,wBAAwB;YACxB,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,iBAAiB,EAAE;gBAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,SAAS,EAAE,IAAI,CAAC,OAAO;aACxB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAI,EAAoB;QACnC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ;QAKN,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,OAAO;YACvB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;SAC1B,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK;QACH,2BAA2B;QAC3B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACjC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC;QAC/B,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,SAAS;IACZ,IAAI,GAA0B,IAAI,GAAG,EAAE,CAAC,CAAC,qBAAqB;IAC9D,KAAK,GAAgB,IAAI,GAAG,EAAE,CAAC;IAC/B,WAAW,CAAS;IAE5B,YAAY,cAAsB,EAAE;QAClC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,SAAiB;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACjD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAE5D,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACxB,GAAG,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;YAC9D,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,SAAiB,EAAE,OAAe;QACxC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE3B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAC9D,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC/B,GAAG,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,SAAiB,EAAE,OAAe;QACvC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE3B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC/B,GAAG,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,MAAM,KAAK,GAAwE,EAAE,CAAC;QAEtF,KAAK,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YACxD,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YACtE,KAAK,CAAC,SAAS,CAAC,GAAG;gBACjB,KAAK,EAAE,QAAQ,CAAC,MAAM;gBACtB,KAAK,EAAE,UAAU;gBACjB,SAAS,EAAE,QAAQ,CAAC,MAAM,GAAG,UAAU;aACxC,CAAC;QACJ,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACjC,CAAC;CACF"}
|
|
@@ -89,13 +89,13 @@ export declare const AgentSpawnInputSchema: z.ZodObject<{
|
|
|
89
89
|
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
90
90
|
}, "strip", z.ZodTypeAny, {
|
|
91
91
|
type: string;
|
|
92
|
-
metadata?: Record<string, unknown> | undefined;
|
|
93
92
|
name?: string | undefined;
|
|
93
|
+
metadata?: Record<string, unknown> | undefined;
|
|
94
94
|
sessionId?: string | undefined;
|
|
95
95
|
}, {
|
|
96
96
|
type: string;
|
|
97
|
-
metadata?: Record<string, unknown> | undefined;
|
|
98
97
|
name?: string | undefined;
|
|
98
|
+
metadata?: Record<string, unknown> | undefined;
|
|
99
99
|
sessionId?: string | undefined;
|
|
100
100
|
}>;
|
|
101
101
|
export declare const AgentStopInputSchema: z.ZodEffects<z.ZodObject<{
|
|
@@ -1,21 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Authentication middleware
|
|
2
|
+
* Authentication middleware
|
|
3
3
|
*/
|
|
4
4
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
import { AuthService } from '../../auth/service.js';
|
|
6
|
+
import type { AuthContext } from '../../auth/types.js';
|
|
7
|
+
export type { AuthContext };
|
|
8
|
+
/**
|
|
9
|
+
* Initialize authentication with service
|
|
10
|
+
*/
|
|
11
|
+
export declare function initAuth(service: AuthService): void;
|
|
10
12
|
/**
|
|
11
13
|
* Create authentication middleware
|
|
12
|
-
* Currently a no-op that allows all requests
|
|
13
14
|
*/
|
|
14
|
-
export declare function createAuthMiddleware(
|
|
15
|
+
export declare function createAuthMiddleware(options?: {
|
|
15
16
|
required?: boolean;
|
|
16
|
-
|
|
17
|
+
roles?: string[];
|
|
18
|
+
}): (req: IncomingMessage, res: ServerResponse) => AuthContext;
|
|
17
19
|
/**
|
|
18
|
-
*
|
|
20
|
+
* Get API key from request (legacy support)
|
|
19
21
|
*/
|
|
20
22
|
export declare function getApiKey(req: IncomingMessage): string | null;
|
|
23
|
+
/**
|
|
24
|
+
* Verify user has permission
|
|
25
|
+
*/
|
|
26
|
+
export declare function hasPermission(context: AuthContext, permission: string): boolean;
|
|
21
27
|
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/web/middleware/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/web/middleware/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIvD,YAAY,EAAE,WAAW,EAAE,CAAC;AAI5B;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAEnD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CAAO,IAIvF,KAAK,eAAe,EACpB,KAAK,cAAc,KAClB,WAAW,CAqEf;AAmBD;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAE7D;AAiDD;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAkB/E"}
|