@generacy-ai/orchestrator 0.0.0-preview-20260304013206
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/LICENSE +191 -0
- package/dist/auth/api-key.d.ts +63 -0
- package/dist/auth/api-key.d.ts.map +1 -0
- package/dist/auth/api-key.js +102 -0
- package/dist/auth/api-key.js.map +1 -0
- package/dist/auth/github-oauth.d.ts +29 -0
- package/dist/auth/github-oauth.d.ts.map +1 -0
- package/dist/auth/github-oauth.js +136 -0
- package/dist/auth/github-oauth.js.map +1 -0
- package/dist/auth/index.d.ts +5 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +9 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/jwt.d.ts +34 -0
- package/dist/auth/jwt.d.ts.map +1 -0
- package/dist/auth/jwt.js +74 -0
- package/dist/auth/jwt.js.map +1 -0
- package/dist/auth/middleware.d.ts +43 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +101 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +5 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +21 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +295 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +733 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +174 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +30 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +173 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/index.d.ts +4 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +4 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/rate-limit.d.ts +32 -0
- package/dist/middleware/rate-limit.d.ts.map +1 -0
- package/dist/middleware/rate-limit.js +92 -0
- package/dist/middleware/rate-limit.js.map +1 -0
- package/dist/middleware/request-logger.d.ts +31 -0
- package/dist/middleware/request-logger.d.ts.map +1 -0
- package/dist/middleware/request-logger.js +89 -0
- package/dist/middleware/request-logger.js.map +1 -0
- package/dist/routes/agents.d.ts +7 -0
- package/dist/routes/agents.d.ts.map +1 -0
- package/dist/routes/agents.js +78 -0
- package/dist/routes/agents.js.map +1 -0
- package/dist/routes/dispatch.d.ts +8 -0
- package/dist/routes/dispatch.d.ts.map +1 -0
- package/dist/routes/dispatch.js +46 -0
- package/dist/routes/dispatch.js.map +1 -0
- package/dist/routes/events.d.ts +14 -0
- package/dist/routes/events.d.ts.map +1 -0
- package/dist/routes/events.js +240 -0
- package/dist/routes/events.js.map +1 -0
- package/dist/routes/health.d.ts +14 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +132 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/index.d.ts +36 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +34 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/integrations.d.ts +34 -0
- package/dist/routes/integrations.d.ts.map +1 -0
- package/dist/routes/integrations.js +81 -0
- package/dist/routes/integrations.js.map +1 -0
- package/dist/routes/metrics.d.ts +31 -0
- package/dist/routes/metrics.d.ts.map +1 -0
- package/dist/routes/metrics.js +157 -0
- package/dist/routes/metrics.js.map +1 -0
- package/dist/routes/pr-webhooks.d.ts +15 -0
- package/dist/routes/pr-webhooks.d.ts.map +1 -0
- package/dist/routes/pr-webhooks.js +114 -0
- package/dist/routes/pr-webhooks.js.map +1 -0
- package/dist/routes/queue.d.ts +7 -0
- package/dist/routes/queue.d.ts.map +1 -0
- package/dist/routes/queue.js +94 -0
- package/dist/routes/queue.js.map +1 -0
- package/dist/routes/webhooks.d.ts +15 -0
- package/dist/routes/webhooks.d.ts.map +1 -0
- package/dist/routes/webhooks.js +117 -0
- package/dist/routes/webhooks.js.map +1 -0
- package/dist/routes/workflows.d.ts +7 -0
- package/dist/routes/workflows.d.ts.map +1 -0
- package/dist/routes/workflows.js +138 -0
- package/dist/routes/workflows.js.map +1 -0
- package/dist/server.d.ts +35 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +264 -0
- package/dist/server.js.map +1 -0
- package/dist/services/agent-registry.d.ts +89 -0
- package/dist/services/agent-registry.d.ts.map +1 -0
- package/dist/services/agent-registry.js +173 -0
- package/dist/services/agent-registry.js.map +1 -0
- package/dist/services/epic-completion-monitor-service.d.ts +69 -0
- package/dist/services/epic-completion-monitor-service.d.ts.map +1 -0
- package/dist/services/epic-completion-monitor-service.js +200 -0
- package/dist/services/epic-completion-monitor-service.js.map +1 -0
- package/dist/services/identity.d.ts +41 -0
- package/dist/services/identity.d.ts.map +1 -0
- package/dist/services/identity.js +91 -0
- package/dist/services/identity.js.map +1 -0
- package/dist/services/index.d.ts +13 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +13 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/label-monitor-service.d.ts +95 -0
- package/dist/services/label-monitor-service.d.ts.map +1 -0
- package/dist/services/label-monitor-service.js +414 -0
- package/dist/services/label-monitor-service.js.map +1 -0
- package/dist/services/label-sync-service.d.ts +76 -0
- package/dist/services/label-sync-service.d.ts.map +1 -0
- package/dist/services/label-sync-service.js +108 -0
- package/dist/services/label-sync-service.js.map +1 -0
- package/dist/services/phase-tracker-service.d.ts +32 -0
- package/dist/services/phase-tracker-service.d.ts.map +1 -0
- package/dist/services/phase-tracker-service.js +82 -0
- package/dist/services/phase-tracker-service.js.map +1 -0
- package/dist/services/pr-feedback-monitor-service.d.ts +86 -0
- package/dist/services/pr-feedback-monitor-service.d.ts.map +1 -0
- package/dist/services/pr-feedback-monitor-service.js +423 -0
- package/dist/services/pr-feedback-monitor-service.js.map +1 -0
- package/dist/services/queue-service.d.ts +62 -0
- package/dist/services/queue-service.d.ts.map +1 -0
- package/dist/services/queue-service.js +147 -0
- package/dist/services/queue-service.js.map +1 -0
- package/dist/services/redis-queue-adapter.d.ts +35 -0
- package/dist/services/redis-queue-adapter.d.ts.map +1 -0
- package/dist/services/redis-queue-adapter.js +218 -0
- package/dist/services/redis-queue-adapter.js.map +1 -0
- package/dist/services/smee-receiver.d.ts +87 -0
- package/dist/services/smee-receiver.d.ts.map +1 -0
- package/dist/services/smee-receiver.js +225 -0
- package/dist/services/smee-receiver.js.map +1 -0
- package/dist/services/webhook-setup-service.d.ts +253 -0
- package/dist/services/webhook-setup-service.d.ts.map +1 -0
- package/dist/services/webhook-setup-service.js +369 -0
- package/dist/services/webhook-setup-service.js.map +1 -0
- package/dist/services/worker-dispatcher.d.ts +57 -0
- package/dist/services/worker-dispatcher.d.ts.map +1 -0
- package/dist/services/worker-dispatcher.js +211 -0
- package/dist/services/worker-dispatcher.js.map +1 -0
- package/dist/services/workflow-service.d.ts +65 -0
- package/dist/services/workflow-service.d.ts.map +1 -0
- package/dist/services/workflow-service.js +164 -0
- package/dist/services/workflow-service.js.map +1 -0
- package/dist/sse/events.d.ts +50 -0
- package/dist/sse/events.d.ts.map +1 -0
- package/dist/sse/events.js +152 -0
- package/dist/sse/events.js.map +1 -0
- package/dist/sse/index.d.ts +4 -0
- package/dist/sse/index.d.ts.map +1 -0
- package/dist/sse/index.js +7 -0
- package/dist/sse/index.js.map +1 -0
- package/dist/sse/stream.d.ts +109 -0
- package/dist/sse/stream.d.ts.map +1 -0
- package/dist/sse/stream.js +239 -0
- package/dist/sse/stream.js.map +1 -0
- package/dist/sse/subscriptions.d.ts +91 -0
- package/dist/sse/subscriptions.d.ts.map +1 -0
- package/dist/sse/subscriptions.js +299 -0
- package/dist/sse/subscriptions.js.map +1 -0
- package/dist/types/api.d.ts +651 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/api.js +169 -0
- package/dist/types/api.js.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +27 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/monitor.d.ts +243 -0
- package/dist/types/monitor.d.ts.map +1 -0
- package/dist/types/monitor.js +2 -0
- package/dist/types/monitor.js.map +1 -0
- package/dist/types/problem-details.d.ts +63 -0
- package/dist/types/problem-details.d.ts.map +1 -0
- package/dist/types/problem-details.js +37 -0
- package/dist/types/problem-details.js.map +1 -0
- package/dist/types/sse.d.ts +224 -0
- package/dist/types/sse.d.ts.map +1 -0
- package/dist/types/sse.js +103 -0
- package/dist/types/sse.js.map +1 -0
- package/dist/types/webhook.d.ts +59 -0
- package/dist/types/webhook.d.ts.map +1 -0
- package/dist/types/webhook.js +2 -0
- package/dist/types/webhook.js.map +1 -0
- package/dist/utils/correlation.d.ts +30 -0
- package/dist/utils/correlation.d.ts.map +1 -0
- package/dist/utils/correlation.js +34 -0
- package/dist/utils/correlation.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/shutdown.d.ts +28 -0
- package/dist/utils/shutdown.d.ts.map +1 -0
- package/dist/utils/shutdown.js +86 -0
- package/dist/utils/shutdown.js.map +1 -0
- package/dist/worker/claude-cli-worker.d.ts +61 -0
- package/dist/worker/claude-cli-worker.d.ts.map +1 -0
- package/dist/worker/claude-cli-worker.js +330 -0
- package/dist/worker/claude-cli-worker.js.map +1 -0
- package/dist/worker/cli-spawner.d.ts +42 -0
- package/dist/worker/cli-spawner.d.ts.map +1 -0
- package/dist/worker/cli-spawner.js +183 -0
- package/dist/worker/cli-spawner.js.map +1 -0
- package/dist/worker/config.d.ts +76 -0
- package/dist/worker/config.d.ts.map +1 -0
- package/dist/worker/config.js +39 -0
- package/dist/worker/config.js.map +1 -0
- package/dist/worker/epic-post-tasks.d.ts +73 -0
- package/dist/worker/epic-post-tasks.d.ts.map +1 -0
- package/dist/worker/epic-post-tasks.js +266 -0
- package/dist/worker/epic-post-tasks.js.map +1 -0
- package/dist/worker/gate-checker.d.ts +22 -0
- package/dist/worker/gate-checker.d.ts.map +1 -0
- package/dist/worker/gate-checker.js +41 -0
- package/dist/worker/gate-checker.js.map +1 -0
- package/dist/worker/index.d.ts +13 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +19 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/label-manager.d.ts +89 -0
- package/dist/worker/label-manager.d.ts.map +1 -0
- package/dist/worker/label-manager.js +200 -0
- package/dist/worker/label-manager.js.map +1 -0
- package/dist/worker/output-capture.d.ts +58 -0
- package/dist/worker/output-capture.d.ts.map +1 -0
- package/dist/worker/output-capture.js +153 -0
- package/dist/worker/output-capture.js.map +1 -0
- package/dist/worker/phase-loop.d.ts +64 -0
- package/dist/worker/phase-loop.d.ts.map +1 -0
- package/dist/worker/phase-loop.js +185 -0
- package/dist/worker/phase-loop.js.map +1 -0
- package/dist/worker/phase-resolver.d.ts +62 -0
- package/dist/worker/phase-resolver.d.ts.map +1 -0
- package/dist/worker/phase-resolver.js +144 -0
- package/dist/worker/phase-resolver.js.map +1 -0
- package/dist/worker/pr-feedback-handler.d.ts +105 -0
- package/dist/worker/pr-feedback-handler.d.ts.map +1 -0
- package/dist/worker/pr-feedback-handler.js +391 -0
- package/dist/worker/pr-feedback-handler.js.map +1 -0
- package/dist/worker/pr-linker.d.ts +69 -0
- package/dist/worker/pr-linker.d.ts.map +1 -0
- package/dist/worker/pr-linker.js +108 -0
- package/dist/worker/pr-linker.js.map +1 -0
- package/dist/worker/pr-manager.d.ts +61 -0
- package/dist/worker/pr-manager.d.ts.map +1 -0
- package/dist/worker/pr-manager.js +140 -0
- package/dist/worker/pr-manager.js.map +1 -0
- package/dist/worker/repo-checkout.d.ts +63 -0
- package/dist/worker/repo-checkout.d.ts.map +1 -0
- package/dist/worker/repo-checkout.js +160 -0
- package/dist/worker/repo-checkout.js.map +1 -0
- package/dist/worker/stage-comment-manager.d.ts +34 -0
- package/dist/worker/stage-comment-manager.d.ts.map +1 -0
- package/dist/worker/stage-comment-manager.js +114 -0
- package/dist/worker/stage-comment-manager.js.map +1 -0
- package/dist/worker/types.d.ts +192 -0
- package/dist/worker/types.d.ts.map +1 -0
- package/dist/worker/types.js +53 -0
- package/dist/worker/types.js.map +1 -0
- package/package.json +64 -0
package/dist/auth/jwt.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create JWT payload from GitHub user
|
|
3
|
+
*/
|
|
4
|
+
export function createJWTPayloadFromGitHubUser(user, scopes = ['workflows:read', 'queue:read', 'agents:read']) {
|
|
5
|
+
return {
|
|
6
|
+
sub: `github:${user.id}`,
|
|
7
|
+
name: user.name || user.login,
|
|
8
|
+
email: user.email,
|
|
9
|
+
provider: 'github',
|
|
10
|
+
scopes,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Sign a JWT token using Fastify JWT plugin
|
|
15
|
+
*/
|
|
16
|
+
export async function signToken(server, payload) {
|
|
17
|
+
return server.jwt.sign(payload);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Verify and decode a JWT token
|
|
21
|
+
*/
|
|
22
|
+
export async function verifyToken(request) {
|
|
23
|
+
try {
|
|
24
|
+
await request.jwtVerify();
|
|
25
|
+
return request.user;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Create auth context from JWT payload
|
|
33
|
+
*/
|
|
34
|
+
export function createAuthContextFromJWT(payload) {
|
|
35
|
+
return {
|
|
36
|
+
userId: payload.sub,
|
|
37
|
+
method: 'jwt',
|
|
38
|
+
scopes: payload.scopes,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Extract bearer token from authorization header
|
|
43
|
+
*/
|
|
44
|
+
export function extractBearerToken(authHeader) {
|
|
45
|
+
if (!authHeader) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
const parts = authHeader.split(' ');
|
|
49
|
+
if (parts.length !== 2 || parts[0]?.toLowerCase() !== 'bearer') {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
return parts[1] ?? null;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Decode JWT payload without verification (for debugging)
|
|
56
|
+
*/
|
|
57
|
+
export function decodeTokenPayload(token) {
|
|
58
|
+
try {
|
|
59
|
+
const parts = token.split('.');
|
|
60
|
+
if (parts.length !== 3) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
const payload = parts[1];
|
|
64
|
+
if (!payload) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
const decoded = Buffer.from(payload, 'base64url').toString('utf-8');
|
|
68
|
+
return JSON.parse(decoded);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=jwt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../src/auth/jwt.ts"],"names":[],"mappings":"AAWA;;GAEG;AACH,MAAM,UAAU,8BAA8B,CAC5C,IAAgB,EAChB,SAAqB,CAAC,gBAAgB,EAAE,YAAY,EAAE,aAAa,CAAC;IAEpE,OAAO;QACL,GAAG,EAAE,UAAU,IAAI,CAAC,EAAE,EAAE;QACxB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK;QAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,QAAQ,EAAE,QAAQ;QAClB,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,MAAuB,EACvB,OAAwC;IAExC,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAuB;IAEvB,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC;QAC1B,OAAO,OAAO,CAAC,IAAkB,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAmB;IAC1D,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,GAAG;QACnB,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAA8B;IAC/D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC/D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAe,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { FastifyRequest, FastifyReply } from 'fastify';
|
|
2
|
+
import type { AuthContext, ApiScope } from '../types/index.js';
|
|
3
|
+
import { type ApiKeyStore } from './api-key.js';
|
|
4
|
+
/**
|
|
5
|
+
* Augment FastifyRequest to include auth context
|
|
6
|
+
*/
|
|
7
|
+
declare module 'fastify' {
|
|
8
|
+
interface FastifyRequest {
|
|
9
|
+
auth: AuthContext;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Authentication middleware options
|
|
14
|
+
*/
|
|
15
|
+
export interface AuthMiddlewareOptions {
|
|
16
|
+
/** API key store for validating API keys */
|
|
17
|
+
apiKeyStore: ApiKeyStore;
|
|
18
|
+
/** Whether authentication is enabled */
|
|
19
|
+
enabled?: boolean;
|
|
20
|
+
/** Routes to skip authentication */
|
|
21
|
+
skipRoutes?: string[];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Create authentication middleware
|
|
25
|
+
*/
|
|
26
|
+
export declare function createAuthMiddleware(options: AuthMiddlewareOptions): (request: FastifyRequest, reply: FastifyReply) => Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Create scope-checking hook
|
|
29
|
+
*/
|
|
30
|
+
export declare function requireScopes(...requiredScopes: ApiScope[]): (request: FastifyRequest, reply: FastifyReply) => Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Create admin-only scope check
|
|
33
|
+
*/
|
|
34
|
+
export declare function requireAdmin(): (request: FastifyRequest, reply: FastifyReply) => Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Create read scope check for a resource
|
|
37
|
+
*/
|
|
38
|
+
export declare function requireRead(resource: 'workflows' | 'queue' | 'agents'): (request: FastifyRequest, reply: FastifyReply) => Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Create write scope check for a resource
|
|
41
|
+
*/
|
|
42
|
+
export declare function requireWrite(resource: 'workflows' | 'queue'): (request: FastifyRequest, reply: FastifyReply) => Promise<void>;
|
|
43
|
+
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/auth/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,cAAc,CAAC;AAGtB;;GAEG;AACH,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,cAAc;QACtB,IAAI,EAAE,WAAW,CAAC;KACnB;CACF;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,4CAA4C;IAC5C,WAAW,EAAE,WAAW,CAAC;IACzB,wCAAwC;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,IAI/D,SAAS,cAAc,EACvB,OAAO,YAAY,KAClB,OAAO,CAAC,IAAI,CAAC,CAmEjB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,cAAc,EAAE,QAAQ,EAAE,IAEvD,SAAS,cAAc,EACvB,OAAO,YAAY,KAClB,OAAO,CAAC,IAAI,CAAC,CAkBjB;AAED;;GAEG;AACH,wBAAgB,YAAY,cAzBf,cAAc,SAChB,YAAY,KAClB,OAAO,CAAC,IAAI,CAAC,CAyBjB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,GAAG,QAAQ,aAhCzD,cAAc,SAChB,YAAY,KAClB,OAAO,CAAC,IAAI,CAAC,CAgCjB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,aAvC/C,cAAc,SAChB,YAAY,KAClB,OAAO,CAAC,IAAI,CAAC,CAuCjB"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { ErrorTypes, createProblemDetails } from '../types/index.js';
|
|
2
|
+
import { API_KEY_HEADER, validateApiKey, createAuthContextFromApiKey, hasAnyScope, } from './api-key.js';
|
|
3
|
+
import { extractBearerToken, verifyToken, createAuthContextFromJWT } from './jwt.js';
|
|
4
|
+
/**
|
|
5
|
+
* Create authentication middleware
|
|
6
|
+
*/
|
|
7
|
+
export function createAuthMiddleware(options) {
|
|
8
|
+
const { apiKeyStore, enabled = true, skipRoutes = [] } = options;
|
|
9
|
+
return async function authMiddleware(request, reply) {
|
|
10
|
+
// Check if auth is disabled
|
|
11
|
+
if (!enabled) {
|
|
12
|
+
request.auth = {
|
|
13
|
+
userId: 'anonymous',
|
|
14
|
+
method: 'api-key',
|
|
15
|
+
scopes: ['admin'],
|
|
16
|
+
};
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
// Check if route should skip auth
|
|
20
|
+
const routePath = request.routeOptions?.url ?? request.url;
|
|
21
|
+
if (skipRoutes.some((route) => routePath.startsWith(route))) {
|
|
22
|
+
request.auth = {
|
|
23
|
+
userId: 'anonymous',
|
|
24
|
+
method: 'api-key',
|
|
25
|
+
scopes: [],
|
|
26
|
+
};
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// Try API key authentication first
|
|
30
|
+
const apiKey = request.headers[API_KEY_HEADER];
|
|
31
|
+
if (typeof apiKey === 'string' && apiKey.length > 0) {
|
|
32
|
+
const result = await validateApiKey(apiKey, apiKeyStore);
|
|
33
|
+
if (result.valid && result.credential) {
|
|
34
|
+
request.auth = createAuthContextFromApiKey(result.credential);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
// Invalid API key
|
|
38
|
+
return reply.status(401).send(createProblemDetails(ErrorTypes.UNAUTHORIZED, 'Invalid API Key', 401, {
|
|
39
|
+
detail: result.error,
|
|
40
|
+
traceId: request.correlationId,
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
// Try JWT authentication
|
|
44
|
+
const authHeader = request.headers.authorization;
|
|
45
|
+
const token = extractBearerToken(authHeader);
|
|
46
|
+
if (token) {
|
|
47
|
+
const payload = await verifyToken(request);
|
|
48
|
+
if (payload) {
|
|
49
|
+
request.auth = createAuthContextFromJWT(payload);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
// Invalid JWT
|
|
53
|
+
return reply.status(401).send(createProblemDetails(ErrorTypes.UNAUTHORIZED, 'Invalid Token', 401, {
|
|
54
|
+
detail: 'The provided JWT token is invalid or expired',
|
|
55
|
+
traceId: request.correlationId,
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
// No authentication provided
|
|
59
|
+
return reply.status(401).send(createProblemDetails(ErrorTypes.UNAUTHORIZED, 'Authentication Required', 401, {
|
|
60
|
+
detail: 'Provide an API key via X-API-Key header or a JWT via Authorization header',
|
|
61
|
+
traceId: request.correlationId,
|
|
62
|
+
}));
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Create scope-checking hook
|
|
67
|
+
*/
|
|
68
|
+
export function requireScopes(...requiredScopes) {
|
|
69
|
+
return async function scopeCheck(request, reply) {
|
|
70
|
+
if (!request.auth) {
|
|
71
|
+
return reply.status(401).send(createProblemDetails(ErrorTypes.UNAUTHORIZED, 'Authentication Required', 401, {
|
|
72
|
+
traceId: request.correlationId,
|
|
73
|
+
}));
|
|
74
|
+
}
|
|
75
|
+
if (!hasAnyScope(request.auth, requiredScopes)) {
|
|
76
|
+
return reply.status(403).send(createProblemDetails(ErrorTypes.FORBIDDEN, 'Insufficient Permissions', 403, {
|
|
77
|
+
detail: `Required scopes: ${requiredScopes.join(' or ')}`,
|
|
78
|
+
traceId: request.correlationId,
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Create admin-only scope check
|
|
85
|
+
*/
|
|
86
|
+
export function requireAdmin() {
|
|
87
|
+
return requireScopes('admin');
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Create read scope check for a resource
|
|
91
|
+
*/
|
|
92
|
+
export function requireRead(resource) {
|
|
93
|
+
return requireScopes(`${resource}:read`, 'admin');
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Create write scope check for a resource
|
|
97
|
+
*/
|
|
98
|
+
export function requireWrite(resource) {
|
|
99
|
+
return requireScopes(`${resource}:write`, 'admin');
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/auth/middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { LogLevelSchema, type LogLevel, ServerConfigSchema, type ServerConfig, RedisConfigSchema, type RedisConfig, GitHubOAuthConfigSchema, type GitHubOAuthConfig, JWTConfigSchema, type JWTConfig, AuthConfigSchema, type AuthConfig, RateLimitConfigSchema, type RateLimitConfig, CorsConfigSchema, type CorsConfig, LoggingConfigSchema, type LoggingConfig, RepositoryConfigSchema, type RepositoryConfig, MonitorConfigSchema, type MonitorConfig, PrMonitorConfigSchema, type PrMonitorConfig, EpicMonitorConfigSchema, type EpicMonitorConfig, DispatchConfigSchema, type DispatchConfig, WorkerConfigSchema, type WorkerConfig, OrchestratorConfigSchema, type OrchestratorConfig, validateConfig, } from './schema.js';
|
|
2
|
+
export { loadConfig, createTestConfig, type LoadConfigOptions } from './loader.js';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EACd,KAAK,QAAQ,EACb,kBAAkB,EAClB,KAAK,YAAY,EACjB,iBAAiB,EACjB,KAAK,WAAW,EAChB,uBAAuB,EACvB,KAAK,iBAAiB,EACtB,eAAe,EACf,KAAK,SAAS,EACd,gBAAgB,EAChB,KAAK,UAAU,EACf,qBAAqB,EACrB,KAAK,eAAe,EACpB,gBAAgB,EAChB,KAAK,UAAU,EACf,mBAAmB,EACnB,KAAK,aAAa,EAClB,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,mBAAmB,EACnB,KAAK,aAAa,EAClB,qBAAqB,EACrB,KAAK,eAAe,EACpB,uBAAuB,EACvB,KAAK,iBAAiB,EACtB,oBAAoB,EACpB,KAAK,cAAc,EACnB,kBAAkB,EAClB,KAAK,YAAY,EACjB,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export {
|
|
2
|
+
// Schema types
|
|
3
|
+
LogLevelSchema, ServerConfigSchema, RedisConfigSchema, GitHubOAuthConfigSchema, JWTConfigSchema, AuthConfigSchema, RateLimitConfigSchema, CorsConfigSchema, LoggingConfigSchema, RepositoryConfigSchema, MonitorConfigSchema, PrMonitorConfigSchema, EpicMonitorConfigSchema, DispatchConfigSchema, WorkerConfigSchema, OrchestratorConfigSchema, validateConfig, } from './schema.js';
|
|
4
|
+
export { loadConfig, createTestConfig } from './loader.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO;AACL,eAAe;AACf,cAAc,EAEd,kBAAkB,EAElB,iBAAiB,EAEjB,uBAAuB,EAEvB,eAAe,EAEf,gBAAgB,EAEhB,qBAAqB,EAErB,gBAAgB,EAEhB,mBAAmB,EAEnB,sBAAsB,EAEtB,mBAAmB,EAEnB,qBAAqB,EAErB,uBAAuB,EAEvB,oBAAoB,EAEpB,kBAAkB,EAElB,wBAAwB,EAExB,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAA0B,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type OrchestratorConfig } from './schema.js';
|
|
2
|
+
export interface LoadConfigOptions {
|
|
3
|
+
/** Path to configuration file (optional, will search defaults if not provided) */
|
|
4
|
+
configFile?: string;
|
|
5
|
+
/** Whether to load from environment variables (default: true) */
|
|
6
|
+
loadEnv?: boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Load configuration from file and environment variables
|
|
10
|
+
*
|
|
11
|
+
* Priority (highest to lowest):
|
|
12
|
+
* 1. Environment variables
|
|
13
|
+
* 2. Configuration file (specified or found)
|
|
14
|
+
* 3. Default values
|
|
15
|
+
*/
|
|
16
|
+
export declare function loadConfig(options?: LoadConfigOptions): OrchestratorConfig;
|
|
17
|
+
/**
|
|
18
|
+
* Create a minimal config for testing
|
|
19
|
+
*/
|
|
20
|
+
export declare function createTestConfig(overrides?: Partial<OrchestratorConfig>): OrchestratorConfig;
|
|
21
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,kBAAkB,EAAkB,MAAM,aAAa,CAAC;AA2QtE,MAAM,WAAW,iBAAiB;IAChC,kFAAkF;IAClF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,kBAAkB,CA8B9E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,GAAE,OAAO,CAAC,kBAAkB,CAAM,GAC1C,kBAAkB,CA8BpB"}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { parse as parseYaml } from 'yaml';
|
|
4
|
+
import { validateConfig } from './schema.js';
|
|
5
|
+
/**
|
|
6
|
+
* Environment variable prefix for configuration
|
|
7
|
+
*/
|
|
8
|
+
const ENV_PREFIX = 'ORCHESTRATOR_';
|
|
9
|
+
/**
|
|
10
|
+
* Default configuration file paths to search
|
|
11
|
+
*/
|
|
12
|
+
const DEFAULT_CONFIG_PATHS = [
|
|
13
|
+
'./orchestrator.yaml',
|
|
14
|
+
'./orchestrator.yml',
|
|
15
|
+
'./config/orchestrator.yaml',
|
|
16
|
+
'./config/orchestrator.yml',
|
|
17
|
+
];
|
|
18
|
+
/**
|
|
19
|
+
* Load configuration from environment variables
|
|
20
|
+
*/
|
|
21
|
+
function loadFromEnv() {
|
|
22
|
+
const config = {
|
|
23
|
+
server: {},
|
|
24
|
+
redis: {},
|
|
25
|
+
auth: {
|
|
26
|
+
jwt: {},
|
|
27
|
+
github: {},
|
|
28
|
+
},
|
|
29
|
+
rateLimit: {},
|
|
30
|
+
cors: {},
|
|
31
|
+
logging: {},
|
|
32
|
+
repositories: undefined,
|
|
33
|
+
};
|
|
34
|
+
// Server config
|
|
35
|
+
if (process.env[`${ENV_PREFIX}PORT`]) {
|
|
36
|
+
config.server.port = parseInt(process.env[`${ENV_PREFIX}PORT`], 10);
|
|
37
|
+
}
|
|
38
|
+
if (process.env[`${ENV_PREFIX}HOST`]) {
|
|
39
|
+
config.server.host = process.env[`${ENV_PREFIX}HOST`];
|
|
40
|
+
}
|
|
41
|
+
// Redis config (REDIS_URL takes precedence, falls back to ORCHESTRATOR_REDIS_URL)
|
|
42
|
+
const redisUrl = process.env['REDIS_URL'] ?? process.env[`${ENV_PREFIX}REDIS_URL`];
|
|
43
|
+
if (redisUrl) {
|
|
44
|
+
config.redis.url = redisUrl;
|
|
45
|
+
}
|
|
46
|
+
// Auth config
|
|
47
|
+
if (process.env[`${ENV_PREFIX}AUTH_ENABLED`]) {
|
|
48
|
+
config.auth.enabled =
|
|
49
|
+
process.env[`${ENV_PREFIX}AUTH_ENABLED`] === 'true';
|
|
50
|
+
}
|
|
51
|
+
if (process.env[`${ENV_PREFIX}JWT_SECRET`]) {
|
|
52
|
+
config.auth.jwt.secret =
|
|
53
|
+
process.env[`${ENV_PREFIX}JWT_SECRET`];
|
|
54
|
+
}
|
|
55
|
+
if (process.env[`${ENV_PREFIX}JWT_EXPIRES_IN`]) {
|
|
56
|
+
config.auth.jwt.expiresIn =
|
|
57
|
+
process.env[`${ENV_PREFIX}JWT_EXPIRES_IN`];
|
|
58
|
+
}
|
|
59
|
+
if (process.env['GITHUB_CLIENT_ID']) {
|
|
60
|
+
config.auth.github.clientId =
|
|
61
|
+
process.env['GITHUB_CLIENT_ID'];
|
|
62
|
+
}
|
|
63
|
+
if (process.env['GITHUB_CLIENT_SECRET']) {
|
|
64
|
+
config.auth.github.clientSecret =
|
|
65
|
+
process.env['GITHUB_CLIENT_SECRET'];
|
|
66
|
+
}
|
|
67
|
+
if (process.env[`${ENV_PREFIX}GITHUB_CALLBACK_URL`]) {
|
|
68
|
+
config.auth.github.callbackUrl =
|
|
69
|
+
process.env[`${ENV_PREFIX}GITHUB_CALLBACK_URL`];
|
|
70
|
+
}
|
|
71
|
+
// Rate limit config
|
|
72
|
+
if (process.env[`${ENV_PREFIX}RATE_LIMIT_ENABLED`]) {
|
|
73
|
+
config.rateLimit.enabled =
|
|
74
|
+
process.env[`${ENV_PREFIX}RATE_LIMIT_ENABLED`] === 'true';
|
|
75
|
+
}
|
|
76
|
+
if (process.env[`${ENV_PREFIX}RATE_LIMIT_MAX`]) {
|
|
77
|
+
config.rateLimit.max = parseInt(process.env[`${ENV_PREFIX}RATE_LIMIT_MAX`], 10);
|
|
78
|
+
}
|
|
79
|
+
if (process.env[`${ENV_PREFIX}RATE_LIMIT_WINDOW`]) {
|
|
80
|
+
config.rateLimit.timeWindow =
|
|
81
|
+
process.env[`${ENV_PREFIX}RATE_LIMIT_WINDOW`];
|
|
82
|
+
}
|
|
83
|
+
// Logging config (LOG_LEVEL takes precedence, falls back to ORCHESTRATOR_LOG_LEVEL)
|
|
84
|
+
const logLevel = process.env['LOG_LEVEL'] ?? process.env[`${ENV_PREFIX}LOG_LEVEL`];
|
|
85
|
+
if (logLevel) {
|
|
86
|
+
config.logging.level = logLevel;
|
|
87
|
+
}
|
|
88
|
+
if (process.env[`${ENV_PREFIX}LOG_PRETTY`]) {
|
|
89
|
+
config.logging.pretty =
|
|
90
|
+
process.env[`${ENV_PREFIX}LOG_PRETTY`] === 'true';
|
|
91
|
+
}
|
|
92
|
+
// Repositories config (MONITORED_REPOS takes precedence, falls back to ORCHESTRATOR_REPOSITORIES)
|
|
93
|
+
const reposStr = process.env['MONITORED_REPOS'] ?? process.env[`${ENV_PREFIX}REPOSITORIES`];
|
|
94
|
+
if (reposStr) {
|
|
95
|
+
const repos = reposStr.split(',').map(r => {
|
|
96
|
+
const [owner, repo] = r.trim().split('/');
|
|
97
|
+
return { owner, repo };
|
|
98
|
+
}).filter(r => r.owner && r.repo);
|
|
99
|
+
config.repositories = repos;
|
|
100
|
+
}
|
|
101
|
+
// Monitor config (POLL_INTERVAL_MS takes precedence, falls back to ORCHESTRATOR_POLL_INTERVAL_MS)
|
|
102
|
+
const pollIntervalMs = process.env['POLL_INTERVAL_MS'] ?? process.env[`${ENV_PREFIX}POLL_INTERVAL_MS`];
|
|
103
|
+
if (pollIntervalMs) {
|
|
104
|
+
if (!config.monitor) {
|
|
105
|
+
config.monitor = {};
|
|
106
|
+
}
|
|
107
|
+
config.monitor.pollIntervalMs = parseInt(pollIntervalMs, 10);
|
|
108
|
+
}
|
|
109
|
+
// Webhook secret (WEBHOOK_SECRET takes precedence, falls back to ORCHESTRATOR_WEBHOOK_SECRET)
|
|
110
|
+
const webhookSecret = process.env['WEBHOOK_SECRET'] ?? process.env[`${ENV_PREFIX}WEBHOOK_SECRET`];
|
|
111
|
+
if (webhookSecret) {
|
|
112
|
+
if (!config.monitor) {
|
|
113
|
+
config.monitor = {};
|
|
114
|
+
}
|
|
115
|
+
config.monitor.webhookSecret = webhookSecret;
|
|
116
|
+
}
|
|
117
|
+
// Cluster GitHub username for assignee-based issue filtering
|
|
118
|
+
const clusterGithubUsername = process.env['CLUSTER_GITHUB_USERNAME'];
|
|
119
|
+
if (clusterGithubUsername) {
|
|
120
|
+
if (!config.monitor) {
|
|
121
|
+
config.monitor = {};
|
|
122
|
+
}
|
|
123
|
+
config.monitor.clusterGithubUsername = clusterGithubUsername;
|
|
124
|
+
}
|
|
125
|
+
// PR Monitor config
|
|
126
|
+
if (process.env['PR_MONITOR_ENABLED']) {
|
|
127
|
+
if (!config.prMonitor) {
|
|
128
|
+
config.prMonitor = {};
|
|
129
|
+
}
|
|
130
|
+
config.prMonitor.enabled =
|
|
131
|
+
process.env['PR_MONITOR_ENABLED'] === 'true';
|
|
132
|
+
}
|
|
133
|
+
if (process.env['PR_MONITOR_POLL_INTERVAL_MS']) {
|
|
134
|
+
if (!config.prMonitor) {
|
|
135
|
+
config.prMonitor = {};
|
|
136
|
+
}
|
|
137
|
+
config.prMonitor.pollIntervalMs = parseInt(process.env['PR_MONITOR_POLL_INTERVAL_MS'], 10);
|
|
138
|
+
}
|
|
139
|
+
if (process.env['PR_MONITOR_WEBHOOK_SECRET']) {
|
|
140
|
+
if (!config.prMonitor) {
|
|
141
|
+
config.prMonitor = {};
|
|
142
|
+
}
|
|
143
|
+
config.prMonitor.webhookSecret =
|
|
144
|
+
process.env['PR_MONITOR_WEBHOOK_SECRET'];
|
|
145
|
+
}
|
|
146
|
+
if (process.env['PR_MONITOR_ADAPTIVE_POLLING']) {
|
|
147
|
+
if (!config.prMonitor) {
|
|
148
|
+
config.prMonitor = {};
|
|
149
|
+
}
|
|
150
|
+
config.prMonitor.adaptivePolling =
|
|
151
|
+
process.env['PR_MONITOR_ADAPTIVE_POLLING'] === 'true';
|
|
152
|
+
}
|
|
153
|
+
if (process.env['PR_MONITOR_MAX_CONCURRENT_POLLS']) {
|
|
154
|
+
if (!config.prMonitor) {
|
|
155
|
+
config.prMonitor = {};
|
|
156
|
+
}
|
|
157
|
+
config.prMonitor.maxConcurrentPolls = parseInt(process.env['PR_MONITOR_MAX_CONCURRENT_POLLS'], 10);
|
|
158
|
+
}
|
|
159
|
+
return config;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Load configuration from a YAML file
|
|
163
|
+
*/
|
|
164
|
+
function loadFromFile(filePath) {
|
|
165
|
+
const absolutePath = resolve(filePath);
|
|
166
|
+
if (!existsSync(absolutePath)) {
|
|
167
|
+
throw new Error(`Configuration file not found: ${absolutePath}`);
|
|
168
|
+
}
|
|
169
|
+
const content = readFileSync(absolutePath, 'utf-8');
|
|
170
|
+
const parsed = parseYaml(content);
|
|
171
|
+
// Return the orchestrator section if present, otherwise the whole config
|
|
172
|
+
return parsed.orchestrator || parsed;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Find the first existing config file from default paths
|
|
176
|
+
*/
|
|
177
|
+
function findConfigFile() {
|
|
178
|
+
for (const configPath of DEFAULT_CONFIG_PATHS) {
|
|
179
|
+
if (existsSync(resolve(configPath))) {
|
|
180
|
+
return configPath;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Deep merge two objects (env overrides file)
|
|
187
|
+
*/
|
|
188
|
+
function deepMerge(target, source) {
|
|
189
|
+
const result = { ...target };
|
|
190
|
+
for (const key of Object.keys(source)) {
|
|
191
|
+
const sourceValue = source[key];
|
|
192
|
+
const targetValue = result[key];
|
|
193
|
+
if (sourceValue === undefined || sourceValue === null || sourceValue === '') {
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
if (typeof sourceValue === 'object' &&
|
|
197
|
+
!Array.isArray(sourceValue) &&
|
|
198
|
+
typeof targetValue === 'object' &&
|
|
199
|
+
!Array.isArray(targetValue)) {
|
|
200
|
+
result[key] = deepMerge(targetValue, sourceValue);
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
result[key] = sourceValue;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return result;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Remove empty nested objects
|
|
210
|
+
*/
|
|
211
|
+
function removeEmpty(obj) {
|
|
212
|
+
const result = {};
|
|
213
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
214
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
215
|
+
const cleaned = removeEmpty(value);
|
|
216
|
+
if (Object.keys(cleaned).length > 0) {
|
|
217
|
+
result[key] = cleaned;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
else if (value !== undefined && value !== null && value !== '') {
|
|
221
|
+
result[key] = value;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return result;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Load configuration from file and environment variables
|
|
228
|
+
*
|
|
229
|
+
* Priority (highest to lowest):
|
|
230
|
+
* 1. Environment variables
|
|
231
|
+
* 2. Configuration file (specified or found)
|
|
232
|
+
* 3. Default values
|
|
233
|
+
*/
|
|
234
|
+
export function loadConfig(options = {}) {
|
|
235
|
+
const { configFile, loadEnv = true } = options;
|
|
236
|
+
let fileConfig = {};
|
|
237
|
+
// Load from file if specified or found
|
|
238
|
+
const configPath = configFile || findConfigFile();
|
|
239
|
+
if (configPath) {
|
|
240
|
+
try {
|
|
241
|
+
fileConfig = loadFromFile(configPath);
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
if (configFile) {
|
|
245
|
+
// If explicitly specified, throw the error
|
|
246
|
+
throw error;
|
|
247
|
+
}
|
|
248
|
+
// Otherwise, continue without file config
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// Load from environment
|
|
252
|
+
let envConfig = {};
|
|
253
|
+
if (loadEnv) {
|
|
254
|
+
envConfig = removeEmpty(loadFromEnv());
|
|
255
|
+
}
|
|
256
|
+
// Merge configs (env overrides file)
|
|
257
|
+
const mergedConfig = deepMerge(fileConfig, envConfig);
|
|
258
|
+
// Validate and return
|
|
259
|
+
return validateConfig(mergedConfig);
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Create a minimal config for testing
|
|
263
|
+
*/
|
|
264
|
+
export function createTestConfig(overrides = {}) {
|
|
265
|
+
return validateConfig({
|
|
266
|
+
server: {
|
|
267
|
+
port: 0, // Random port
|
|
268
|
+
host: '127.0.0.1',
|
|
269
|
+
},
|
|
270
|
+
redis: {
|
|
271
|
+
url: 'redis://localhost:6379',
|
|
272
|
+
},
|
|
273
|
+
auth: {
|
|
274
|
+
enabled: false,
|
|
275
|
+
providers: [],
|
|
276
|
+
jwt: {
|
|
277
|
+
secret: 'test-secret-at-least-32-characters-long',
|
|
278
|
+
expiresIn: '1h',
|
|
279
|
+
},
|
|
280
|
+
},
|
|
281
|
+
rateLimit: {
|
|
282
|
+
enabled: false,
|
|
283
|
+
},
|
|
284
|
+
cors: {
|
|
285
|
+
origin: true,
|
|
286
|
+
credentials: true,
|
|
287
|
+
},
|
|
288
|
+
logging: {
|
|
289
|
+
level: 'error',
|
|
290
|
+
pretty: false,
|
|
291
|
+
},
|
|
292
|
+
...overrides,
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
|