agentrix 0.5.0 → 0.8.0
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/dist/api/auth.d.ts +12 -3
- package/dist/api/auth.d.ts.map +1 -1
- package/dist/api/auth.js +46 -2
- package/dist/api/auth.js.map +1 -1
- package/dist/api/automation.d.ts +5 -1
- package/dist/api/automation.d.ts.map +1 -1
- package/dist/api/automation.js +44 -3
- package/dist/api/automation.js.map +1 -1
- package/dist/api/codex-sdk.d.ts +11 -0
- package/dist/api/codex-sdk.d.ts.map +1 -0
- package/dist/api/codex-sdk.js +38 -0
- package/dist/api/codex-sdk.js.map +1 -0
- package/dist/api/repos.d.ts.map +1 -1
- package/dist/api/repos.js +2 -5
- package/dist/api/repos.js.map +1 -1
- package/dist/config/constants.d.ts +7 -0
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/constants.js +7 -0
- package/dist/config/constants.js.map +1 -1
- package/dist/core/codex-sdk-sessions.d.ts +47 -0
- package/dist/core/codex-sdk-sessions.d.ts.map +1 -0
- package/dist/core/codex-sdk-sessions.js +427 -0
- package/dist/core/codex-sdk-sessions.js.map +1 -0
- package/dist/core/codex-sdk-storage.d.ts +17 -0
- package/dist/core/codex-sdk-storage.d.ts.map +1 -0
- package/dist/core/codex-sdk-storage.js +87 -0
- package/dist/core/codex-sdk-storage.js.map +1 -0
- package/dist/core/ports.d.ts +1 -0
- package/dist/core/ports.d.ts.map +1 -1
- package/dist/core/ports.js +23 -2
- package/dist/core/ports.js.map +1 -1
- package/dist/core/security/rate-limiter.d.ts +17 -0
- package/dist/core/security/rate-limiter.d.ts.map +1 -0
- package/dist/core/security/rate-limiter.js +98 -0
- package/dist/core/security/rate-limiter.js.map +1 -0
- package/dist/core/terminal-sessions.d.ts +1 -0
- package/dist/core/terminal-sessions.d.ts.map +1 -1
- package/dist/core/terminal-sessions.js +89 -41
- package/dist/core/terminal-sessions.js.map +1 -1
- package/dist/domain/git-url-parser.d.ts.map +1 -1
- package/dist/domain/git-url-parser.js +4 -1
- package/dist/domain/git-url-parser.js.map +1 -1
- package/dist/domain/index.d.ts +1 -0
- package/dist/domain/index.d.ts.map +1 -1
- package/dist/domain/index.js +1 -0
- package/dist/domain/index.js.map +1 -1
- package/dist/domain/repository-identifiers.d.ts +19 -0
- package/dist/domain/repository-identifiers.d.ts.map +1 -0
- package/dist/domain/repository-identifiers.js +43 -0
- package/dist/domain/repository-identifiers.js.map +1 -0
- package/dist/repositories/repository-paths.d.ts +6 -0
- package/dist/repositories/repository-paths.d.ts.map +1 -0
- package/dist/repositories/repository-paths.js +27 -0
- package/dist/repositories/repository-paths.js.map +1 -0
- package/dist/repositories/repository-repository.d.ts +2 -5
- package/dist/repositories/repository-repository.d.ts.map +1 -1
- package/dist/repositories/repository-repository.js +3 -7
- package/dist/repositories/repository-repository.js.map +1 -1
- package/dist/repositories/worktree-repository.d.ts.map +1 -1
- package/dist/repositories/worktree-repository.js +7 -6
- package/dist/repositories/worktree-repository.js.map +1 -1
- package/dist/server/codex-sdk-websocket.d.ts +22 -0
- package/dist/server/codex-sdk-websocket.d.ts.map +1 -0
- package/dist/server/codex-sdk-websocket.js +134 -0
- package/dist/server/codex-sdk-websocket.js.map +1 -0
- package/dist/server/events.d.ts.map +1 -1
- package/dist/server/events.js +3 -1
- package/dist/server/events.js.map +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +3 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/router.d.ts +2 -0
- package/dist/server/router.d.ts.map +1 -1
- package/dist/server/router.js +42 -0
- package/dist/server/router.js.map +1 -1
- package/dist/server/websocket.d.ts.map +1 -1
- package/dist/server/websocket.js +28 -3
- package/dist/server/websocket.js.map +1 -1
- package/dist/services/codex-sdk-service.d.ts +25 -0
- package/dist/services/codex-sdk-service.d.ts.map +1 -0
- package/dist/services/codex-sdk-service.js +28 -0
- package/dist/services/codex-sdk-service.js.map +1 -0
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +1 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/worktree-service.d.ts.map +1 -1
- package/dist/services/worktree-service.js +4 -1
- package/dist/services/worktree-service.js.map +1 -1
- package/dist/types/codex-sdk.d.ts +45 -0
- package/dist/types/codex-sdk.d.ts.map +1 -0
- package/dist/types/codex-sdk.js +2 -0
- package/dist/types/codex-sdk.js.map +1 -0
- package/dist/utils/http.d.ts +1 -0
- package/dist/utils/http.d.ts.map +1 -1
- package/dist/utils/http.js +20 -0
- package/dist/utils/http.js.map +1 -1
- package/dist/utils/repository-cache.d.ts +8 -0
- package/dist/utils/repository-cache.d.ts.map +1 -1
- package/dist/utils/repository-cache.js +23 -3
- package/dist/utils/repository-cache.js.map +1 -1
- package/dist/validation/index.d.ts +2 -0
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/index.js +1 -0
- package/dist/validation/index.js.map +1 -1
- package/dist/validation/schemas/codex-sdk-schema.d.ts +15 -0
- package/dist/validation/schemas/codex-sdk-schema.d.ts.map +1 -0
- package/dist/validation/schemas/codex-sdk-schema.js +17 -0
- package/dist/validation/schemas/codex-sdk-schema.js.map +1 -0
- package/package.json +9 -8
- package/ui/dist/assets/index-D3NYbc0T.css +41 -0
- package/ui/dist/assets/index-DR4f3mAT.js +394 -0
- package/ui/dist/index.html +2 -2
- package/ui/dist/assets/index-C8lauPag.css +0 -41
- package/ui/dist/assets/index-DWzSJgcL.js +0 -394
package/dist/api/auth.d.ts
CHANGED
|
@@ -1,18 +1,27 @@
|
|
|
1
1
|
import { sendJson } from '../utils/http.js';
|
|
2
2
|
import { createAuthService } from '../services/index.js';
|
|
3
|
+
import { createRateLimiter } from '../core/security/rate-limiter.js';
|
|
4
|
+
import { createLogger } from '../infrastructure/logging/index.js';
|
|
5
|
+
import type { RateLimiter } from '../core/security/rate-limiter.js';
|
|
6
|
+
import type { Logger } from '../infrastructure/logging/index.js';
|
|
3
7
|
import type { RequestContext } from '../types/http.js';
|
|
4
8
|
import type { AuthManager, CookieManager } from '../types/auth.js';
|
|
5
9
|
interface AuthDependencies {
|
|
6
10
|
createAuthService: typeof createAuthService;
|
|
7
11
|
sendJson: typeof sendJson;
|
|
12
|
+
createRateLimiter: typeof createRateLimiter;
|
|
13
|
+
createLogger: typeof createLogger;
|
|
14
|
+
}
|
|
15
|
+
interface AuthHandlersOptions {
|
|
16
|
+
cookieManager?: CookieManager;
|
|
17
|
+
rateLimiter?: RateLimiter;
|
|
18
|
+
logger?: Logger;
|
|
8
19
|
}
|
|
9
20
|
/**
|
|
10
21
|
* @internal Test hook to override auth handler dependencies
|
|
11
22
|
*/
|
|
12
23
|
export declare function __setAuthTestOverrides(overrides?: Partial<AuthDependencies>): void;
|
|
13
|
-
export declare function createAuthHandlers(authManager: AuthManager,
|
|
14
|
-
cookieManager?: CookieManager;
|
|
15
|
-
}): {
|
|
24
|
+
export declare function createAuthHandlers(authManager: AuthManager, options?: AuthHandlersOptions): {
|
|
16
25
|
login: (context: RequestContext) => Promise<void>;
|
|
17
26
|
logout: (context: RequestContext) => Promise<void>;
|
|
18
27
|
status: (context: RequestContext) => Promise<void>;
|
package/dist/api/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/api/auth.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/api/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAOlE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEnE,UAAU,gBAAgB;IACxB,iBAAiB,EAAE,OAAO,iBAAiB,CAAC;IAC5C,QAAQ,EAAE,OAAO,QAAQ,CAAC;IAC1B,iBAAiB,EAAE,OAAO,iBAAiB,CAAC;IAC5C,YAAY,EAAE,OAAO,YAAY,CAAC;CACnC;AAWD,UAAU,mBAAmB;IAC3B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAMlF;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,GAAE,mBAAwB;;;;EAyE7F"}
|
package/dist/api/auth.js
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
|
-
import { sendJson } from '../utils/http.js';
|
|
1
|
+
import { getClientIp, sendJson } from '../utils/http.js';
|
|
2
2
|
import { createAuthService } from '../services/index.js';
|
|
3
3
|
import { asyncHandler } from '../infrastructure/errors/index.js';
|
|
4
4
|
import { createSimpleHandler } from './base-handler.js';
|
|
5
|
+
import { createRateLimiter } from '../core/security/rate-limiter.js';
|
|
6
|
+
import { createLogger } from '../infrastructure/logging/index.js';
|
|
7
|
+
import { AUTH_RATE_LIMIT_MAX_ATTEMPTS, AUTH_RATE_LIMIT_WINDOW_MS, ERROR_MESSAGES, HTTP_STATUS, } from '../config/constants.js';
|
|
5
8
|
const defaultDependencies = {
|
|
6
9
|
createAuthService,
|
|
7
10
|
sendJson,
|
|
11
|
+
createRateLimiter,
|
|
12
|
+
createLogger,
|
|
8
13
|
};
|
|
9
14
|
let activeDependencies = { ...defaultDependencies };
|
|
10
15
|
/**
|
|
@@ -17,20 +22,59 @@ export function __setAuthTestOverrides(overrides) {
|
|
|
17
22
|
}
|
|
18
23
|
activeDependencies = { ...activeDependencies, ...overrides };
|
|
19
24
|
}
|
|
20
|
-
export function createAuthHandlers(authManager,
|
|
25
|
+
export function createAuthHandlers(authManager, options = {}) {
|
|
26
|
+
const { cookieManager, rateLimiter, logger } = options;
|
|
21
27
|
const authService = activeDependencies.createAuthService(authManager, cookieManager);
|
|
28
|
+
const log = activeDependencies.createLogger(logger);
|
|
29
|
+
const loginRateLimiter = rateLimiter ||
|
|
30
|
+
activeDependencies.createRateLimiter({
|
|
31
|
+
windowMs: AUTH_RATE_LIMIT_WINDOW_MS,
|
|
32
|
+
maxAttempts: AUTH_RATE_LIMIT_MAX_ATTEMPTS,
|
|
33
|
+
});
|
|
22
34
|
// Login requires special error handling for status codes
|
|
23
35
|
const login = asyncHandler(async (context) => {
|
|
24
36
|
const payload = await context.readJsonBody();
|
|
25
37
|
const password = typeof payload['password'] === 'string' ? payload['password'].trim() : '';
|
|
38
|
+
const username = typeof payload['username'] === 'string' ? payload['username'].trim() : '';
|
|
39
|
+
const clientIp = getClientIp(context.req);
|
|
40
|
+
const limiterKey = clientIp;
|
|
41
|
+
const limiterStatus = loginRateLimiter.check(limiterKey);
|
|
42
|
+
if (limiterStatus.limited) {
|
|
43
|
+
log.warn('[agentrix] Login attempt throttled', {
|
|
44
|
+
clientIp,
|
|
45
|
+
username: username || 'n/a',
|
|
46
|
+
attempts: limiterStatus.attempts,
|
|
47
|
+
retryAfterMs: limiterStatus.retryAfterMs,
|
|
48
|
+
});
|
|
49
|
+
activeDependencies.sendJson(context.res, HTTP_STATUS.TOO_MANY_REQUESTS, {
|
|
50
|
+
error: ERROR_MESSAGES.TOO_MANY_LOGIN_ATTEMPTS,
|
|
51
|
+
});
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
26
54
|
try {
|
|
27
55
|
const result = await authService.login(context.req, context.res, password);
|
|
56
|
+
loginRateLimiter.reset(limiterKey);
|
|
28
57
|
activeDependencies.sendJson(context.res, 200, result);
|
|
29
58
|
}
|
|
30
59
|
catch (error) {
|
|
31
60
|
// Auth errors need special handling for status codes
|
|
32
61
|
const err = error;
|
|
33
62
|
const statusCode = err.statusCode || (err.message === 'Invalid password' ? 401 : 400);
|
|
63
|
+
if (err.message === 'Invalid password') {
|
|
64
|
+
const failure = loginRateLimiter.recordFailure(limiterKey);
|
|
65
|
+
if (failure.limited) {
|
|
66
|
+
log.warn('[agentrix] Login rate limit triggered', {
|
|
67
|
+
clientIp,
|
|
68
|
+
username: username || 'n/a',
|
|
69
|
+
attempts: failure.attempts,
|
|
70
|
+
retryAfterMs: failure.retryAfterMs,
|
|
71
|
+
});
|
|
72
|
+
activeDependencies.sendJson(context.res, HTTP_STATUS.TOO_MANY_REQUESTS, {
|
|
73
|
+
error: ERROR_MESSAGES.TOO_MANY_LOGIN_ATTEMPTS,
|
|
74
|
+
});
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
34
78
|
activeDependencies.sendJson(context.res, statusCode, { error: err.message });
|
|
35
79
|
}
|
|
36
80
|
});
|
package/dist/api/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/api/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/api/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/api/automation.d.ts
CHANGED
|
@@ -7,7 +7,9 @@ import { generatePlanText } from '../core/automation/plan.js';
|
|
|
7
7
|
import { createGitOrchestrator } from '../core/automation/git-orchestration.js';
|
|
8
8
|
import { runAutomationTask } from '../core/automation/task-runner.js';
|
|
9
9
|
import { createLogger } from '../infrastructure/logging/index.js';
|
|
10
|
+
import { createRateLimiter } from '../core/security/rate-limiter.js';
|
|
10
11
|
import type { Logger } from '../infrastructure/logging/index.js';
|
|
12
|
+
import type { RateLimiter } from '../core/security/rate-limiter.js';
|
|
11
13
|
interface AutomationModuleDependencies {
|
|
12
14
|
cloneRepository: typeof cloneRepository;
|
|
13
15
|
ensureRepository: typeof ensureRepository;
|
|
@@ -21,6 +23,7 @@ interface AutomationModuleDependencies {
|
|
|
21
23
|
createGitOrchestrator: typeof createGitOrchestrator;
|
|
22
24
|
runAutomationTask: typeof runAutomationTask;
|
|
23
25
|
createLogger: typeof createLogger;
|
|
26
|
+
createRateLimiter: typeof createRateLimiter;
|
|
24
27
|
}
|
|
25
28
|
/**
|
|
26
29
|
* @internal Test hook to override automation dependencies
|
|
@@ -65,8 +68,9 @@ export interface AutomationHandlersDependencies {
|
|
|
65
68
|
runTaskImpl?: typeof runTask;
|
|
66
69
|
now?: () => number;
|
|
67
70
|
createRequestId?: () => string;
|
|
71
|
+
rateLimiter?: RateLimiter;
|
|
68
72
|
}
|
|
69
|
-
export declare function createAutomationHandlers({ workdir, agentCommands, apiKey, branchNameGenerator, planService, logger, defaultBranches, }: AutomationHandlersConfig, { ensureRepositoryExists: ensureRepoExists, ensureWorktreeExists: ensureWorktree, launchAgentProcess: launchAgent, runTaskImpl, now, createRequestId, }?: AutomationHandlersDependencies): {
|
|
73
|
+
export declare function createAutomationHandlers({ workdir, agentCommands, apiKey, branchNameGenerator, planService, logger, defaultBranches, }: AutomationHandlersConfig, { ensureRepositoryExists: ensureRepoExists, ensureWorktreeExists: ensureWorktree, launchAgentProcess: launchAgent, runTaskImpl, now, createRequestId, rateLimiter: injectedRateLimiter, }?: AutomationHandlersDependencies): {
|
|
70
74
|
launch: (context: {
|
|
71
75
|
req: unknown;
|
|
72
76
|
res: unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automation.d.ts","sourceRoot":"","sources":["../../src/api/automation.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,eAAe,EAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,OAAO,EACL,yBAAyB,
|
|
1
|
+
{"version":3,"file":"automation.d.ts","sourceRoot":"","sources":["../../src/api/automation.ts"],"names":[],"mappings":"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"}
|
package/dist/api/automation.js
CHANGED
|
@@ -2,13 +2,15 @@ import { randomUUID } from 'node:crypto';
|
|
|
2
2
|
import { cloneRepository, createWorktree, ensureRepository, getWorktreePath, } from '../core/git.js';
|
|
3
3
|
import { launchAgentProcess } from '../core/agents.js';
|
|
4
4
|
import { runTask } from '../core/tasks.js';
|
|
5
|
-
import { sendJson } from '../utils/http.js';
|
|
6
|
-
import { validateAutomationRequest, AutomationRequestError, } from '../core/automation/request-validation.js';
|
|
5
|
+
import { getClientIp, sendJson } from '../utils/http.js';
|
|
6
|
+
import { validateAutomationRequest, AutomationRequestError, extractApiKey, } from '../core/automation/request-validation.js';
|
|
7
7
|
import { resolveBranchName } from '../core/automation/branch.js';
|
|
8
8
|
import { generatePlanText } from '../core/automation/plan.js';
|
|
9
9
|
import { createGitOrchestrator } from '../core/automation/git-orchestration.js';
|
|
10
10
|
import { runAutomationTask } from '../core/automation/task-runner.js';
|
|
11
11
|
import { createLogger } from '../infrastructure/logging/index.js';
|
|
12
|
+
import { createRateLimiter } from '../core/security/rate-limiter.js';
|
|
13
|
+
import { AUTOMATION_RATE_LIMIT_MAX_ATTEMPTS, AUTOMATION_RATE_LIMIT_WINDOW_MS, ERROR_MESSAGES, HTTP_STATUS, } from '../config/constants.js';
|
|
12
14
|
const defaultAutomationDependencies = {
|
|
13
15
|
cloneRepository,
|
|
14
16
|
ensureRepository,
|
|
@@ -22,6 +24,7 @@ const defaultAutomationDependencies = {
|
|
|
22
24
|
createGitOrchestrator,
|
|
23
25
|
runAutomationTask,
|
|
24
26
|
createLogger,
|
|
27
|
+
createRateLimiter,
|
|
25
28
|
};
|
|
26
29
|
let activeAutomationDependencies = { ...defaultAutomationDependencies };
|
|
27
30
|
/**
|
|
@@ -103,14 +106,36 @@ function finishMetrics(key, success, durationMs) {
|
|
|
103
106
|
}
|
|
104
107
|
bucket.totalLatencyMs += durationMs;
|
|
105
108
|
}
|
|
106
|
-
export function createAutomationHandlers({ workdir, agentCommands, apiKey, branchNameGenerator, planService, logger, defaultBranches, }, { ensureRepositoryExists: ensureRepoExists = ensureRepositoryExists, ensureWorktreeExists: ensureWorktree = ensureWorktreeExists, launchAgentProcess: launchAgent = activeAutomationDependencies.launchAgentProcess, runTaskImpl = activeAutomationDependencies.runTask, now = () => Date.now(), createRequestId = () => randomUUID(), } = {}) {
|
|
109
|
+
export function createAutomationHandlers({ workdir, agentCommands, apiKey, branchNameGenerator, planService, logger, defaultBranches, }, { ensureRepositoryExists: ensureRepoExists = ensureRepositoryExists, ensureWorktreeExists: ensureWorktree = ensureWorktreeExists, launchAgentProcess: launchAgent = activeAutomationDependencies.launchAgentProcess, runTaskImpl = activeAutomationDependencies.runTask, now = () => Date.now(), createRequestId = () => randomUUID(), rateLimiter: injectedRateLimiter, } = {}) {
|
|
107
110
|
const gitOrchestrator = activeAutomationDependencies.createGitOrchestrator({
|
|
108
111
|
ensureRepositoryExists: ensureRepoExists,
|
|
109
112
|
ensureWorktreeExists: ensureWorktree,
|
|
110
113
|
});
|
|
111
114
|
const log = activeAutomationDependencies.createLogger(logger);
|
|
115
|
+
const automationRateLimiter = injectedRateLimiter ||
|
|
116
|
+
activeAutomationDependencies.createRateLimiter({
|
|
117
|
+
windowMs: AUTOMATION_RATE_LIMIT_WINDOW_MS,
|
|
118
|
+
maxAttempts: AUTOMATION_RATE_LIMIT_MAX_ATTEMPTS,
|
|
119
|
+
});
|
|
112
120
|
async function launch(context) {
|
|
121
|
+
const req = context.req;
|
|
113
122
|
const ctx = context;
|
|
123
|
+
const providedApiKey = extractApiKey(req);
|
|
124
|
+
const clientIp = getClientIp(req);
|
|
125
|
+
const limiterKey = clientIp;
|
|
126
|
+
const limiterStatus = automationRateLimiter.check(limiterKey);
|
|
127
|
+
if (limiterStatus.limited) {
|
|
128
|
+
log.warn('[agentrix] Automation request throttled', {
|
|
129
|
+
clientIp,
|
|
130
|
+
apiKeyProvided: Boolean(providedApiKey),
|
|
131
|
+
attempts: limiterStatus.attempts,
|
|
132
|
+
retryAfterMs: limiterStatus.retryAfterMs,
|
|
133
|
+
});
|
|
134
|
+
sendJson(ctx.res, HTTP_STATUS.TOO_MANY_REQUESTS, {
|
|
135
|
+
error: ERROR_MESSAGES.TOO_MANY_AUTOMATION_ATTEMPTS,
|
|
136
|
+
});
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
114
139
|
let validation;
|
|
115
140
|
try {
|
|
116
141
|
validation = await activeAutomationDependencies.validateAutomationRequest({
|
|
@@ -122,6 +147,21 @@ export function createAutomationHandlers({ workdir, agentCommands, apiKey, branc
|
|
|
122
147
|
}
|
|
123
148
|
catch (error) {
|
|
124
149
|
if (error instanceof AutomationRequestError) {
|
|
150
|
+
if (error.status === 401) {
|
|
151
|
+
const failure = automationRateLimiter.recordFailure(limiterKey);
|
|
152
|
+
if (failure.limited) {
|
|
153
|
+
log.warn('[agentrix] Automation rate limit triggered', {
|
|
154
|
+
clientIp,
|
|
155
|
+
apiKeyProvided: Boolean(providedApiKey),
|
|
156
|
+
attempts: failure.attempts,
|
|
157
|
+
retryAfterMs: failure.retryAfterMs,
|
|
158
|
+
});
|
|
159
|
+
sendJson(ctx.res, HTTP_STATUS.TOO_MANY_REQUESTS, {
|
|
160
|
+
error: ERROR_MESSAGES.TOO_MANY_AUTOMATION_ATTEMPTS,
|
|
161
|
+
});
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
125
165
|
sendJson(ctx.res, error.status, { error: error.message });
|
|
126
166
|
return;
|
|
127
167
|
}
|
|
@@ -129,6 +169,7 @@ export function createAutomationHandlers({ workdir, agentCommands, apiKey, branc
|
|
|
129
169
|
sendJson(ctx.res, 500, { error: 'Unexpected error while validating automation request' });
|
|
130
170
|
return;
|
|
131
171
|
}
|
|
172
|
+
automationRateLimiter.reset(limiterKey);
|
|
132
173
|
const { planEnabled, prompt, org, repo, worktreeInput, agent, routeLabel } = validation;
|
|
133
174
|
const metricsKey = planEnabled ? 'planTrue' : 'planFalse';
|
|
134
175
|
automationPlanMetrics[metricsKey].requests += 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automation.js","sourceRoot":"","sources":["../../src/api/automation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EACL,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"automation.js","sourceRoot":"","sources":["../../src/api/automation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type CodexSdkService } from '../services/index.js';
|
|
2
|
+
export interface CodexSdkHandlerOverrides {
|
|
3
|
+
codexSdkService?: CodexSdkService;
|
|
4
|
+
}
|
|
5
|
+
export declare function createCodexSdkHandlers(workdir: string, overrides?: CodexSdkHandlerOverrides): {
|
|
6
|
+
listSessions: (context: import("../types/http.js").RequestContext) => Promise<void>;
|
|
7
|
+
createSession: (context: import("../types/http.js").RequestContext) => Promise<void>;
|
|
8
|
+
readSession: (context: import("../types/http.js").RequestContext) => Promise<void>;
|
|
9
|
+
deleteSession: (context: import("../types/http.js").RequestContext) => Promise<void>;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=codex-sdk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-sdk.d.ts","sourceRoot":"","sources":["../../src/api/codex-sdk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAUnF,MAAM,WAAW,wBAAwB;IACvC,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,wBAA6B;;;;;EAoC/F"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { createCodexSdkService } from '../services/index.js';
|
|
2
|
+
import { createHandler } from './base-handler.js';
|
|
3
|
+
import { asyncHandler, NotFoundError } from '../infrastructure/errors/index.js';
|
|
4
|
+
import { sendJson } from '../utils/http.js';
|
|
5
|
+
import { validateCodexSessionList, validateCodexSessionCreate, validateCodexSessionId, } from '../validation/index.js';
|
|
6
|
+
export function createCodexSdkHandlers(workdir, overrides = {}) {
|
|
7
|
+
const codexSdkService = overrides.codexSdkService ?? createCodexSdkService(workdir);
|
|
8
|
+
const listSessions = asyncHandler(async (context) => {
|
|
9
|
+
const paramsObject = Object.fromEntries(context.url.searchParams.entries());
|
|
10
|
+
const input = validateCodexSessionList(paramsObject);
|
|
11
|
+
const sessions = await codexSdkService.listSessions(input);
|
|
12
|
+
sendJson(context.res, 200, { sessions });
|
|
13
|
+
});
|
|
14
|
+
const createSession = createHandler({
|
|
15
|
+
validator: validateCodexSessionCreate,
|
|
16
|
+
handler: async (input) => codexSdkService.createSession(input),
|
|
17
|
+
});
|
|
18
|
+
const readSession = asyncHandler(async (context) => {
|
|
19
|
+
const { sessionId } = validateCodexSessionId({ sessionId: context.params?.['id'] });
|
|
20
|
+
const detail = await codexSdkService.getSession(sessionId);
|
|
21
|
+
if (!detail) {
|
|
22
|
+
throw new NotFoundError('Codex session not found');
|
|
23
|
+
}
|
|
24
|
+
sendJson(context.res, 200, detail);
|
|
25
|
+
});
|
|
26
|
+
const deleteSession = asyncHandler(async (context) => {
|
|
27
|
+
const { sessionId } = validateCodexSessionId({ sessionId: context.params?.['id'] });
|
|
28
|
+
await codexSdkService.deleteSession(sessionId);
|
|
29
|
+
sendJson(context.res, 200, { ok: true });
|
|
30
|
+
});
|
|
31
|
+
return {
|
|
32
|
+
listSessions,
|
|
33
|
+
createSession,
|
|
34
|
+
readSession,
|
|
35
|
+
deleteSession,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=codex-sdk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-sdk.js","sourceRoot":"","sources":["../../src/api/codex-sdk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAwB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAMhC,MAAM,UAAU,sBAAsB,CAAC,OAAe,EAAE,YAAsC,EAAE;IAC9F,MAAM,eAAe,GAAG,SAAS,CAAC,eAAe,IAAI,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAEpF,MAAM,YAAY,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAClD,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5E,MAAM,KAAK,GAAG,wBAAwB,CAAC,YAAY,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAC3D,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,aAAa,CAAC;QAClC,SAAS,EAAE,0BAA0B;QACrC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC;KAC/D,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACjD,MAAM,EAAE,SAAS,EAAE,GAAG,sBAAsB,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,aAAa,CAAC,yBAAyB,CAAC,CAAC;QACrD,CAAC;QACD,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACnD,MAAM,EAAE,SAAS,EAAE,GAAG,sBAAsB,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpF,MAAM,eAAe,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC/C,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,YAAY;QACZ,aAAa;QACb,WAAW;QACX,aAAa;KACd,CAAC;AACJ,CAAC"}
|
package/dist/api/repos.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repos.d.ts","sourceRoot":"","sources":["../../src/api/repos.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAIvF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAOvD,MAAM,WAAW,qBAAqB;IACpC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,qBAA0B;;;;;;
|
|
1
|
+
{"version":3,"file":"repos.d.ts","sourceRoot":"","sources":["../../src/api/repos.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAIvF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAOvD,MAAM,WAAW,qBAAqB;IACpC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,qBAA0B;;;;;;EA2CxF"}
|
package/dist/api/repos.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRepositoryService } from '../services/index.js';
|
|
2
|
-
import { handleHeadRequest } from '../utils/http.js';
|
|
2
|
+
import { handleHeadRequest, sendJson } from '../utils/http.js';
|
|
3
3
|
import { asyncHandler } from '../infrastructure/errors/index.js';
|
|
4
4
|
import { createHandler } from './base-handler.js';
|
|
5
5
|
import { validateRepositoryCreate, validateRepositoryDelete, validateInitCommandUpdate, } from '../validation/index.js';
|
|
@@ -11,10 +11,7 @@ export function createRepoHandlers(workdir, overrides = {}) {
|
|
|
11
11
|
return;
|
|
12
12
|
}
|
|
13
13
|
const data = await repositoryService.listRepositories();
|
|
14
|
-
context.res
|
|
15
|
-
context.res.statusCode = 200;
|
|
16
|
-
context.res.setHeader('Content-Type', 'application/json; charset=utf-8');
|
|
17
|
-
context.res.end(JSON.stringify({ data }));
|
|
14
|
+
sendJson(context.res, 200, { data });
|
|
18
15
|
});
|
|
19
16
|
const create = createHandler({
|
|
20
17
|
validator: validateRepositoryCreate,
|
package/dist/api/repos.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repos.js","sourceRoot":"","sources":["../../src/api/repos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAA0B,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"repos.js","sourceRoot":"","sources":["../../src/api/repos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAA0B,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAMhC,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,YAAmC,EAAE;IACvF,MAAM,iBAAiB,GAAG,SAAS,CAAC,iBAAiB,IAAI,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAE1F,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,EAAE,OAAuB,EAAE,EAAE;QAC1D,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,gBAAgB,EAAE,CAAC;QACxD,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,aAAa,CAAC;QAC3B,SAAS,EAAE,wBAAwB;QACnC,OAAO,EAAE,KAAK,EAAE,KAA2C,EAAE,EAAE,CAC7D,iBAAiB,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,WAAW,CAAC;KAChE,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,aAAa,CAAC;QAC/B,SAAS,EAAE,wBAAwB;QACnC,OAAO,EAAE,KAAK,EAAE,KAAoC,EAAE,EAAE;YACtD,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7E,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAAG,aAAa,CAAC;QACtC,SAAS,EAAE,yBAAyB;QACpC,OAAO,EAAE,KAAK,EAAE,KAAyD,EAAE,EAAE;YAC3E,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YACjG,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,CAAC;KACF,CAAC,CAAC;IAEH,OAAO;QACL,IAAI;QACJ,MAAM;QACN,MAAM,EAAE,UAAU;QAClB,8CAA8C;QAC9C,OAAO,EAAE,UAAU;QACnB,iBAAiB;KAClB,CAAC;AACJ,CAAC"}
|
|
@@ -7,6 +7,10 @@ export declare const SESSION_MAX_AGE_SECONDS: number;
|
|
|
7
7
|
export declare const TMUX_BIN = "tmux";
|
|
8
8
|
export declare const TMUX_SESSION_PREFIX = "tw-";
|
|
9
9
|
export declare const MAX_REQUEST_BODY_SIZE: number;
|
|
10
|
+
export declare const AUTH_RATE_LIMIT_WINDOW_MS: number;
|
|
11
|
+
export declare const AUTH_RATE_LIMIT_MAX_ATTEMPTS = 5;
|
|
12
|
+
export declare const AUTOMATION_RATE_LIMIT_WINDOW_MS: number;
|
|
13
|
+
export declare const AUTOMATION_RATE_LIMIT_MAX_ATTEMPTS = 5;
|
|
10
14
|
/** HTTP Status Codes */
|
|
11
15
|
export declare const HTTP_STATUS: {
|
|
12
16
|
readonly OK: 200;
|
|
@@ -18,6 +22,7 @@ export declare const HTTP_STATUS: {
|
|
|
18
22
|
readonly FORBIDDEN: 403;
|
|
19
23
|
readonly NOT_FOUND: 404;
|
|
20
24
|
readonly METHOD_NOT_ALLOWED: 405;
|
|
25
|
+
readonly TOO_MANY_REQUESTS: 429;
|
|
21
26
|
readonly INTERNAL_SERVER_ERROR: 500;
|
|
22
27
|
readonly BAD_GATEWAY: 502;
|
|
23
28
|
readonly SERVICE_UNAVAILABLE: 503;
|
|
@@ -27,6 +32,8 @@ export declare const ERROR_MESSAGES: {
|
|
|
27
32
|
readonly AUTH_REQUIRED: "Authentication required";
|
|
28
33
|
readonly INVALID_PASSWORD: "Invalid password";
|
|
29
34
|
readonly INVALID_PAYLOAD: "Invalid request payload";
|
|
35
|
+
readonly TOO_MANY_LOGIN_ATTEMPTS: "Too many failed login attempts. Try again later.";
|
|
36
|
+
readonly TOO_MANY_AUTOMATION_ATTEMPTS: "Automation requests are temporarily blocked. Try again later.";
|
|
30
37
|
readonly REPOSITORY_NOT_FOUND: "Repository not found";
|
|
31
38
|
readonly WORKTREE_NOT_FOUND: "Worktree not found";
|
|
32
39
|
readonly SESSION_NOT_FOUND: "Terminal session not found";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/config/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,YAAY,CAAC;AACtC,eAAO,MAAM,YAAY,OAAO,CAAC;AACjC,eAAO,MAAM,mBAAmB,SAAS,CAAC;AAC1C,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,eAAO,MAAM,mBAAmB,8BAA8B,CAAC;AAC/D,eAAO,MAAM,uBAAuB,QAAc,CAAC;AACnD,eAAO,MAAM,QAAQ,SAAS,CAAC;AAC/B,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AACzC,eAAO,MAAM,qBAAqB,QAAc,CAAC;AAEjD,wBAAwB;AACxB,eAAO,MAAM,WAAW
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/config/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,YAAY,CAAC;AACtC,eAAO,MAAM,YAAY,OAAO,CAAC;AACjC,eAAO,MAAM,mBAAmB,SAAS,CAAC;AAC1C,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,eAAO,MAAM,mBAAmB,8BAA8B,CAAC;AAC/D,eAAO,MAAM,uBAAuB,QAAc,CAAC;AACnD,eAAO,MAAM,QAAQ,SAAS,CAAC;AAC/B,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AACzC,eAAO,MAAM,qBAAqB,QAAc,CAAC;AAEjD,eAAO,MAAM,yBAAyB,QAAgB,CAAC;AACvD,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAC9C,eAAO,MAAM,+BAA+B,QAAY,CAAC;AACzD,eAAO,MAAM,kCAAkC,IAAI,CAAC;AAEpD,wBAAwB;AACxB,eAAO,MAAM,WAAW;;;;;;;;;;;;;;CAcd,CAAC;AAEX,4BAA4B;AAC5B,eAAO,MAAM,cAAc;;;;;;;;;;CAUjB,CAAC"}
|
package/dist/config/constants.js
CHANGED
|
@@ -7,6 +7,10 @@ export const SESSION_MAX_AGE_SECONDS = 60 * 60 * 8;
|
|
|
7
7
|
export const TMUX_BIN = 'tmux';
|
|
8
8
|
export const TMUX_SESSION_PREFIX = 'tw-';
|
|
9
9
|
export const MAX_REQUEST_BODY_SIZE = 1024 * 1024;
|
|
10
|
+
export const AUTH_RATE_LIMIT_WINDOW_MS = 5 * 60 * 1000;
|
|
11
|
+
export const AUTH_RATE_LIMIT_MAX_ATTEMPTS = 5;
|
|
12
|
+
export const AUTOMATION_RATE_LIMIT_WINDOW_MS = 60 * 1000;
|
|
13
|
+
export const AUTOMATION_RATE_LIMIT_MAX_ATTEMPTS = 5;
|
|
10
14
|
/** HTTP Status Codes */
|
|
11
15
|
export const HTTP_STATUS = {
|
|
12
16
|
OK: 200,
|
|
@@ -18,6 +22,7 @@ export const HTTP_STATUS = {
|
|
|
18
22
|
FORBIDDEN: 403,
|
|
19
23
|
NOT_FOUND: 404,
|
|
20
24
|
METHOD_NOT_ALLOWED: 405,
|
|
25
|
+
TOO_MANY_REQUESTS: 429,
|
|
21
26
|
INTERNAL_SERVER_ERROR: 500,
|
|
22
27
|
BAD_GATEWAY: 502,
|
|
23
28
|
SERVICE_UNAVAILABLE: 503,
|
|
@@ -27,6 +32,8 @@ export const ERROR_MESSAGES = {
|
|
|
27
32
|
AUTH_REQUIRED: 'Authentication required',
|
|
28
33
|
INVALID_PASSWORD: 'Invalid password',
|
|
29
34
|
INVALID_PAYLOAD: 'Invalid request payload',
|
|
35
|
+
TOO_MANY_LOGIN_ATTEMPTS: 'Too many failed login attempts. Try again later.',
|
|
36
|
+
TOO_MANY_AUTOMATION_ATTEMPTS: 'Automation requests are temporarily blocked. Try again later.',
|
|
30
37
|
REPOSITORY_NOT_FOUND: 'Repository not found',
|
|
31
38
|
WORKTREE_NOT_FOUND: 'Worktree not found',
|
|
32
39
|
SESSION_NOT_FOUND: 'Terminal session not found',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/config/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,SAAS,CAAC;AACtC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AACjC,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAC1C,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAClC,MAAM,CAAC,MAAM,mBAAmB,GAAG,2BAA2B,CAAC;AAC/D,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACnD,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC;AAC/B,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AACzC,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,GAAG,IAAI,CAAC;AAEjD,wBAAwB;AACxB,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,EAAE,EAAE,GAAG;IACP,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG;IACb,UAAU,EAAE,GAAG;IACf,WAAW,EAAE,GAAG;IAChB,YAAY,EAAE,GAAG;IACjB,SAAS,EAAE,GAAG;IACd,SAAS,EAAE,GAAG;IACd,kBAAkB,EAAE,GAAG;IACvB,qBAAqB,EAAE,GAAG;IAC1B,WAAW,EAAE,GAAG;IAChB,mBAAmB,EAAE,GAAG;CAChB,CAAC;AAEX,4BAA4B;AAC5B,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,aAAa,EAAE,yBAAyB;IACxC,gBAAgB,EAAE,kBAAkB;IACpC,eAAe,EAAE,yBAAyB;IAC1C,oBAAoB,EAAE,sBAAsB;IAC5C,kBAAkB,EAAE,oBAAoB;IACxC,iBAAiB,EAAE,4BAA4B;IAC/C,kBAAkB,EAAE,oBAAoB;CAChC,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/config/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,SAAS,CAAC;AACtC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AACjC,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAC1C,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAClC,MAAM,CAAC,MAAM,mBAAmB,GAAG,2BAA2B,CAAC;AAC/D,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACnD,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC;AAC/B,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AACzC,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,GAAG,IAAI,CAAC;AAEjD,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AACvD,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAC9C,MAAM,CAAC,MAAM,+BAA+B,GAAG,EAAE,GAAG,IAAI,CAAC;AACzD,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAAC,CAAC;AAEpD,wBAAwB;AACxB,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,EAAE,EAAE,GAAG;IACP,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG;IACb,UAAU,EAAE,GAAG;IACf,WAAW,EAAE,GAAG;IAChB,YAAY,EAAE,GAAG;IACjB,SAAS,EAAE,GAAG;IACd,SAAS,EAAE,GAAG;IACd,kBAAkB,EAAE,GAAG;IACvB,iBAAiB,EAAE,GAAG;IACtB,qBAAqB,EAAE,GAAG;IAC1B,WAAW,EAAE,GAAG;IAChB,mBAAmB,EAAE,GAAG;CAChB,CAAC;AAEX,4BAA4B;AAC5B,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,aAAa,EAAE,yBAAyB;IACxC,gBAAgB,EAAE,kBAAkB;IACpC,eAAe,EAAE,yBAAyB;IAC1C,uBAAuB,EAAE,kDAAkD;IAC3E,4BAA4B,EAAE,+DAA+D;IAC7F,oBAAoB,EAAE,sBAAsB;IAC5C,kBAAkB,EAAE,oBAAoB;IACxC,iBAAiB,EAAE,4BAA4B;IAC/C,kBAAkB,EAAE,oBAAoB;CAChC,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { EventEmitter } from 'node:events';
|
|
3
|
+
import { Codex, type ThreadOptions } from '@openai/codex-sdk';
|
|
4
|
+
import { getWorktreePath } from './git.js';
|
|
5
|
+
import { listStoredSessions, writeStoredSession, deleteStoredSession } from './codex-sdk-storage.js';
|
|
6
|
+
import type { CodexSdkEvent, CodexSdkSessionSummary } from '../types/codex-sdk.js';
|
|
7
|
+
interface CodexSessionDependencies {
|
|
8
|
+
codexFactory: () => Codex;
|
|
9
|
+
getWorktreePath: typeof getWorktreePath;
|
|
10
|
+
randomUUID: typeof randomUUID;
|
|
11
|
+
now: () => Date;
|
|
12
|
+
createEventEmitter: () => EventEmitter;
|
|
13
|
+
listStoredSessions: typeof listStoredSessions;
|
|
14
|
+
writeStoredSession: typeof writeStoredSession;
|
|
15
|
+
deleteStoredSession: typeof deleteStoredSession;
|
|
16
|
+
isVerboseLoggingEnabled: () => boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare function listCodexSdkSessions({ workdir, org, repo, branch, }: {
|
|
19
|
+
workdir: string;
|
|
20
|
+
org: string;
|
|
21
|
+
repo: string;
|
|
22
|
+
branch: string;
|
|
23
|
+
}): Promise<CodexSdkSessionSummary[]>;
|
|
24
|
+
export declare function createCodexSdkSession({ workdir, org, repo, branch, label, threadOptions, }: {
|
|
25
|
+
workdir: string;
|
|
26
|
+
org: string;
|
|
27
|
+
repo: string;
|
|
28
|
+
branch: string;
|
|
29
|
+
label?: string;
|
|
30
|
+
threadOptions?: ThreadOptions;
|
|
31
|
+
}): Promise<{
|
|
32
|
+
summary: CodexSdkSessionSummary;
|
|
33
|
+
events: CodexSdkEvent[];
|
|
34
|
+
}>;
|
|
35
|
+
export declare function getCodexSdkSessionDetails(sessionId: string): {
|
|
36
|
+
summary: CodexSdkSessionSummary;
|
|
37
|
+
events: CodexSdkEvent[];
|
|
38
|
+
} | null;
|
|
39
|
+
export declare function deleteCodexSdkSession(sessionId: string): Promise<void>;
|
|
40
|
+
export declare function getCodexSdkSession(sessionId: string): CodexSdkSessionSummary | null;
|
|
41
|
+
export declare function getCodexSdkSessionEvents(sessionId: string): CodexSdkEvent[];
|
|
42
|
+
export declare function sendCodexSdkUserMessage(sessionId: string, text: string): Promise<void>;
|
|
43
|
+
export declare function subscribeToCodexSdkEvents(sessionId: string, handler: (event: CodexSdkEvent) => void): () => void;
|
|
44
|
+
export declare function __setCodexSdkSessionOverrides(overrides?: Partial<CodexSessionDependencies>): void;
|
|
45
|
+
export declare function resetCodexSdkSessions(): void;
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=codex-sdk-sessions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-sdk-sessions.d.ts","sourceRoot":"","sources":["../../src/core/codex-sdk-sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,KAAK,EAEL,KAAK,aAAa,EASnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EAEpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAoBnF,UAAU,wBAAwB;IAChC,YAAY,EAAE,MAAM,KAAK,CAAC;IAC1B,eAAe,EAAE,OAAO,eAAe,CAAC;IACxC,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,GAAG,EAAE,MAAM,IAAI,CAAC;IAChB,kBAAkB,EAAE,MAAM,YAAY,CAAC;IACvC,kBAAkB,EAAE,OAAO,kBAAkB,CAAC;IAC9C,kBAAkB,EAAE,OAAO,kBAAkB,CAAC;IAC9C,mBAAmB,EAAE,OAAO,mBAAmB,CAAC;IAChD,uBAAuB,EAAE,MAAM,OAAO,CAAC;CACxC;AAoVD,wBAAsB,oBAAoB,CAAC,EACzC,OAAO,EACP,GAAG,EACH,IAAI,EACJ,MAAM,GACP,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAWpC;AAED,wBAAsB,qBAAqB,CAAC,EAC1C,OAAO,EACP,GAAG,EACH,IAAI,EACJ,MAAM,EACN,KAAK,EACL,aAAa,GACd,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,sBAAsB,CAAC;IAAC,MAAM,EAAE,aAAa,EAAE,CAAA;CAAE,CAAC,CAiCxE;AAED,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,sBAAsB,CAAC;IAAC,MAAM,EAAE,aAAa,EAAE,CAAA;CAAE,GAAG,IAAI,CAMhI;AAED,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW5E;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,sBAAsB,GAAG,IAAI,CAGnF;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,EAAE,CAE3E;AAED,wBAAsB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B5F;AAED,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,GACtC,MAAM,IAAI,CAKZ;AAcD,wBAAgB,6BAA6B,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,wBAAwB,CAAC,GAAG,IAAI,CAGjG;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAI5C"}
|