@supaku/agentfactory-nextjs 0.3.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/LICENSE +21 -0
- package/dist/src/factory.d.ts +105 -0
- package/dist/src/factory.d.ts.map +1 -0
- package/dist/src/factory.js +89 -0
- package/dist/src/handlers/cleanup.d.ts +44 -0
- package/dist/src/handlers/cleanup.d.ts.map +1 -0
- package/dist/src/handlers/cleanup.js +34 -0
- package/dist/src/handlers/public/session-detail.d.ts +31 -0
- package/dist/src/handlers/public/session-detail.d.ts.map +1 -0
- package/dist/src/handlers/public/session-detail.js +91 -0
- package/dist/src/handlers/public/sessions-list.d.ts +20 -0
- package/dist/src/handlers/public/sessions-list.d.ts.map +1 -0
- package/dist/src/handlers/public/sessions-list.js +73 -0
- package/dist/src/handlers/public/stats.d.ts +22 -0
- package/dist/src/handlers/public/stats.d.ts.map +1 -0
- package/dist/src/handlers/public/stats.js +53 -0
- package/dist/src/handlers/sessions/activity.d.ts +15 -0
- package/dist/src/handlers/sessions/activity.d.ts.map +1 -0
- package/dist/src/handlers/sessions/activity.js +77 -0
- package/dist/src/handlers/sessions/claim.d.ts +15 -0
- package/dist/src/handlers/sessions/claim.d.ts.map +1 -0
- package/dist/src/handlers/sessions/claim.js +87 -0
- package/dist/src/handlers/sessions/completion.d.ts +16 -0
- package/dist/src/handlers/sessions/completion.d.ts.map +1 -0
- package/dist/src/handlers/sessions/completion.js +82 -0
- package/dist/src/handlers/sessions/external-urls.d.ts +15 -0
- package/dist/src/handlers/sessions/external-urls.d.ts.map +1 -0
- package/dist/src/handlers/sessions/external-urls.js +59 -0
- package/dist/src/handlers/sessions/get.d.ts +19 -0
- package/dist/src/handlers/sessions/get.d.ts.map +1 -0
- package/dist/src/handlers/sessions/get.js +46 -0
- package/dist/src/handlers/sessions/list.d.ts +26 -0
- package/dist/src/handlers/sessions/list.d.ts.map +1 -0
- package/dist/src/handlers/sessions/list.js +50 -0
- package/dist/src/handlers/sessions/lock-refresh.d.ts +14 -0
- package/dist/src/handlers/sessions/lock-refresh.d.ts.map +1 -0
- package/dist/src/handlers/sessions/lock-refresh.js +38 -0
- package/dist/src/handlers/sessions/progress.d.ts +15 -0
- package/dist/src/handlers/sessions/progress.d.ts.map +1 -0
- package/dist/src/handlers/sessions/progress.js +82 -0
- package/dist/src/handlers/sessions/prompts.d.ts +15 -0
- package/dist/src/handlers/sessions/prompts.d.ts.map +1 -0
- package/dist/src/handlers/sessions/prompts.js +91 -0
- package/dist/src/handlers/sessions/status.d.ts +18 -0
- package/dist/src/handlers/sessions/status.d.ts.map +1 -0
- package/dist/src/handlers/sessions/status.js +131 -0
- package/dist/src/handlers/sessions/tool-error.d.ts +15 -0
- package/dist/src/handlers/sessions/tool-error.d.ts.map +1 -0
- package/dist/src/handlers/sessions/tool-error.js +91 -0
- package/dist/src/handlers/sessions/transfer-ownership.d.ts +14 -0
- package/dist/src/handlers/sessions/transfer-ownership.d.ts.map +1 -0
- package/dist/src/handlers/sessions/transfer-ownership.js +56 -0
- package/dist/src/handlers/workers/get-delete.d.ts +15 -0
- package/dist/src/handlers/workers/get-delete.d.ts.map +1 -0
- package/dist/src/handlers/workers/get-delete.js +58 -0
- package/dist/src/handlers/workers/heartbeat.d.ts +14 -0
- package/dist/src/handlers/workers/heartbeat.d.ts.map +1 -0
- package/dist/src/handlers/workers/heartbeat.js +42 -0
- package/dist/src/handlers/workers/list.d.ts +22 -0
- package/dist/src/handlers/workers/list.d.ts.map +1 -0
- package/dist/src/handlers/workers/list.js +33 -0
- package/dist/src/handlers/workers/poll.d.ts +14 -0
- package/dist/src/handlers/workers/poll.d.ts.map +1 -0
- package/dist/src/handlers/workers/poll.js +78 -0
- package/dist/src/handlers/workers/register.d.ts +9 -0
- package/dist/src/handlers/workers/register.d.ts.map +1 -0
- package/dist/src/handlers/workers/register.js +41 -0
- package/dist/src/index.d.ts +39 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +41 -0
- package/dist/src/middleware/cron-auth.d.ts +21 -0
- package/dist/src/middleware/cron-auth.d.ts.map +1 -0
- package/dist/src/middleware/cron-auth.js +46 -0
- package/dist/src/middleware/worker-auth.d.ts +25 -0
- package/dist/src/middleware/worker-auth.d.ts.map +1 -0
- package/dist/src/middleware/worker-auth.js +43 -0
- package/dist/src/types.d.ts +62 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +7 -0
- package/dist/src/webhook/handlers/issue-updated.d.ts +14 -0
- package/dist/src/webhook/handlers/issue-updated.d.ts.map +1 -0
- package/dist/src/webhook/handlers/issue-updated.js +462 -0
- package/dist/src/webhook/handlers/session-created.d.ts +9 -0
- package/dist/src/webhook/handlers/session-created.d.ts.map +1 -0
- package/dist/src/webhook/handlers/session-created.js +229 -0
- package/dist/src/webhook/handlers/session-prompted.d.ts +9 -0
- package/dist/src/webhook/handlers/session-prompted.d.ts.map +1 -0
- package/dist/src/webhook/handlers/session-prompted.js +197 -0
- package/dist/src/webhook/handlers/session-updated.d.ts +9 -0
- package/dist/src/webhook/handlers/session-updated.d.ts.map +1 -0
- package/dist/src/webhook/handlers/session-updated.js +29 -0
- package/dist/src/webhook/processor.d.ts +22 -0
- package/dist/src/webhook/processor.d.ts.map +1 -0
- package/dist/src/webhook/processor.js +98 -0
- package/dist/src/webhook/signature.d.ts +16 -0
- package/dist/src/webhook/signature.d.ts.map +1 -0
- package/dist/src/webhook/signature.js +23 -0
- package/dist/src/webhook/utils.d.ts +61 -0
- package/dist/src/webhook/utils.d.ts.map +1 -0
- package/dist/src/webhook/utils.js +159 -0
- package/package.json +66 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* POST /api/workers/[id]/heartbeat
|
|
3
|
+
*
|
|
4
|
+
* Send a heartbeat from a worker to keep registration active.
|
|
5
|
+
*/
|
|
6
|
+
import { NextResponse } from 'next/server';
|
|
7
|
+
import { requireWorkerAuth } from '../../middleware/worker-auth.js';
|
|
8
|
+
import { updateHeartbeat, getWorker, createLogger } from '@supaku/agentfactory-server';
|
|
9
|
+
const log = createLogger('api:workers:heartbeat');
|
|
10
|
+
export function createWorkerHeartbeatHandler() {
|
|
11
|
+
return async function POST(request, { params }) {
|
|
12
|
+
const authError = requireWorkerAuth(request);
|
|
13
|
+
if (authError)
|
|
14
|
+
return authError;
|
|
15
|
+
const { id: workerId } = await params;
|
|
16
|
+
try {
|
|
17
|
+
const body = await request.json();
|
|
18
|
+
const { activeCount, load } = body;
|
|
19
|
+
if (typeof activeCount !== 'number' || activeCount < 0) {
|
|
20
|
+
return NextResponse.json({ error: 'Bad Request', message: 'activeCount must be a non-negative number' }, { status: 400 });
|
|
21
|
+
}
|
|
22
|
+
const worker = await getWorker(workerId);
|
|
23
|
+
if (!worker) {
|
|
24
|
+
return NextResponse.json({ error: 'Not Found', message: 'Worker not found' }, { status: 404 });
|
|
25
|
+
}
|
|
26
|
+
const result = await updateHeartbeat(workerId, activeCount, load);
|
|
27
|
+
if (!result) {
|
|
28
|
+
return NextResponse.json({ error: 'Service Unavailable', message: 'Failed to update heartbeat' }, { status: 503 });
|
|
29
|
+
}
|
|
30
|
+
log.debug('Heartbeat received', {
|
|
31
|
+
workerId,
|
|
32
|
+
activeCount,
|
|
33
|
+
pendingWorkCount: result.pendingWorkCount,
|
|
34
|
+
});
|
|
35
|
+
return NextResponse.json(result);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
log.error('Failed to process heartbeat', { error, workerId });
|
|
39
|
+
return NextResponse.json({ error: 'Internal Server Error', message: 'Failed to process heartbeat' }, { status: 500 });
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GET /api/workers
|
|
3
|
+
*
|
|
4
|
+
* List all registered workers.
|
|
5
|
+
* Used by dashboard to display worker status.
|
|
6
|
+
*/
|
|
7
|
+
import { NextResponse } from 'next/server';
|
|
8
|
+
export declare function createWorkerListHandler(): () => Promise<NextResponse<{
|
|
9
|
+
workers: import("@supaku/agentfactory-server").WorkerInfo[];
|
|
10
|
+
summary: {
|
|
11
|
+
queueLength: number;
|
|
12
|
+
totalCapacity: number;
|
|
13
|
+
totalActive: number;
|
|
14
|
+
availableCapacity: number;
|
|
15
|
+
totalWorkers: number;
|
|
16
|
+
activeWorkers: number;
|
|
17
|
+
};
|
|
18
|
+
}> | NextResponse<{
|
|
19
|
+
error: string;
|
|
20
|
+
message: string;
|
|
21
|
+
}>>;
|
|
22
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../src/handlers/workers/list.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAK1C,wBAAgB,uBAAuB;;;;;;;;;;;;;IA0BtC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GET /api/workers
|
|
3
|
+
*
|
|
4
|
+
* List all registered workers.
|
|
5
|
+
* Used by dashboard to display worker status.
|
|
6
|
+
*/
|
|
7
|
+
import { NextResponse } from 'next/server';
|
|
8
|
+
import { listWorkers, getTotalCapacity, getQueueLength, createLogger } from '@supaku/agentfactory-server';
|
|
9
|
+
const log = createLogger('api:workers:list');
|
|
10
|
+
export function createWorkerListHandler() {
|
|
11
|
+
return async function GET() {
|
|
12
|
+
try {
|
|
13
|
+
const [workers, capacity, queueLength] = await Promise.all([
|
|
14
|
+
listWorkers(),
|
|
15
|
+
getTotalCapacity(),
|
|
16
|
+
getQueueLength(),
|
|
17
|
+
]);
|
|
18
|
+
return NextResponse.json({
|
|
19
|
+
workers,
|
|
20
|
+
summary: {
|
|
21
|
+
totalWorkers: workers.length,
|
|
22
|
+
activeWorkers: workers.filter((w) => w.status === 'active').length,
|
|
23
|
+
...capacity,
|
|
24
|
+
queueLength,
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
log.error('Failed to list workers', { error });
|
|
30
|
+
return NextResponse.json({ error: 'Internal Server Error', message: 'Failed to list workers' }, { status: 500 });
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GET /api/workers/[id]/poll
|
|
3
|
+
*
|
|
4
|
+
* Poll for pending work items and follow-up prompts.
|
|
5
|
+
*/
|
|
6
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
7
|
+
interface RouteParams {
|
|
8
|
+
params: Promise<{
|
|
9
|
+
id: string;
|
|
10
|
+
}>;
|
|
11
|
+
}
|
|
12
|
+
export declare function createWorkerPollHandler(): (request: NextRequest, { params }: RouteParams) => Promise<NextResponse<unknown>>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=poll.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poll.d.ts","sourceRoot":"","sources":["../../../../src/handlers/workers/poll.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAavD,UAAU,WAAW;IACnB,MAAM,EAAE,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAChC;AAED,wBAAgB,uBAAuB,KACX,SAAS,WAAW,EAAE,YAAY,WAAW,oCAmFxE"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GET /api/workers/[id]/poll
|
|
3
|
+
*
|
|
4
|
+
* Poll for pending work items and follow-up prompts.
|
|
5
|
+
*/
|
|
6
|
+
import { NextResponse } from 'next/server';
|
|
7
|
+
import { requireWorkerAuth } from '../../middleware/worker-auth.js';
|
|
8
|
+
import { getWorker, peekWork, getPendingPrompts, maybeCleanupOrphans, createLogger, } from '@supaku/agentfactory-server';
|
|
9
|
+
const log = createLogger('api:workers:poll');
|
|
10
|
+
export function createWorkerPollHandler() {
|
|
11
|
+
return async function GET(request, { params }) {
|
|
12
|
+
const authError = requireWorkerAuth(request);
|
|
13
|
+
if (authError)
|
|
14
|
+
return authError;
|
|
15
|
+
const { id: workerId } = await params;
|
|
16
|
+
try {
|
|
17
|
+
maybeCleanupOrphans().catch((err) => {
|
|
18
|
+
log.error('Background orphan cleanup failed', { error: err });
|
|
19
|
+
});
|
|
20
|
+
const worker = await getWorker(workerId);
|
|
21
|
+
if (!worker) {
|
|
22
|
+
return NextResponse.json({ error: 'Not Found', message: 'Worker not found' }, { status: 404 });
|
|
23
|
+
}
|
|
24
|
+
const availableCapacity = worker.capacity - worker.activeCount;
|
|
25
|
+
let work = [];
|
|
26
|
+
if (availableCapacity > 0) {
|
|
27
|
+
const limit = Math.min(availableCapacity, 5);
|
|
28
|
+
work = await peekWork(limit);
|
|
29
|
+
}
|
|
30
|
+
const pendingPrompts = {};
|
|
31
|
+
let totalPendingPrompts = 0;
|
|
32
|
+
if (worker.activeSessions.length > 0) {
|
|
33
|
+
await Promise.all(worker.activeSessions.map(async (sessionId) => {
|
|
34
|
+
const prompts = await getPendingPrompts(sessionId);
|
|
35
|
+
if (prompts.length > 0) {
|
|
36
|
+
pendingPrompts[sessionId] = prompts;
|
|
37
|
+
totalPendingPrompts += prompts.length;
|
|
38
|
+
}
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
if (work.length > 0 || totalPendingPrompts > 0) {
|
|
42
|
+
log.info('Poll result with items', {
|
|
43
|
+
workerId,
|
|
44
|
+
availableCapacity,
|
|
45
|
+
workCount: work.length,
|
|
46
|
+
workItems: work.map((w) => ({
|
|
47
|
+
sessionId: w.sessionId,
|
|
48
|
+
issueIdentifier: w.issueIdentifier,
|
|
49
|
+
workType: w.workType,
|
|
50
|
+
})),
|
|
51
|
+
activeSessionCount: worker.activeSessions.length,
|
|
52
|
+
pendingPromptsCount: totalPendingPrompts,
|
|
53
|
+
pendingPromptsBySession: Object.entries(pendingPrompts).map(([sessionId, prompts]) => ({
|
|
54
|
+
sessionId,
|
|
55
|
+
count: prompts.length,
|
|
56
|
+
promptIds: prompts.map((p) => p.id),
|
|
57
|
+
})),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
log.debug('Poll result (empty)', {
|
|
62
|
+
workerId,
|
|
63
|
+
availableCapacity,
|
|
64
|
+
activeSessionCount: worker.activeSessions.length,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
return NextResponse.json({
|
|
68
|
+
work,
|
|
69
|
+
pendingPrompts,
|
|
70
|
+
hasPendingPrompts: totalPendingPrompts > 0,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
log.error('Failed to poll for work', { error, workerId });
|
|
75
|
+
return NextResponse.json({ error: 'Internal Server Error', message: 'Failed to poll for work' }, { status: 500 });
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* POST /api/workers/register
|
|
3
|
+
*
|
|
4
|
+
* Register a new worker with the coordinator.
|
|
5
|
+
* Returns worker ID and configuration.
|
|
6
|
+
*/
|
|
7
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
8
|
+
export declare function createWorkerRegisterHandler(): (request: NextRequest) => Promise<NextResponse<unknown>>;
|
|
9
|
+
//# sourceMappingURL=register.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../../src/handlers/workers/register.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAMvD,wBAAgB,2BAA2B,KACd,SAAS,WAAW,oCA8ChD"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* POST /api/workers/register
|
|
3
|
+
*
|
|
4
|
+
* Register a new worker with the coordinator.
|
|
5
|
+
* Returns worker ID and configuration.
|
|
6
|
+
*/
|
|
7
|
+
import { NextResponse } from 'next/server';
|
|
8
|
+
import { requireWorkerAuth } from '../../middleware/worker-auth.js';
|
|
9
|
+
import { registerWorker, createLogger } from '@supaku/agentfactory-server';
|
|
10
|
+
const log = createLogger('api:workers:register');
|
|
11
|
+
export function createWorkerRegisterHandler() {
|
|
12
|
+
return async function POST(request) {
|
|
13
|
+
const authError = requireWorkerAuth(request);
|
|
14
|
+
if (authError)
|
|
15
|
+
return authError;
|
|
16
|
+
try {
|
|
17
|
+
const body = await request.json();
|
|
18
|
+
const { hostname, capacity, version } = body;
|
|
19
|
+
if (!hostname || typeof hostname !== 'string') {
|
|
20
|
+
return NextResponse.json({ error: 'Bad Request', message: 'hostname is required' }, { status: 400 });
|
|
21
|
+
}
|
|
22
|
+
if (!capacity || typeof capacity !== 'number' || capacity < 1) {
|
|
23
|
+
return NextResponse.json({ error: 'Bad Request', message: 'capacity must be a positive number' }, { status: 400 });
|
|
24
|
+
}
|
|
25
|
+
const result = await registerWorker(hostname, capacity, version);
|
|
26
|
+
if (!result) {
|
|
27
|
+
return NextResponse.json({ error: 'Service Unavailable', message: 'Failed to register worker' }, { status: 503 });
|
|
28
|
+
}
|
|
29
|
+
log.info('Worker registered via API', {
|
|
30
|
+
workerId: result.workerId,
|
|
31
|
+
hostname,
|
|
32
|
+
capacity,
|
|
33
|
+
});
|
|
34
|
+
return NextResponse.json(result, { status: 201 });
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
log.error('Failed to register worker', { error });
|
|
38
|
+
return NextResponse.json({ error: 'Internal Server Error', message: 'Failed to register worker' }, { status: 500 });
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @supaku/agentfactory-nextjs
|
|
3
|
+
*
|
|
4
|
+
* Next.js API route handlers for AgentFactory.
|
|
5
|
+
* Provides webhook processing, worker/session management, and public stats.
|
|
6
|
+
*/
|
|
7
|
+
export type { LinearClientResolver, RouteConfig, WebhookConfig, AutoTriggerConfig, CronConfig, RouteHandler, } from './types.js';
|
|
8
|
+
export { createAllRoutes } from './factory.js';
|
|
9
|
+
export type { AllRoutes } from './factory.js';
|
|
10
|
+
export { verifyCronAuth } from './middleware/cron-auth.js';
|
|
11
|
+
export { verifyWorkerAuth, requireWorkerAuth, unauthorizedResponse, isWorkerAuthConfigured, } from './middleware/worker-auth.js';
|
|
12
|
+
export { createWebhookHandler } from './webhook/processor.js';
|
|
13
|
+
export { verifyWebhookSignature } from './webhook/signature.js';
|
|
14
|
+
export { createWorkerRegisterHandler } from './handlers/workers/register.js';
|
|
15
|
+
export { createWorkerListHandler } from './handlers/workers/list.js';
|
|
16
|
+
export { createWorkerGetHandler, createWorkerDeleteHandler } from './handlers/workers/get-delete.js';
|
|
17
|
+
export { createWorkerHeartbeatHandler } from './handlers/workers/heartbeat.js';
|
|
18
|
+
export { createWorkerPollHandler } from './handlers/workers/poll.js';
|
|
19
|
+
export { createSessionListHandler } from './handlers/sessions/list.js';
|
|
20
|
+
export type { AgentSessionResponse } from './handlers/sessions/list.js';
|
|
21
|
+
export { createSessionGetHandler } from './handlers/sessions/get.js';
|
|
22
|
+
export { createSessionClaimHandler } from './handlers/sessions/claim.js';
|
|
23
|
+
export { createSessionStatusPostHandler, createSessionStatusGetHandler } from './handlers/sessions/status.js';
|
|
24
|
+
export { createSessionLockRefreshHandler } from './handlers/sessions/lock-refresh.js';
|
|
25
|
+
export { createSessionPromptsGetHandler, createSessionPromptsPostHandler } from './handlers/sessions/prompts.js';
|
|
26
|
+
export { createSessionTransferOwnershipHandler } from './handlers/sessions/transfer-ownership.js';
|
|
27
|
+
export { createSessionActivityHandler } from './handlers/sessions/activity.js';
|
|
28
|
+
export { createSessionCompletionHandler } from './handlers/sessions/completion.js';
|
|
29
|
+
export { createSessionExternalUrlsHandler } from './handlers/sessions/external-urls.js';
|
|
30
|
+
export { createSessionProgressHandler } from './handlers/sessions/progress.js';
|
|
31
|
+
export { createSessionToolErrorHandler } from './handlers/sessions/tool-error.js';
|
|
32
|
+
export { createPublicStatsHandler } from './handlers/public/stats.js';
|
|
33
|
+
export type { PublicStatsResponse } from './handlers/public/stats.js';
|
|
34
|
+
export { createPublicSessionsListHandler } from './handlers/public/sessions-list.js';
|
|
35
|
+
export type { PublicSessionResponse } from './handlers/public/sessions-list.js';
|
|
36
|
+
export { createPublicSessionDetailHandler } from './handlers/public/session-detail.js';
|
|
37
|
+
export type { PublicSessionDetailResponse } from './handlers/public/session-detail.js';
|
|
38
|
+
export { createCleanupHandler } from './handlers/cleanup.js';
|
|
39
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,oBAAoB,EACpB,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,UAAU,EACV,YAAY,GACb,MAAM,YAAY,CAAA;AAGnB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAG7C,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,6BAA6B,CAAA;AAGpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAK/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAA;AAC5E,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAA;AACpE,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAA;AACpG,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAA;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAA;AAGpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAA;AACtE,YAAY,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAA;AACpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAA;AACxE,OAAO,EAAE,8BAA8B,EAAE,6BAA6B,EAAE,MAAM,+BAA+B,CAAA;AAC7G,OAAO,EAAE,+BAA+B,EAAE,MAAM,qCAAqC,CAAA;AACrF,OAAO,EAAE,8BAA8B,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAA;AAChH,OAAO,EAAE,qCAAqC,EAAE,MAAM,2CAA2C,CAAA;AAGjG,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAA;AAC9E,OAAO,EAAE,8BAA8B,EAAE,MAAM,mCAAmC,CAAA;AAClF,OAAO,EAAE,gCAAgC,EAAE,MAAM,sCAAsC,CAAA;AACvF,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAA;AAC9E,OAAO,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAA;AAGjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAA;AACrE,YAAY,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AACrE,OAAO,EAAE,+BAA+B,EAAE,MAAM,oCAAoC,CAAA;AACpF,YAAY,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAA;AAC/E,OAAO,EAAE,gCAAgC,EAAE,MAAM,qCAAqC,CAAA;AACtF,YAAY,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AAGtF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @supaku/agentfactory-nextjs
|
|
3
|
+
*
|
|
4
|
+
* Next.js API route handlers for AgentFactory.
|
|
5
|
+
* Provides webhook processing, worker/session management, and public stats.
|
|
6
|
+
*/
|
|
7
|
+
// Factory
|
|
8
|
+
export { createAllRoutes } from './factory.js';
|
|
9
|
+
// Middleware
|
|
10
|
+
export { verifyCronAuth } from './middleware/cron-auth.js';
|
|
11
|
+
export { verifyWorkerAuth, requireWorkerAuth, unauthorizedResponse, isWorkerAuthConfigured, } from './middleware/worker-auth.js';
|
|
12
|
+
// Webhook
|
|
13
|
+
export { createWebhookHandler } from './webhook/processor.js';
|
|
14
|
+
export { verifyWebhookSignature } from './webhook/signature.js';
|
|
15
|
+
// Individual handler factories (for custom wiring)
|
|
16
|
+
// Worker handlers
|
|
17
|
+
export { createWorkerRegisterHandler } from './handlers/workers/register.js';
|
|
18
|
+
export { createWorkerListHandler } from './handlers/workers/list.js';
|
|
19
|
+
export { createWorkerGetHandler, createWorkerDeleteHandler } from './handlers/workers/get-delete.js';
|
|
20
|
+
export { createWorkerHeartbeatHandler } from './handlers/workers/heartbeat.js';
|
|
21
|
+
export { createWorkerPollHandler } from './handlers/workers/poll.js';
|
|
22
|
+
// Session handlers (no Linear dependency)
|
|
23
|
+
export { createSessionListHandler } from './handlers/sessions/list.js';
|
|
24
|
+
export { createSessionGetHandler } from './handlers/sessions/get.js';
|
|
25
|
+
export { createSessionClaimHandler } from './handlers/sessions/claim.js';
|
|
26
|
+
export { createSessionStatusPostHandler, createSessionStatusGetHandler } from './handlers/sessions/status.js';
|
|
27
|
+
export { createSessionLockRefreshHandler } from './handlers/sessions/lock-refresh.js';
|
|
28
|
+
export { createSessionPromptsGetHandler, createSessionPromptsPostHandler } from './handlers/sessions/prompts.js';
|
|
29
|
+
export { createSessionTransferOwnershipHandler } from './handlers/sessions/transfer-ownership.js';
|
|
30
|
+
// Session handlers (Linear forwarding)
|
|
31
|
+
export { createSessionActivityHandler } from './handlers/sessions/activity.js';
|
|
32
|
+
export { createSessionCompletionHandler } from './handlers/sessions/completion.js';
|
|
33
|
+
export { createSessionExternalUrlsHandler } from './handlers/sessions/external-urls.js';
|
|
34
|
+
export { createSessionProgressHandler } from './handlers/sessions/progress.js';
|
|
35
|
+
export { createSessionToolErrorHandler } from './handlers/sessions/tool-error.js';
|
|
36
|
+
// Public handlers
|
|
37
|
+
export { createPublicStatsHandler } from './handlers/public/stats.js';
|
|
38
|
+
export { createPublicSessionsListHandler } from './handlers/public/sessions-list.js';
|
|
39
|
+
export { createPublicSessionDetailHandler } from './handlers/public/session-detail.js';
|
|
40
|
+
// Cleanup handler
|
|
41
|
+
export { createCleanupHandler } from './handlers/cleanup.js';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cron Authentication Middleware
|
|
3
|
+
*
|
|
4
|
+
* Verifies cron job requests using CRON_SECRET or Vercel Cron headers.
|
|
5
|
+
* In development, allows requests without secret.
|
|
6
|
+
*/
|
|
7
|
+
import { NextRequest } from 'next/server';
|
|
8
|
+
/**
|
|
9
|
+
* Verify cron authentication
|
|
10
|
+
*
|
|
11
|
+
* Requires CRON_SECRET in production to prevent abuse.
|
|
12
|
+
* In development, allows requests without secret.
|
|
13
|
+
*
|
|
14
|
+
* @param request - Next.js request object
|
|
15
|
+
* @param cronSecret - Optional override for CRON_SECRET env var
|
|
16
|
+
*/
|
|
17
|
+
export declare function verifyCronAuth(request: NextRequest, cronSecret?: string): {
|
|
18
|
+
authorized: boolean;
|
|
19
|
+
reason?: string;
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=cron-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron-auth.d.ts","sourceRoot":"","sources":["../../../src/middleware/cron-auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAKzC;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,WAAW,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB;IAAE,UAAU,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAkC1C"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cron Authentication Middleware
|
|
3
|
+
*
|
|
4
|
+
* Verifies cron job requests using CRON_SECRET or Vercel Cron headers.
|
|
5
|
+
* In development, allows requests without secret.
|
|
6
|
+
*/
|
|
7
|
+
import { createLogger } from '@supaku/agentfactory-server';
|
|
8
|
+
const log = createLogger('cron-auth');
|
|
9
|
+
/**
|
|
10
|
+
* Verify cron authentication
|
|
11
|
+
*
|
|
12
|
+
* Requires CRON_SECRET in production to prevent abuse.
|
|
13
|
+
* In development, allows requests without secret.
|
|
14
|
+
*
|
|
15
|
+
* @param request - Next.js request object
|
|
16
|
+
* @param cronSecret - Optional override for CRON_SECRET env var
|
|
17
|
+
*/
|
|
18
|
+
export function verifyCronAuth(request, cronSecret) {
|
|
19
|
+
const secret = cronSecret ?? process.env.CRON_SECRET;
|
|
20
|
+
const isProduction = process.env.NODE_ENV === 'production' ||
|
|
21
|
+
process.env.VERCEL_ENV === 'production';
|
|
22
|
+
const isVercel = !!process.env.VERCEL;
|
|
23
|
+
// Check if running as Vercel Cron (trusted header only on Vercel)
|
|
24
|
+
const vercelCron = request.headers.get('x-vercel-cron');
|
|
25
|
+
if (isVercel && vercelCron) {
|
|
26
|
+
return { authorized: true };
|
|
27
|
+
}
|
|
28
|
+
// Check Authorization header
|
|
29
|
+
const authHeader = request.headers.get('authorization');
|
|
30
|
+
if (secret && authHeader === `Bearer ${secret}`) {
|
|
31
|
+
return { authorized: true };
|
|
32
|
+
}
|
|
33
|
+
// In production, CRON_SECRET is required
|
|
34
|
+
if (isProduction) {
|
|
35
|
+
if (!secret) {
|
|
36
|
+
return { authorized: false, reason: 'CRON_SECRET not configured' };
|
|
37
|
+
}
|
|
38
|
+
return { authorized: false, reason: 'Invalid or missing authorization' };
|
|
39
|
+
}
|
|
40
|
+
// In development, allow without secret but log warning
|
|
41
|
+
if (!secret) {
|
|
42
|
+
log.warn('CRON_SECRET not configured - allowing request in development');
|
|
43
|
+
return { authorized: true };
|
|
44
|
+
}
|
|
45
|
+
return { authorized: false, reason: 'Invalid authorization' };
|
|
46
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker Authentication — Next.js Adapter
|
|
3
|
+
*
|
|
4
|
+
* Thin wrapper around @supaku/agentfactory-server's framework-agnostic
|
|
5
|
+
* auth functions, adapted for Next.js request/response types.
|
|
6
|
+
*/
|
|
7
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
8
|
+
import { isWorkerAuthConfigured } from '@supaku/agentfactory-server';
|
|
9
|
+
export { isWorkerAuthConfigured };
|
|
10
|
+
/**
|
|
11
|
+
* Verify worker API key from request
|
|
12
|
+
*/
|
|
13
|
+
export declare function verifyWorkerAuth(request: NextRequest): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Create an unauthorized response
|
|
16
|
+
*/
|
|
17
|
+
export declare function unauthorizedResponse(): NextResponse;
|
|
18
|
+
/**
|
|
19
|
+
* Middleware helper for protected routes
|
|
20
|
+
*
|
|
21
|
+
* @param request - Next.js request object
|
|
22
|
+
* @returns NextResponse if unauthorized, null if authorized
|
|
23
|
+
*/
|
|
24
|
+
export declare function requireWorkerAuth(request: NextRequest): NextResponse | null;
|
|
25
|
+
//# sourceMappingURL=worker-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-auth.d.ts","sourceRoot":"","sources":["../../../src/middleware/worker-auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,EAGL,sBAAsB,EAEvB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EAAE,sBAAsB,EAAE,CAAA;AAIjC;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAO9D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,YAAY,CAKnD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,YAAY,GAAG,IAAI,CAS3E"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker Authentication — Next.js Adapter
|
|
3
|
+
*
|
|
4
|
+
* Thin wrapper around @supaku/agentfactory-server's framework-agnostic
|
|
5
|
+
* auth functions, adapted for Next.js request/response types.
|
|
6
|
+
*/
|
|
7
|
+
import { NextResponse } from 'next/server';
|
|
8
|
+
import { extractBearerToken, verifyApiKey, isWorkerAuthConfigured, createLogger, } from '@supaku/agentfactory-server';
|
|
9
|
+
export { isWorkerAuthConfigured };
|
|
10
|
+
const log = createLogger('worker-auth');
|
|
11
|
+
/**
|
|
12
|
+
* Verify worker API key from request
|
|
13
|
+
*/
|
|
14
|
+
export function verifyWorkerAuth(request) {
|
|
15
|
+
const token = extractBearerToken(request.headers.get('authorization'));
|
|
16
|
+
if (!token) {
|
|
17
|
+
log.debug('Missing or invalid Authorization header');
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
return verifyApiKey(token);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create an unauthorized response
|
|
24
|
+
*/
|
|
25
|
+
export function unauthorizedResponse() {
|
|
26
|
+
return NextResponse.json({ error: 'Unauthorized', message: 'Invalid or missing API key' }, { status: 401 });
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Middleware helper for protected routes
|
|
30
|
+
*
|
|
31
|
+
* @param request - Next.js request object
|
|
32
|
+
* @returns NextResponse if unauthorized, null if authorized
|
|
33
|
+
*/
|
|
34
|
+
export function requireWorkerAuth(request) {
|
|
35
|
+
if (!verifyWorkerAuth(request)) {
|
|
36
|
+
log.warn('Unauthorized worker API request', {
|
|
37
|
+
path: request.nextUrl.pathname,
|
|
38
|
+
ip: request.headers.get('x-forwarded-for') || 'unknown',
|
|
39
|
+
});
|
|
40
|
+
return unauthorizedResponse();
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core types for @supaku/agentfactory-nextjs
|
|
3
|
+
*
|
|
4
|
+
* These types define the configuration interfaces that consumers
|
|
5
|
+
* must implement to use the extracted route handlers.
|
|
6
|
+
*/
|
|
7
|
+
import type { NextResponse } from 'next/server';
|
|
8
|
+
import type { LinearAgentClient, AgentWorkType, SubIssueStatus } from '@supaku/agentfactory-linear';
|
|
9
|
+
/**
|
|
10
|
+
* Resolves a Linear client for a given organization.
|
|
11
|
+
* Consumers implement this to handle workspace-specific OAuth tokens.
|
|
12
|
+
*/
|
|
13
|
+
export interface LinearClientResolver {
|
|
14
|
+
getClient(organizationId?: string): Promise<LinearAgentClient> | LinearAgentClient;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Base configuration for routes that need Linear API access.
|
|
18
|
+
*/
|
|
19
|
+
export interface RouteConfig {
|
|
20
|
+
linearClient: LinearClientResolver;
|
|
21
|
+
appUrl?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Auto-trigger configuration for webhook processing.
|
|
25
|
+
*/
|
|
26
|
+
export interface AutoTriggerConfig {
|
|
27
|
+
enableAutoQA: boolean;
|
|
28
|
+
enableAutoAcceptance: boolean;
|
|
29
|
+
autoQARequireAgentWorked: boolean;
|
|
30
|
+
autoAcceptanceRequireAgentWorked: boolean;
|
|
31
|
+
autoQAProjects: string[];
|
|
32
|
+
autoAcceptanceProjects: string[];
|
|
33
|
+
autoQAExcludeLabels: string[];
|
|
34
|
+
autoAcceptanceExcludeLabels: string[];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Configuration for the webhook processor.
|
|
38
|
+
*/
|
|
39
|
+
export interface WebhookConfig extends RouteConfig {
|
|
40
|
+
webhookSecret?: string;
|
|
41
|
+
generatePrompt: (identifier: string, workType: AgentWorkType, mentionContext?: string) => string;
|
|
42
|
+
detectWorkTypeFromPrompt?: (prompt: string, validWorkTypes: AgentWorkType[]) => AgentWorkType | undefined;
|
|
43
|
+
getPriority?: (workType: AgentWorkType) => number;
|
|
44
|
+
autoTrigger?: AutoTriggerConfig;
|
|
45
|
+
buildParentQAContext?: (identifier: string, subIssues: SubIssueStatus[]) => string;
|
|
46
|
+
buildParentAcceptanceContext?: (identifier: string, subIssues: SubIssueStatus[]) => string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Configuration for cron-authenticated routes.
|
|
50
|
+
*/
|
|
51
|
+
export interface CronConfig {
|
|
52
|
+
cronSecret?: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Standard Next.js route handler signature.
|
|
56
|
+
*
|
|
57
|
+
* Uses `any` for the context parameter because Next.js App Router
|
|
58
|
+
* provides different shapes depending on the route segment (static
|
|
59
|
+
* routes get no context, dynamic `[id]` routes get `{ params }`).
|
|
60
|
+
*/
|
|
61
|
+
export type RouteHandler = (...args: any[]) => Promise<NextResponse>;
|
|
62
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,aAAa,CAAA;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAEnG;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAA;CACnF;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,oBAAoB,CAAA;IAClC,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,OAAO,CAAA;IACrB,oBAAoB,EAAE,OAAO,CAAA;IAC7B,wBAAwB,EAAE,OAAO,CAAA;IACjC,gCAAgC,EAAE,OAAO,CAAA;IACzC,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,sBAAsB,EAAE,MAAM,EAAE,CAAA;IAChC,mBAAmB,EAAE,MAAM,EAAE,CAAA;IAC7B,2BAA2B,EAAE,MAAM,EAAE,CAAA;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,WAAW;IAChD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IAChG,wBAAwB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,KAAK,aAAa,GAAG,SAAS,CAAA;IACzG,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,MAAM,CAAA;IACjD,WAAW,CAAC,EAAE,iBAAiB,CAAA;IAC/B,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,MAAM,CAAA;IAClF,4BAA4B,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,MAAM,CAAA;CAC3F;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;;;;GAMG;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,YAAY,CAAC,CAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handle Issue update events — status transition triggers.
|
|
3
|
+
*
|
|
4
|
+
* Handles:
|
|
5
|
+
* - Finished → auto-QA trigger
|
|
6
|
+
* - Icebox → Backlog → auto-development trigger
|
|
7
|
+
* - Finished → Delivered → auto-acceptance trigger
|
|
8
|
+
*/
|
|
9
|
+
import { NextResponse } from 'next/server';
|
|
10
|
+
import type { LinearWebhookPayload } from '@supaku/agentfactory-linear';
|
|
11
|
+
import type { WebhookConfig } from '../../types.js';
|
|
12
|
+
import type { createLogger } from '@supaku/agentfactory-server';
|
|
13
|
+
export declare function handleIssueUpdated(config: WebhookConfig, payload: LinearWebhookPayload, log: ReturnType<typeof createLogger>): Promise<NextResponse | null>;
|
|
14
|
+
//# sourceMappingURL=issue-updated.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue-updated.d.ts","sourceRoot":"","sources":["../../../../src/webhook/handlers/issue-updated.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,EAAE,oBAAoB,EAAiB,MAAM,6BAA6B,CAAA;AAsBtF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAQnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAE/D,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,oBAAoB,EAC7B,GAAG,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,GACnC,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAmhB9B"}
|