@supaku/agentfactory-nextjs 0.7.5 → 0.7.6
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/src/__tests__/webhook-project-filter.test.d.ts +2 -0
- package/dist/src/__tests__/webhook-project-filter.test.d.ts.map +1 -0
- package/dist/src/__tests__/webhook-project-filter.test.js +48 -0
- package/dist/src/factory.d.ts +3 -0
- package/dist/src/factory.d.ts.map +1 -1
- package/dist/src/factory.js +4 -0
- package/dist/src/handlers/config.d.ts +11 -0
- package/dist/src/handlers/config.d.ts.map +1 -0
- package/dist/src/handlers/config.js +20 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -0
- package/dist/src/types.d.ts +4 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/webhook/handlers/issue-updated.d.ts.map +1 -1
- package/dist/src/webhook/handlers/issue-updated.js +6 -3
- package/dist/src/webhook/handlers/session-created.d.ts.map +1 -1
- package/dist/src/webhook/handlers/session-created.js +6 -1
- package/package.json +4 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-project-filter.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/webhook-project-filter.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { isProjectAllowed } from '../webhook/utils.js';
|
|
3
|
+
/**
|
|
4
|
+
* Tests for server-level project filtering in webhook handlers.
|
|
5
|
+
*
|
|
6
|
+
* The `projects` config field on `WebhookConfig` gates webhook processing
|
|
7
|
+
* so that a server deployed for specific Linear projects only handles
|
|
8
|
+
* webhooks for those projects.
|
|
9
|
+
*/
|
|
10
|
+
describe('webhook server-level project filtering', () => {
|
|
11
|
+
it('no projects config (undefined) → all webhooks pass', () => {
|
|
12
|
+
const allowedProjects = []; // empty = no filter
|
|
13
|
+
expect(isProjectAllowed('Social', allowedProjects)).toBe(true);
|
|
14
|
+
expect(isProjectAllowed('Agent', allowedProjects)).toBe(true);
|
|
15
|
+
expect(isProjectAllowed(undefined, allowedProjects)).toBe(true);
|
|
16
|
+
});
|
|
17
|
+
it('empty projects array → all webhooks pass', () => {
|
|
18
|
+
expect(isProjectAllowed('Social', [])).toBe(true);
|
|
19
|
+
expect(isProjectAllowed('Agent', [])).toBe(true);
|
|
20
|
+
expect(isProjectAllowed(undefined, [])).toBe(true);
|
|
21
|
+
});
|
|
22
|
+
it('projects: ["Social"] → only Social issues pass', () => {
|
|
23
|
+
const allowedProjects = ['Social'];
|
|
24
|
+
expect(isProjectAllowed('Social', allowedProjects)).toBe(true);
|
|
25
|
+
expect(isProjectAllowed('Agent', allowedProjects)).toBe(false);
|
|
26
|
+
expect(isProjectAllowed('Art', allowedProjects)).toBe(false);
|
|
27
|
+
});
|
|
28
|
+
it('issue with no project + server has projects → rejected', () => {
|
|
29
|
+
const allowedProjects = ['Social'];
|
|
30
|
+
expect(isProjectAllowed(undefined, allowedProjects)).toBe(false);
|
|
31
|
+
});
|
|
32
|
+
it('non-matching project → rejected', () => {
|
|
33
|
+
const allowedProjects = ['Social', 'Agent'];
|
|
34
|
+
expect(isProjectAllowed('Art', allowedProjects)).toBe(false);
|
|
35
|
+
});
|
|
36
|
+
it('multiple allowed projects → matching ones pass', () => {
|
|
37
|
+
const allowedProjects = ['Social', 'Agent'];
|
|
38
|
+
expect(isProjectAllowed('Social', allowedProjects)).toBe(true);
|
|
39
|
+
expect(isProjectAllowed('Agent', allowedProjects)).toBe(true);
|
|
40
|
+
expect(isProjectAllowed('Art', allowedProjects)).toBe(false);
|
|
41
|
+
});
|
|
42
|
+
it('project name matching is exact (case-sensitive)', () => {
|
|
43
|
+
const allowedProjects = ['Social'];
|
|
44
|
+
expect(isProjectAllowed('social', allowedProjects)).toBe(false);
|
|
45
|
+
expect(isProjectAllowed('SOCIAL', allowedProjects)).toBe(false);
|
|
46
|
+
expect(isProjectAllowed('Social', allowedProjects)).toBe(true);
|
|
47
|
+
});
|
|
48
|
+
});
|
package/dist/src/factory.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAe,aAAa,EAAyB,UAAU,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAe,aAAa,EAAyB,UAAU,EAAE,MAAM,YAAY,CAAA;AA+C7G,OAAO,EAA8B,KAAK,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAE3F,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE;QACP,QAAQ,EAAE;YAAE,IAAI,EAAE,YAAY,CAAA;SAAE,CAAA;QAChC,IAAI,EAAE;YAAE,GAAG,EAAE,YAAY,CAAA;SAAE,CAAA;QAC3B,MAAM,EAAE;YAAE,GAAG,EAAE,YAAY,CAAC;YAAC,MAAM,EAAE,YAAY,CAAA;SAAE,CAAA;QACnD,SAAS,EAAE;YAAE,IAAI,EAAE,YAAY,CAAA;SAAE,CAAA;QACjC,IAAI,EAAE;YAAE,GAAG,EAAE,YAAY,CAAA;SAAE,CAAA;KAC5B,CAAA;IACD,QAAQ,EAAE;QACR,IAAI,EAAE;YAAE,GAAG,EAAE,YAAY,CAAA;SAAE,CAAA;QAC3B,MAAM,EAAE;YAAE,GAAG,EAAE,YAAY,CAAA;SAAE,CAAA;QAC7B,KAAK,EAAE;YAAE,IAAI,EAAE,YAAY,CAAA;SAAE,CAAA;QAC7B,MAAM,EAAE;YAAE,GAAG,EAAE,YAAY,CAAC;YAAC,IAAI,EAAE,YAAY,CAAA;SAAE,CAAA;QACjD,WAAW,EAAE;YAAE,IAAI,EAAE,YAAY,CAAA;SAAE,CAAA;QACnC,OAAO,EAAE;YAAE,GAAG,EAAE,YAAY,CAAC;YAAC,IAAI,EAAE,YAAY,CAAA;SAAE,CAAA;QAClD,iBAAiB,EAAE;YAAE,IAAI,EAAE,YAAY,CAAA;SAAE,CAAA;QACzC,QAAQ,EAAE;YAAE,IAAI,EAAE,YAAY,CAAA;SAAE,CAAA;QAChC,UAAU,EAAE;YAAE,IAAI,EAAE,YAAY,CAAA;SAAE,CAAA;QAClC,YAAY,EAAE;YAAE,IAAI,EAAE,YAAY,CAAA;SAAE,CAAA;QACpC,QAAQ,EAAE;YAAE,IAAI,EAAE,YAAY,CAAA;SAAE,CAAA;QAChC,SAAS,EAAE;YAAE,IAAI,EAAE,YAAY,CAAA;SAAE,CAAA;KAClC,CAAA;IACD,MAAM,EAAE;QACN,KAAK,EAAE;YAAE,GAAG,EAAE,YAAY,CAAA;SAAE,CAAA;QAC5B,QAAQ,EAAE;YAAE,GAAG,EAAE,YAAY,CAAA;SAAE,CAAA;QAC/B,aAAa,EAAE;YAAE,GAAG,EAAE,YAAY,CAAA;SAAE,CAAA;KACrC,CAAA;IACD,MAAM,EAAE;QAAE,GAAG,EAAE,YAAY,CAAA;KAAE,CAAA;IAC7B,OAAO,EAAE;QAAE,IAAI,EAAE,YAAY,CAAC;QAAC,GAAG,EAAE,YAAY,CAAA;KAAE,CAAA;IAClD,OAAO,EAAE;QAAE,IAAI,EAAE,YAAY,CAAC;QAAC,GAAG,EAAE,YAAY,CAAA;KAAE,CAAA;IAClD,KAAK,EAAE;QACL,QAAQ,EAAE;YAAE,GAAG,EAAE,YAAY,CAAA;SAAE,CAAA;KAChC,CAAA;CACF;AAED;;;GAGG;AACH,MAAM,WAAW,eAAgB,SAAQ,aAAa,EAAE,UAAU;IAChE,mDAAmD;IACnD,KAAK,CAAC,EAAE,WAAW,CAAA;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAuDlE"}
|
package/dist/src/factory.js
CHANGED
|
@@ -35,6 +35,8 @@ import { createPublicSessionsListHandler } from './handlers/public/sessions-list
|
|
|
35
35
|
import { createPublicSessionDetailHandler } from './handlers/public/session-detail.js';
|
|
36
36
|
// Cleanup handler
|
|
37
37
|
import { createCleanupHandler } from './handlers/cleanup.js';
|
|
38
|
+
// Config handler
|
|
39
|
+
import { createConfigHandler } from './handlers/config.js';
|
|
38
40
|
// Webhook processor
|
|
39
41
|
import { createWebhookHandler } from './webhook/processor.js';
|
|
40
42
|
// OAuth handler
|
|
@@ -83,6 +85,7 @@ export function createAllRoutes(config) {
|
|
|
83
85
|
const cleanup = createCleanupHandler(webhookConfig);
|
|
84
86
|
const webhook = createWebhookHandler(webhookConfig);
|
|
85
87
|
const oauth = createOAuthCallbackHandler(config.oauth);
|
|
88
|
+
const configHandler = createConfigHandler(config.projects);
|
|
86
89
|
return {
|
|
87
90
|
workers: {
|
|
88
91
|
register: { POST: createWorkerRegisterHandler() },
|
|
@@ -110,6 +113,7 @@ export function createAllRoutes(config) {
|
|
|
110
113
|
sessions: { GET: createPublicSessionsListHandler() },
|
|
111
114
|
sessionDetail: { GET: createPublicSessionDetailHandler() },
|
|
112
115
|
},
|
|
116
|
+
config: { GET: configHandler.GET },
|
|
113
117
|
cleanup: { POST: cleanup.POST, GET: cleanup.GET },
|
|
114
118
|
webhook: { POST: webhook.POST, GET: webhook.GET },
|
|
115
119
|
oauth: {
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config endpoint — exposes server configuration to workers.
|
|
3
|
+
*
|
|
4
|
+
* Workers query this during registration to auto-inherit project scope
|
|
5
|
+
* when not explicitly configured via --projects flag.
|
|
6
|
+
*/
|
|
7
|
+
import type { RouteHandler } from '../types.js';
|
|
8
|
+
export declare function createConfigHandler(projects?: string[]): {
|
|
9
|
+
GET: RouteHandler;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/handlers/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C,wBAAgB,mBAAmB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG;IAAE,GAAG,EAAE,YAAY,CAAA;CAAE,CAW9E"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config endpoint — exposes server configuration to workers.
|
|
3
|
+
*
|
|
4
|
+
* Workers query this during registration to auto-inherit project scope
|
|
5
|
+
* when not explicitly configured via --projects flag.
|
|
6
|
+
*/
|
|
7
|
+
import { NextResponse } from 'next/server';
|
|
8
|
+
import { requireWorkerAuth } from '../middleware/worker-auth.js';
|
|
9
|
+
export function createConfigHandler(projects) {
|
|
10
|
+
return {
|
|
11
|
+
GET: async (request) => {
|
|
12
|
+
const authError = requireWorkerAuth(request);
|
|
13
|
+
if (authError)
|
|
14
|
+
return authError;
|
|
15
|
+
return NextResponse.json({
|
|
16
|
+
projects: projects ?? [],
|
|
17
|
+
});
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -45,4 +45,5 @@ export type { PublicSessionResponse } from './handlers/public/sessions-list.js';
|
|
|
45
45
|
export { createPublicSessionDetailHandler } from './handlers/public/session-detail.js';
|
|
46
46
|
export type { PublicSessionDetailResponse } from './handlers/public/session-detail.js';
|
|
47
47
|
export { createCleanupHandler } from './handlers/cleanup.js';
|
|
48
|
+
export { createConfigHandler } from './handlers/config.js';
|
|
48
49
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;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,eAAe,EAAE,MAAM,cAAc,CAAA;AAG9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAA;AACzE,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAG/D,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAA;AACtE,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAG7D,OAAO,EACL,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,yBAAyB,CAAA;AAChC,YAAY,EACV,yBAAyB,EACzB,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,yBAAyB,CAAA;AAGhC,OAAO,EAAE,iCAAiC,EAAE,MAAM,6BAA6B,CAAA;AAC/E,YAAY,EAAE,iCAAiC,EAAE,MAAM,6BAA6B,CAAA;AAGpF,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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;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,eAAe,EAAE,MAAM,cAAc,CAAA;AAG9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAA;AACzE,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAG/D,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAA;AACtE,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAG7D,OAAO,EACL,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,yBAAyB,CAAA;AAChC,YAAY,EACV,yBAAyB,EACzB,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,yBAAyB,CAAA;AAGhC,OAAO,EAAE,iCAAiC,EAAE,MAAM,6BAA6B,CAAA;AAC/E,YAAY,EAAE,iCAAiC,EAAE,MAAM,6BAA6B,CAAA;AAGpF,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;AAG5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA"}
|
package/dist/src/index.js
CHANGED
|
@@ -48,3 +48,5 @@ export { createPublicSessionsListHandler } from './handlers/public/sessions-list
|
|
|
48
48
|
export { createPublicSessionDetailHandler } from './handlers/public/session-detail.js';
|
|
49
49
|
// Cleanup handler
|
|
50
50
|
export { createCleanupHandler } from './handlers/cleanup.js';
|
|
51
|
+
// Config handler
|
|
52
|
+
export { createConfigHandler } from './handlers/config.js';
|
package/dist/src/types.d.ts
CHANGED
|
@@ -47,6 +47,8 @@ export interface WebhookConfig extends RouteConfig {
|
|
|
47
47
|
autoTrigger?: AutoTriggerConfig;
|
|
48
48
|
buildParentQAContext?: (identifier: string, subIssues: SubIssueStatus[]) => string;
|
|
49
49
|
buildParentAcceptanceContext?: (identifier: string, subIssues: SubIssueStatus[]) => string;
|
|
50
|
+
/** Linear project names this server handles. Empty/undefined = all projects. */
|
|
51
|
+
projects?: string[];
|
|
50
52
|
}
|
|
51
53
|
/**
|
|
52
54
|
* Resolved webhook config with all defaults applied.
|
|
@@ -60,6 +62,8 @@ export interface ResolvedWebhookConfig extends RouteConfig {
|
|
|
60
62
|
autoTrigger?: AutoTriggerConfig;
|
|
61
63
|
buildParentQAContext?: (identifier: string, subIssues: SubIssueStatus[]) => string;
|
|
62
64
|
buildParentAcceptanceContext?: (identifier: string, subIssues: SubIssueStatus[]) => string;
|
|
65
|
+
/** Linear project names this server handles. Empty/undefined = all projects. */
|
|
66
|
+
projects?: string[];
|
|
63
67
|
}
|
|
64
68
|
/**
|
|
65
69
|
* Configuration for cron-authenticated routes.
|
package/dist/src/types.d.ts.map
CHANGED
|
@@ -1 +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;;;;;GAKG;AACH,MAAM,WAAW,aAAc,SAAQ,WAAW;IAChD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IACjG,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;
|
|
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;;;;;GAKG;AACH,MAAM,WAAW,aAAc,SAAQ,WAAW;IAChD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IACjG,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;IAC1F,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAsB,SAAQ,WAAW;IACxD,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;IAC1F,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;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"}
|
|
@@ -1 +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,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAQ3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAE/D,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,qBAAqB,EAC7B,OAAO,EAAE,oBAAoB,EAC7B,GAAG,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,GACnC,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,
|
|
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,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAQ3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAE/D,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,qBAAqB,EAC7B,OAAO,EAAE,oBAAoB,EAC7B,GAAG,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,GACnC,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA+hB9B"}
|
|
@@ -17,6 +17,12 @@ export async function handleIssueUpdated(config, payload, log) {
|
|
|
17
17
|
const currentStateName = data.state?.name;
|
|
18
18
|
const webhookId = payload.webhookId;
|
|
19
19
|
const issueLog = log.child({ issueId, issueIdentifier });
|
|
20
|
+
// Server-level project filter (applies to all paths)
|
|
21
|
+
const projectName = data.project?.name;
|
|
22
|
+
if (!isProjectAllowed(projectName, config.projects ?? [])) {
|
|
23
|
+
issueLog.debug('Project not handled by this server, skipping', { projectName });
|
|
24
|
+
return NextResponse.json({ success: true, skipped: true, reason: 'project_not_allowed' });
|
|
25
|
+
}
|
|
20
26
|
const autoTrigger = config.autoTrigger;
|
|
21
27
|
// === Handle Finished transition (auto-QA) ===
|
|
22
28
|
if (currentStateName === 'Finished' && updatedFrom?.stateId) {
|
|
@@ -44,7 +50,6 @@ export async function handleIssueUpdated(config, payload, log) {
|
|
|
44
50
|
issueLog.debug('Auto-QA disabled, skipping QA trigger');
|
|
45
51
|
return NextResponse.json({ success: true, skipped: true, reason: 'auto_qa_disabled' });
|
|
46
52
|
}
|
|
47
|
-
const projectName = data.project?.name;
|
|
48
53
|
if (!isProjectAllowed(projectName, autoTrigger.autoQAProjects)) {
|
|
49
54
|
issueLog.debug('Project not in auto-QA list, skipping', { projectName });
|
|
50
55
|
return NextResponse.json({ success: true, skipped: true, reason: 'project_not_allowed' });
|
|
@@ -253,7 +258,6 @@ export async function handleIssueUpdated(config, payload, log) {
|
|
|
253
258
|
issueLog.warn('Failed to check if issue is parent', { error: err });
|
|
254
259
|
}
|
|
255
260
|
const prompt = config.generatePrompt(issueIdentifier, workType);
|
|
256
|
-
const projectName = data.project?.name;
|
|
257
261
|
await storeSessionState(devSessionId, {
|
|
258
262
|
issueId,
|
|
259
263
|
issueIdentifier,
|
|
@@ -332,7 +336,6 @@ export async function handleIssueUpdated(config, payload, log) {
|
|
|
332
336
|
issueLog.debug('Auto-acceptance disabled, skipping acceptance trigger');
|
|
333
337
|
return NextResponse.json({ success: true, skipped: true, reason: 'auto_acceptance_disabled' });
|
|
334
338
|
}
|
|
335
|
-
const projectName = data.project?.name;
|
|
336
339
|
if (!isProjectAllowed(projectName, autoTrigger.autoAcceptanceProjects)) {
|
|
337
340
|
issueLog.debug('Project not in auto-acceptance list, skipping', { projectName });
|
|
338
341
|
return NextResponse.json({ success: true, skipped: true, reason: 'project_not_allowed' });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-created.d.ts","sourceRoot":"","sources":["../../../../src/webhook/handlers/session-created.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,EAAE,oBAAoB,EAAiB,MAAM,6BAA6B,CAAA;AAiBtF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"session-created.d.ts","sourceRoot":"","sources":["../../../../src/webhook/handlers/session-created.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,EAAE,oBAAoB,EAAiB,MAAM,6BAA6B,CAAA;AAiBtF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAS3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAE/D,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,qBAAqB,EAC7B,OAAO,EAAE,oBAAoB,EAC7B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,GAAG,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,GACnC,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAkT9B"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import { NextResponse } from 'next/server';
|
|
5
5
|
import { TERMINAL_STATUSES, validateWorkTypeForStatus, WORK_TYPE_ALLOWED_STATUSES, STATUS_WORK_TYPE_MAP, getValidWorkTypesForStatus, } from '@supaku/agentfactory-linear';
|
|
6
6
|
import { generateIdempotencyKey, isWebhookProcessed, storeSessionState, getSessionState, updateSessionStatus, dispatchWork, } from '@supaku/agentfactory-server';
|
|
7
|
-
import { emitActivity, determineWorkType, getAppUrl, getPriority, WORK_TYPE_MESSAGES, } from '../utils.js';
|
|
7
|
+
import { emitActivity, determineWorkType, isProjectAllowed, getAppUrl, getPriority, WORK_TYPE_MESSAGES, } from '../utils.js';
|
|
8
8
|
export async function handleSessionCreated(config, payload, rawPayload, log) {
|
|
9
9
|
const agentSession = rawPayload.agentSession;
|
|
10
10
|
log.debug('AgentSessionEvent payload structure', {
|
|
@@ -75,6 +75,11 @@ export async function handleSessionCreated(config, payload, rawPayload, log) {
|
|
|
75
75
|
catch (err) {
|
|
76
76
|
sessionLog.warn('Failed to fetch issue status', { error: err });
|
|
77
77
|
}
|
|
78
|
+
// Server-level project filter
|
|
79
|
+
if (!isProjectAllowed(projectName, config.projects ?? [])) {
|
|
80
|
+
sessionLog.debug('Project not handled by this server, skipping', { projectName });
|
|
81
|
+
return NextResponse.json({ success: true, skipped: true, reason: 'project_not_allowed' });
|
|
82
|
+
}
|
|
78
83
|
// Phase 1: Mention-based routing
|
|
79
84
|
if (isMention && promptContext && config.detectWorkTypeFromPrompt) {
|
|
80
85
|
// For mentions: unconstrained detection (pass all work types)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@supaku/agentfactory-nextjs",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.6",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Next.js API route handlers for AgentFactory — webhook processor, worker/session management, public stats",
|
|
6
6
|
"author": "Supaku (https://supaku.com)",
|
|
@@ -48,9 +48,9 @@
|
|
|
48
48
|
"LICENSE"
|
|
49
49
|
],
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"@supaku/agentfactory": "0.7.
|
|
52
|
-
"@supaku/agentfactory-
|
|
53
|
-
"@supaku/agentfactory
|
|
51
|
+
"@supaku/agentfactory-linear": "0.7.6",
|
|
52
|
+
"@supaku/agentfactory-server": "0.7.6",
|
|
53
|
+
"@supaku/agentfactory": "0.7.6"
|
|
54
54
|
},
|
|
55
55
|
"peerDependencies": {
|
|
56
56
|
"next": ">=14.0.0"
|