@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.
Files changed (161) hide show
  1. package/README.md +152 -11
  2. package/dist/agents/definitions/adversarial.d.ts +6 -0
  3. package/dist/agents/definitions/adversarial.d.ts.map +1 -0
  4. package/dist/agents/definitions/adversarial.js +34 -0
  5. package/dist/agents/definitions/adversarial.js.map +1 -0
  6. package/dist/agents/definitions/devops.d.ts +6 -0
  7. package/dist/agents/definitions/devops.d.ts.map +1 -0
  8. package/dist/agents/definitions/devops.js +65 -0
  9. package/dist/agents/definitions/devops.js.map +1 -0
  10. package/dist/agents/definitions/documentation.d.ts +6 -0
  11. package/dist/agents/definitions/documentation.d.ts.map +1 -0
  12. package/dist/agents/definitions/documentation.js +72 -0
  13. package/dist/agents/definitions/documentation.js.map +1 -0
  14. package/dist/agents/definitions/index.d.ts +4 -0
  15. package/dist/agents/definitions/index.d.ts.map +1 -1
  16. package/dist/agents/definitions/index.js +4 -0
  17. package/dist/agents/definitions/index.js.map +1 -1
  18. package/dist/agents/definitions/security-auditor.d.ts +6 -0
  19. package/dist/agents/definitions/security-auditor.d.ts.map +1 -0
  20. package/dist/agents/definitions/security-auditor.js +100 -0
  21. package/dist/agents/definitions/security-auditor.js.map +1 -0
  22. package/dist/agents/registry.d.ts.map +1 -1
  23. package/dist/agents/registry.js +5 -1
  24. package/dist/agents/registry.js.map +1 -1
  25. package/dist/agents/spawner.d.ts +26 -1
  26. package/dist/agents/spawner.d.ts.map +1 -1
  27. package/dist/agents/spawner.js +94 -1
  28. package/dist/agents/spawner.js.map +1 -1
  29. package/dist/auth/index.d.ts +6 -0
  30. package/dist/auth/index.d.ts.map +1 -0
  31. package/dist/auth/index.js +6 -0
  32. package/dist/auth/index.js.map +1 -0
  33. package/dist/auth/service.d.ts +79 -0
  34. package/dist/auth/service.d.ts.map +1 -0
  35. package/dist/auth/service.js +383 -0
  36. package/dist/auth/service.js.map +1 -0
  37. package/dist/auth/types.d.ts +48 -0
  38. package/dist/auth/types.d.ts.map +1 -0
  39. package/dist/auth/types.js +10 -0
  40. package/dist/auth/types.js.map +1 -0
  41. package/dist/coordination/index.d.ts +1 -0
  42. package/dist/coordination/index.d.ts.map +1 -1
  43. package/dist/coordination/index.js +1 -0
  44. package/dist/coordination/index.js.map +1 -1
  45. package/dist/coordination/review-loop.d.ts +89 -0
  46. package/dist/coordination/review-loop.d.ts.map +1 -0
  47. package/dist/coordination/review-loop.js +341 -0
  48. package/dist/coordination/review-loop.js.map +1 -0
  49. package/dist/integrations/slack-notifier.d.ts +63 -0
  50. package/dist/integrations/slack-notifier.d.ts.map +1 -0
  51. package/dist/integrations/slack-notifier.js +224 -0
  52. package/dist/integrations/slack-notifier.js.map +1 -0
  53. package/dist/integrations/slack.d.ts +50 -0
  54. package/dist/integrations/slack.d.ts.map +1 -0
  55. package/dist/integrations/slack.js +225 -0
  56. package/dist/integrations/slack.js.map +1 -0
  57. package/dist/mcp/tools/index.d.ts +1 -0
  58. package/dist/mcp/tools/index.d.ts.map +1 -1
  59. package/dist/mcp/tools/index.js +1 -0
  60. package/dist/mcp/tools/index.js.map +1 -1
  61. package/dist/mcp/tools/review-loop-tools.d.ts +210 -0
  62. package/dist/mcp/tools/review-loop-tools.d.ts.map +1 -0
  63. package/dist/mcp/tools/review-loop-tools.js +213 -0
  64. package/dist/mcp/tools/review-loop-tools.js.map +1 -0
  65. package/dist/memory/index.d.ts +75 -0
  66. package/dist/memory/index.d.ts.map +1 -1
  67. package/dist/memory/index.js +101 -0
  68. package/dist/memory/index.js.map +1 -1
  69. package/dist/memory/sqlite-store.d.ts +85 -1
  70. package/dist/memory/sqlite-store.d.ts.map +1 -1
  71. package/dist/memory/sqlite-store.js +647 -15
  72. package/dist/memory/sqlite-store.js.map +1 -1
  73. package/dist/monitoring/health.d.ts +68 -0
  74. package/dist/monitoring/health.d.ts.map +1 -0
  75. package/dist/monitoring/health.js +220 -0
  76. package/dist/monitoring/health.js.map +1 -0
  77. package/dist/monitoring/metrics.d.ts +31 -0
  78. package/dist/monitoring/metrics.d.ts.map +1 -0
  79. package/dist/monitoring/metrics.js +230 -0
  80. package/dist/monitoring/metrics.js.map +1 -0
  81. package/dist/providers/index.d.ts.map +1 -1
  82. package/dist/providers/index.js +132 -94
  83. package/dist/providers/index.js.map +1 -1
  84. package/dist/types.d.ts +69 -1
  85. package/dist/types.d.ts.map +1 -1
  86. package/dist/types.js.map +1 -1
  87. package/dist/utils/config.d.ts.map +1 -1
  88. package/dist/utils/config.js +12 -0
  89. package/dist/utils/config.js.map +1 -1
  90. package/dist/utils/index.d.ts +1 -1
  91. package/dist/utils/index.d.ts.map +1 -1
  92. package/dist/utils/index.js +1 -1
  93. package/dist/utils/index.js.map +1 -1
  94. package/dist/utils/logger.d.ts +24 -7
  95. package/dist/utils/logger.d.ts.map +1 -1
  96. package/dist/utils/logger.js +128 -20
  97. package/dist/utils/logger.js.map +1 -1
  98. package/dist/utils/retry.d.ts +49 -0
  99. package/dist/utils/retry.d.ts.map +1 -0
  100. package/dist/utils/retry.js +160 -0
  101. package/dist/utils/retry.js.map +1 -0
  102. package/dist/utils/semaphore.d.ts +75 -0
  103. package/dist/utils/semaphore.d.ts.map +1 -0
  104. package/dist/utils/semaphore.js +185 -0
  105. package/dist/utils/semaphore.js.map +1 -0
  106. package/dist/utils/validation.d.ts +2 -2
  107. package/dist/web/middleware/auth.d.ts +16 -10
  108. package/dist/web/middleware/auth.d.ts.map +1 -1
  109. package/dist/web/middleware/auth.js +152 -12
  110. package/dist/web/middleware/auth.js.map +1 -1
  111. package/dist/web/routes/auth.d.ts +50 -0
  112. package/dist/web/routes/auth.d.ts.map +1 -0
  113. package/dist/web/routes/auth.js +216 -0
  114. package/dist/web/routes/auth.js.map +1 -0
  115. package/dist/web/routes/index.d.ts +2 -0
  116. package/dist/web/routes/index.d.ts.map +1 -1
  117. package/dist/web/routes/index.js +2 -0
  118. package/dist/web/routes/index.js.map +1 -1
  119. package/dist/web/routes/memory.d.ts.map +1 -1
  120. package/dist/web/routes/memory.js +188 -0
  121. package/dist/web/routes/memory.js.map +1 -1
  122. package/dist/web/routes/review-loops.d.ts +12 -0
  123. package/dist/web/routes/review-loops.d.ts.map +1 -0
  124. package/dist/web/routes/review-loops.js +157 -0
  125. package/dist/web/routes/review-loops.js.map +1 -0
  126. package/dist/web/routes/sessions.d.ts.map +1 -1
  127. package/dist/web/routes/sessions.js +14 -0
  128. package/dist/web/routes/sessions.js.map +1 -1
  129. package/dist/web/routes/system.d.ts.map +1 -1
  130. package/dist/web/routes/system.js +34 -23
  131. package/dist/web/routes/system.js.map +1 -1
  132. package/dist/web/routes/workflows.d.ts.map +1 -1
  133. package/dist/web/routes/workflows.js +13 -1
  134. package/dist/web/routes/workflows.js.map +1 -1
  135. package/dist/web/server.d.ts +1 -0
  136. package/dist/web/server.d.ts.map +1 -1
  137. package/dist/web/server.js +30 -2
  138. package/dist/web/server.js.map +1 -1
  139. package/dist/web/utils/request.d.ts +13 -0
  140. package/dist/web/utils/request.d.ts.map +1 -0
  141. package/dist/web/utils/request.js +49 -0
  142. package/dist/web/utils/request.js.map +1 -0
  143. package/dist/web/websocket/handler.d.ts +4 -0
  144. package/dist/web/websocket/handler.d.ts.map +1 -1
  145. package/dist/web/websocket/handler.js +59 -0
  146. package/dist/web/websocket/handler.js.map +1 -1
  147. package/dist/workflows/doc-sync.d.ts.map +1 -1
  148. package/dist/workflows/doc-sync.js +4 -0
  149. package/dist/workflows/doc-sync.js.map +1 -1
  150. package/dist/workflows/full-stack-feature.d.ts +74 -0
  151. package/dist/workflows/full-stack-feature.d.ts.map +1 -0
  152. package/dist/workflows/full-stack-feature.js +273 -0
  153. package/dist/workflows/full-stack-feature.js.map +1 -0
  154. package/dist/workflows/index.d.ts +1 -0
  155. package/dist/workflows/index.d.ts.map +1 -1
  156. package/dist/workflows/index.js +2 -0
  157. package/dist/workflows/index.js.map +1 -1
  158. package/dist/workflows/runner.js.map +1 -1
  159. package/dist/workflows/types.d.ts +6 -5
  160. package/dist/workflows/types.d.ts.map +1 -1
  161. 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":"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"}
@@ -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 (placeholder for future implementation)
2
+ * Authentication middleware
3
3
  */
4
4
  import type { IncomingMessage, ServerResponse } from 'node:http';
5
- export interface AuthContext {
6
- authenticated: boolean;
7
- userId?: string;
8
- permissions?: string[];
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(_options?: {
15
+ export declare function createAuthMiddleware(options?: {
15
16
  required?: boolean;
16
- }): (_req: IncomingMessage, _res: ServerResponse) => AuthContext;
17
+ roles?: string[];
18
+ }): (req: IncomingMessage, res: ServerResponse) => AuthContext;
17
19
  /**
18
- * Extract API key from request headers
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;AAEjE,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,IAEtE,MAAM,eAAe,EACrB,MAAM,cAAc,KACnB,WAAW,CAOf;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAY7D"}
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"}