@sourcepress/server 0.1.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/.omc/state/agent-replay-31d84b63-606a-4368-b9e6-93fe4f5ae0f7.jsonl +2 -0
- package/.omc/state/last-tool-error.json +7 -0
- package/.omc/state/mission-state.json +53 -0
- package/.omc/state/subagent-tracking.json +17 -0
- package/.turbo/turbo-build.log +4 -0
- package/.turbo/turbo-test.log +26 -0
- package/dist/__tests__/app-integration.test.d.ts +2 -0
- package/dist/__tests__/app-integration.test.d.ts.map +1 -0
- package/dist/__tests__/app-integration.test.js +71 -0
- package/dist/__tests__/app-integration.test.js.map +1 -0
- package/dist/__tests__/approval.test.d.ts +2 -0
- package/dist/__tests__/approval.test.d.ts.map +1 -0
- package/dist/__tests__/approval.test.js +170 -0
- package/dist/__tests__/approval.test.js.map +1 -0
- package/dist/__tests__/content.test.d.ts +2 -0
- package/dist/__tests__/content.test.d.ts.map +1 -0
- package/dist/__tests__/content.test.js +187 -0
- package/dist/__tests__/content.test.js.map +1 -0
- package/dist/__tests__/engine.test.d.ts +2 -0
- package/dist/__tests__/engine.test.d.ts.map +1 -0
- package/dist/__tests__/engine.test.js +77 -0
- package/dist/__tests__/engine.test.js.map +1 -0
- package/dist/__tests__/eval.test.d.ts +2 -0
- package/dist/__tests__/eval.test.d.ts.map +1 -0
- package/dist/__tests__/eval.test.js +320 -0
- package/dist/__tests__/eval.test.js.map +1 -0
- package/dist/__tests__/graph.test.d.ts +2 -0
- package/dist/__tests__/graph.test.d.ts.map +1 -0
- package/dist/__tests__/graph.test.js +169 -0
- package/dist/__tests__/graph.test.js.map +1 -0
- package/dist/__tests__/health.test.d.ts +2 -0
- package/dist/__tests__/health.test.d.ts.map +1 -0
- package/dist/__tests__/health.test.js +56 -0
- package/dist/__tests__/health.test.js.map +1 -0
- package/dist/__tests__/import.test.d.ts +2 -0
- package/dist/__tests__/import.test.d.ts.map +1 -0
- package/dist/__tests__/import.test.js +138 -0
- package/dist/__tests__/import.test.js.map +1 -0
- package/dist/__tests__/intent.test.d.ts +2 -0
- package/dist/__tests__/intent.test.d.ts.map +1 -0
- package/dist/__tests__/intent.test.js +122 -0
- package/dist/__tests__/intent.test.js.map +1 -0
- package/dist/__tests__/jobs.test.d.ts +2 -0
- package/dist/__tests__/jobs.test.d.ts.map +1 -0
- package/dist/__tests__/jobs.test.js +96 -0
- package/dist/__tests__/jobs.test.js.map +1 -0
- package/dist/__tests__/knowledge.test.d.ts +2 -0
- package/dist/__tests__/knowledge.test.d.ts.map +1 -0
- package/dist/__tests__/knowledge.test.js +110 -0
- package/dist/__tests__/knowledge.test.js.map +1 -0
- package/dist/__tests__/media-routes.test.d.ts +2 -0
- package/dist/__tests__/media-routes.test.d.ts.map +1 -0
- package/dist/__tests__/media-routes.test.js +88 -0
- package/dist/__tests__/media-routes.test.js.map +1 -0
- package/dist/__tests__/schema.test.d.ts +2 -0
- package/dist/__tests__/schema.test.d.ts.map +1 -0
- package/dist/__tests__/schema.test.js +92 -0
- package/dist/__tests__/schema.test.js.map +1 -0
- package/dist/app.d.ts +7 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +85 -0
- package/dist/app.js.map +1 -0
- package/dist/engine.d.ts +38 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +106 -0
- package/dist/engine.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/auth.d.ts +17 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +54 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/cors.d.ts +2 -0
- package/dist/middleware/cors.d.ts.map +1 -0
- package/dist/middleware/cors.js +13 -0
- package/dist/middleware/cors.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +24 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +30 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/index.d.ts +7 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +5 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/rate-limit.d.ts +11 -0
- package/dist/middleware/rate-limit.d.ts.map +1 -0
- package/dist/middleware/rate-limit.js +26 -0
- package/dist/middleware/rate-limit.js.map +1 -0
- package/dist/middleware/route-error-handler.d.ts +12 -0
- package/dist/middleware/route-error-handler.d.ts.map +1 -0
- package/dist/middleware/route-error-handler.js +9 -0
- package/dist/middleware/route-error-handler.js.map +1 -0
- package/dist/routes/approval.d.ts +4 -0
- package/dist/routes/approval.d.ts.map +1 -0
- package/dist/routes/approval.js +70 -0
- package/dist/routes/approval.js.map +1 -0
- package/dist/routes/content.d.ts +4 -0
- package/dist/routes/content.d.ts.map +1 -0
- package/dist/routes/content.js +145 -0
- package/dist/routes/content.js.map +1 -0
- package/dist/routes/eval.d.ts +4 -0
- package/dist/routes/eval.d.ts.map +1 -0
- package/dist/routes/eval.js +178 -0
- package/dist/routes/eval.js.map +1 -0
- package/dist/routes/graph.d.ts +4 -0
- package/dist/routes/graph.d.ts.map +1 -0
- package/dist/routes/graph.js +90 -0
- package/dist/routes/graph.js.map +1 -0
- package/dist/routes/health.d.ts +13 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +19 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/import.d.ts +4 -0
- package/dist/routes/import.d.ts.map +1 -0
- package/dist/routes/import.js +85 -0
- package/dist/routes/import.js.map +1 -0
- package/dist/routes/index.d.ts +12 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +12 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/intent.d.ts +4 -0
- package/dist/routes/intent.d.ts.map +1 -0
- package/dist/routes/intent.js +80 -0
- package/dist/routes/intent.js.map +1 -0
- package/dist/routes/jobs.d.ts +4 -0
- package/dist/routes/jobs.d.ts.map +1 -0
- package/dist/routes/jobs.js +67 -0
- package/dist/routes/jobs.js.map +1 -0
- package/dist/routes/knowledge.d.ts +4 -0
- package/dist/routes/knowledge.d.ts.map +1 -0
- package/dist/routes/knowledge.js +48 -0
- package/dist/routes/knowledge.js.map +1 -0
- package/dist/routes/media.d.ts +4 -0
- package/dist/routes/media.d.ts.map +1 -0
- package/dist/routes/media.js +87 -0
- package/dist/routes/media.js.map +1 -0
- package/dist/routes/schema.d.ts +4 -0
- package/dist/routes/schema.d.ts.map +1 -0
- package/dist/routes/schema.js +54 -0
- package/dist/routes/schema.js.map +1 -0
- package/dist/standalone.d.ts +2 -0
- package/dist/standalone.d.ts.map +1 -0
- package/dist/standalone.js +115 -0
- package/dist/standalone.js.map +1 -0
- package/package.json +36 -0
- package/src/__tests__/app-integration.test.ts +80 -0
- package/src/__tests__/approval.test.ts +195 -0
- package/src/__tests__/content.test.ts +202 -0
- package/src/__tests__/engine.test.ts +86 -0
- package/src/__tests__/eval.test.ts +343 -0
- package/src/__tests__/graph.test.ts +182 -0
- package/src/__tests__/health.test.ts +68 -0
- package/src/__tests__/import.test.ts +148 -0
- package/src/__tests__/intent.test.ts +133 -0
- package/src/__tests__/jobs.test.ts +107 -0
- package/src/__tests__/knowledge.test.ts +121 -0
- package/src/__tests__/media-routes.test.ts +109 -0
- package/src/__tests__/schema.test.ts +100 -0
- package/src/app.ts +92 -0
- package/src/engine.ts +168 -0
- package/src/index.ts +31 -0
- package/src/middleware/auth.ts +66 -0
- package/src/middleware/cors.ts +15 -0
- package/src/middleware/error-handler.ts +42 -0
- package/src/middleware/index.ts +6 -0
- package/src/middleware/rate-limit.ts +27 -0
- package/src/middleware/route-error-handler.ts +13 -0
- package/src/routes/approval.ts +90 -0
- package/src/routes/content.ts +256 -0
- package/src/routes/eval.ts +262 -0
- package/src/routes/graph.ts +111 -0
- package/src/routes/health.ts +33 -0
- package/src/routes/import.ts +122 -0
- package/src/routes/index.ts +11 -0
- package/src/routes/intent.ts +105 -0
- package/src/routes/jobs.ts +84 -0
- package/src/routes/knowledge.ts +73 -0
- package/src/routes/media.ts +117 -0
- package/src/routes/schema.ts +75 -0
- package/src/standalone.ts +130 -0
- package/tsconfig.json +8 -0
- package/vitest.config.ts +7 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/middleware/error-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG1C,MAAM,WAAW,QAAQ;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;gBAEN,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAO5E;AAED,wBAAgB,YAAY,KACb,GAAG,OAAO,EAAE,MAAM,IAAI;;;;;YArB5B,MAAM;aACL,MAAM;UACT,MAAM;;gFAmCZ"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { handleRouteError } from "./route-error-handler.js";
|
|
2
|
+
export class SourcePressError extends Error {
|
|
3
|
+
status;
|
|
4
|
+
code;
|
|
5
|
+
details;
|
|
6
|
+
constructor(status, code, message, details) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = "SourcePressError";
|
|
9
|
+
this.status = status;
|
|
10
|
+
this.code = code;
|
|
11
|
+
this.details = details;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function errorHandler() {
|
|
15
|
+
return async (c, next) => {
|
|
16
|
+
try {
|
|
17
|
+
await next();
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
if (err instanceof Error) {
|
|
21
|
+
if (!(err instanceof SourcePressError)) {
|
|
22
|
+
console.error("Unhandled error:", err);
|
|
23
|
+
}
|
|
24
|
+
return handleRouteError(err, c);
|
|
25
|
+
}
|
|
26
|
+
return c.json({ status: 500, message: "Internal server error", code: "INTERNAL_ERROR" }, 500);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=error-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/middleware/error-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAS5D,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAC1C,MAAM,CAAS;IACf,IAAI,CAAS;IACb,OAAO,CAAW;IAElB,YAAY,MAAc,EAAE,IAAY,EAAE,OAAe,EAAE,OAAiB;QAC3E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;CACD;AAED,MAAM,UAAU,YAAY;IAC3B,OAAO,KAAK,EAAE,CAAU,EAAE,IAAU,EAAE,EAAE;QACvC,IAAI,CAAC;YACJ,MAAM,IAAI,EAAE,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;gBAC1B,IAAI,CAAC,CAAC,GAAG,YAAY,gBAAgB,CAAC,EAAE,CAAC;oBACxC,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;gBACxC,CAAC;gBACD,OAAO,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACjC,CAAC;YACD,OAAO,CAAC,CAAC,IAAI,CACZ,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,uBAAuB,EAAE,IAAI,EAAE,gBAAgB,EAAE,EACzE,GAAG,CACH,CAAC;QACH,CAAC;IACF,CAAC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { corsMiddleware } from "./cors.js";
|
|
2
|
+
export { errorHandler, SourcePressError } from "./error-handler.js";
|
|
3
|
+
export type { ApiError } from "./error-handler.js";
|
|
4
|
+
export { authMiddleware, requireAuth } from "./auth.js";
|
|
5
|
+
export type { AuthContext } from "./auth.js";
|
|
6
|
+
export { handleRouteError } from "./route-error-handler.js";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACpE,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { corsMiddleware } from "./cors.js";
|
|
2
|
+
export { errorHandler, SourcePressError } from "./error-handler.js";
|
|
3
|
+
export { authMiddleware, requireAuth } from "./auth.js";
|
|
4
|
+
export { handleRouteError } from "./route-error-handler.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate limiter for AI-consuming endpoints (expensive operations).
|
|
3
|
+
* 10 requests per minute per IP.
|
|
4
|
+
*/
|
|
5
|
+
export declare function aiRateLimit(): import("hono").MiddlewareHandler<import("hono").Env, string, import("hono").Input, Response>;
|
|
6
|
+
/**
|
|
7
|
+
* Rate limiter for general endpoints.
|
|
8
|
+
* 100 requests per minute per IP.
|
|
9
|
+
*/
|
|
10
|
+
export declare function generalRateLimit(): import("hono").MiddlewareHandler<import("hono").Env, string, import("hono").Input, Response>;
|
|
11
|
+
//# sourceMappingURL=rate-limit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,WAAW,iGAO1B;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,iGAO/B"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { rateLimiter } from "hono-rate-limiter";
|
|
2
|
+
/**
|
|
3
|
+
* Rate limiter for AI-consuming endpoints (expensive operations).
|
|
4
|
+
* 10 requests per minute per IP.
|
|
5
|
+
*/
|
|
6
|
+
export function aiRateLimit() {
|
|
7
|
+
return rateLimiter({
|
|
8
|
+
windowMs: 60 * 1000,
|
|
9
|
+
limit: 10,
|
|
10
|
+
standardHeaders: "draft-6",
|
|
11
|
+
keyGenerator: (c) => c.req.header("x-forwarded-for") ?? c.req.header("x-real-ip") ?? "unknown",
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Rate limiter for general endpoints.
|
|
16
|
+
* 100 requests per minute per IP.
|
|
17
|
+
*/
|
|
18
|
+
export function generalRateLimit() {
|
|
19
|
+
return rateLimiter({
|
|
20
|
+
windowMs: 60 * 1000,
|
|
21
|
+
limit: 100,
|
|
22
|
+
standardHeaders: "draft-6",
|
|
23
|
+
keyGenerator: (c) => c.req.header("x-forwarded-for") ?? c.req.header("x-real-ip") ?? "unknown",
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=rate-limit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;GAGG;AACH,MAAM,UAAU,WAAW;IAC1B,OAAO,WAAW,CAAC;QAClB,QAAQ,EAAE,EAAE,GAAG,IAAI;QACnB,KAAK,EAAE,EAAE;QACT,eAAe,EAAE,SAAS;QAC1B,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,SAAS;KAC9F,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC/B,OAAO,WAAW,CAAC;QAClB,QAAQ,EAAE,EAAE,GAAG,IAAI;QACnB,KAAK,EAAE,GAAG;QACV,eAAe,EAAE,SAAS;QAC1B,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,SAAS;KAC9F,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Context } from "hono";
|
|
2
|
+
export declare function handleRouteError(err: Error, c: Context): (Response & import("hono").TypedResponse<{
|
|
3
|
+
status: number;
|
|
4
|
+
message: string;
|
|
5
|
+
code: string;
|
|
6
|
+
details: import("hono/utils/types").JSONValue;
|
|
7
|
+
}, 400 | 404 | 500 | 501, "json">) | (Response & import("hono").TypedResponse<{
|
|
8
|
+
status: number;
|
|
9
|
+
message: string;
|
|
10
|
+
code: string;
|
|
11
|
+
}, 500, "json">);
|
|
12
|
+
//# sourceMappingURL=route-error-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-error-handler.d.ts","sourceRoot":"","sources":["../../src/middleware/route-error-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGpC,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO;;;;;;;;;iBAStD"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { SourcePressError } from "./error-handler.js";
|
|
2
|
+
export function handleRouteError(err, c) {
|
|
3
|
+
if (err instanceof SourcePressError) {
|
|
4
|
+
return c.json({ status: err.status, message: err.message, code: err.code, details: err.details }, err.status);
|
|
5
|
+
}
|
|
6
|
+
console.error("Unhandled route error:", err);
|
|
7
|
+
return c.json({ status: 500, message: "Internal server error", code: "INTERNAL_ERROR" }, 500);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=route-error-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-error-handler.js","sourceRoot":"","sources":["../../src/middleware/route-error-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,UAAU,gBAAgB,CAAC,GAAU,EAAE,CAAU;IACtD,IAAI,GAAG,YAAY,gBAAgB,EAAE,CAAC;QACrC,OAAO,CAAC,CAAC,IAAI,CACZ,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EAClF,GAAG,CAAC,MAA+B,CACnC,CAAC;IACH,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;IAC7C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,uBAAuB,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,GAAG,CAAC,CAAC;AAC/F,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval.d.ts","sourceRoot":"","sources":["../../src/routes/approval.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAKlD,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,8EAkFnD"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import { resolveApprovalRule } from "../engine.js";
|
|
3
|
+
import { SourcePressError } from "../middleware/error-handler.js";
|
|
4
|
+
import { handleRouteError } from "../middleware/route-error-handler.js";
|
|
5
|
+
export function approvalRoutes(engine) {
|
|
6
|
+
const app = new Hono();
|
|
7
|
+
// GET /approval/pending — list pending approval requests
|
|
8
|
+
app.get("/approval/pending", async (c) => {
|
|
9
|
+
if (!engine.approval) {
|
|
10
|
+
throw new SourcePressError(501, "APPROVAL_NOT_CONFIGURED", "Approval not configured");
|
|
11
|
+
}
|
|
12
|
+
const items = await engine.approval.pending();
|
|
13
|
+
return c.json({ items, total: items.length });
|
|
14
|
+
});
|
|
15
|
+
// GET /approval/:id — get single approval request status
|
|
16
|
+
app.get("/approval/:id", async (c) => {
|
|
17
|
+
if (!engine.approval) {
|
|
18
|
+
throw new SourcePressError(501, "APPROVAL_NOT_CONFIGURED", "Approval not configured");
|
|
19
|
+
}
|
|
20
|
+
const id = c.req.param("id");
|
|
21
|
+
const status = await engine.approval.status(id);
|
|
22
|
+
return c.json({ id, status });
|
|
23
|
+
});
|
|
24
|
+
// POST /approval — submit content for approval (creates PR or commits directly)
|
|
25
|
+
app.post("/approval", async (c) => {
|
|
26
|
+
if (!engine.approval) {
|
|
27
|
+
throw new SourcePressError(501, "APPROVAL_NOT_CONFIGURED", "Approval not configured");
|
|
28
|
+
}
|
|
29
|
+
const body = await c.req.json();
|
|
30
|
+
if (!body.collection || !body.slug || !body.path || !body.action || !body.content) {
|
|
31
|
+
throw new SourcePressError(400, "INVALID_INPUT", "collection, slug, path, action, and content are required");
|
|
32
|
+
}
|
|
33
|
+
const rule = resolveApprovalRule(engine.config, body.collection, body.path);
|
|
34
|
+
if (rule === "direct") {
|
|
35
|
+
await engine.github.createOrUpdateFile(body.path, body.content, `chore: direct publish ${body.collection}/${body.slug}`);
|
|
36
|
+
return c.json({ status: "direct", path: body.path }, 201);
|
|
37
|
+
}
|
|
38
|
+
const request = await engine.approval.submit(body);
|
|
39
|
+
return c.json(request, 201);
|
|
40
|
+
});
|
|
41
|
+
// POST /approval/:id/approve — approve (merge PR)
|
|
42
|
+
app.post("/approval/:id/approve", async (c) => {
|
|
43
|
+
if (!engine.approval) {
|
|
44
|
+
throw new SourcePressError(501, "APPROVAL_NOT_CONFIGURED", "Approval not configured");
|
|
45
|
+
}
|
|
46
|
+
const id = c.req.param("id");
|
|
47
|
+
const body = await c.req.json();
|
|
48
|
+
if (!body.by) {
|
|
49
|
+
throw new SourcePressError(400, "INVALID_INPUT", "by is required");
|
|
50
|
+
}
|
|
51
|
+
await engine.approval.approve(id, body.by, body.comment);
|
|
52
|
+
return c.json({ status: "approved" });
|
|
53
|
+
});
|
|
54
|
+
// POST /approval/:id/reject — reject (close PR)
|
|
55
|
+
app.post("/approval/:id/reject", async (c) => {
|
|
56
|
+
if (!engine.approval) {
|
|
57
|
+
throw new SourcePressError(501, "APPROVAL_NOT_CONFIGURED", "Approval not configured");
|
|
58
|
+
}
|
|
59
|
+
const id = c.req.param("id");
|
|
60
|
+
const body = await c.req.json();
|
|
61
|
+
if (!body.by || !body.reason) {
|
|
62
|
+
throw new SourcePressError(400, "INVALID_INPUT", "by and reason are required");
|
|
63
|
+
}
|
|
64
|
+
await engine.approval.reject(id, body.by, body.reason);
|
|
65
|
+
return c.json({ status: "rejected" });
|
|
66
|
+
});
|
|
67
|
+
app.onError(handleRouteError);
|
|
68
|
+
return app;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=approval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval.js","sourceRoot":"","sources":["../../src/routes/approval.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/routes/content.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAclD,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,8EAgPlD"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import { SourcePressError } from "../middleware/error-handler.js";
|
|
3
|
+
import { handleRouteError } from "../middleware/route-error-handler.js";
|
|
4
|
+
function validateSlug(slug) {
|
|
5
|
+
if (!/^[a-z0-9-]+$/.test(slug)) {
|
|
6
|
+
throw new SourcePressError(400, "INVALID_SLUG", `Slug "${slug}" is invalid. Only lowercase letters, digits, and hyphens are allowed.`);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export function contentRoutes(engine) {
|
|
10
|
+
const app = new Hono();
|
|
11
|
+
app.onError(handleRouteError);
|
|
12
|
+
// GET /content — list all content across all collections
|
|
13
|
+
app.get("/content", async (c) => {
|
|
14
|
+
const collections = engine.listCollections();
|
|
15
|
+
const allContent = [];
|
|
16
|
+
for (const collection of collections) {
|
|
17
|
+
const files = await engine.listContent(collection);
|
|
18
|
+
for (const file of files) {
|
|
19
|
+
allContent.push({
|
|
20
|
+
collection: file.collection,
|
|
21
|
+
slug: file.slug,
|
|
22
|
+
path: file.path,
|
|
23
|
+
frontmatter: file.frontmatter,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return c.json({ items: allContent, total: allContent.length });
|
|
28
|
+
});
|
|
29
|
+
// GET /content/:collection — list content in a collection
|
|
30
|
+
app.get("/content/:collection", async (c) => {
|
|
31
|
+
const collection = c.req.param("collection");
|
|
32
|
+
const def = engine.getCollectionDef(collection);
|
|
33
|
+
if (!def) {
|
|
34
|
+
throw new SourcePressError(404, "COLLECTION_NOT_FOUND", `Collection "${collection}" not found`);
|
|
35
|
+
}
|
|
36
|
+
const files = await engine.listContent(collection);
|
|
37
|
+
const items = files.map((f) => ({
|
|
38
|
+
collection: f.collection,
|
|
39
|
+
slug: f.slug,
|
|
40
|
+
path: f.path,
|
|
41
|
+
frontmatter: f.frontmatter,
|
|
42
|
+
body: f.body,
|
|
43
|
+
}));
|
|
44
|
+
return c.json({ items, total: items.length, collection: def });
|
|
45
|
+
});
|
|
46
|
+
// GET /content/:collection/:slug — get a single content file
|
|
47
|
+
app.get("/content/:collection/:slug", async (c) => {
|
|
48
|
+
const collection = c.req.param("collection");
|
|
49
|
+
const slug = c.req.param("slug");
|
|
50
|
+
validateSlug(slug);
|
|
51
|
+
const def = engine.getCollectionDef(collection);
|
|
52
|
+
if (!def) {
|
|
53
|
+
throw new SourcePressError(404, "COLLECTION_NOT_FOUND", `Collection "${collection}" not found`);
|
|
54
|
+
}
|
|
55
|
+
const file = await engine.getContent(collection, slug);
|
|
56
|
+
if (!file) {
|
|
57
|
+
throw new SourcePressError(404, "CONTENT_NOT_FOUND", `Content "${slug}" not found in "${collection}"`);
|
|
58
|
+
}
|
|
59
|
+
return c.json(file);
|
|
60
|
+
});
|
|
61
|
+
// POST /content/:collection — create new content (returns PR)
|
|
62
|
+
app.post("/content/:collection", async (c) => {
|
|
63
|
+
const collection = c.req.param("collection");
|
|
64
|
+
const def = engine.getCollectionDef(collection);
|
|
65
|
+
if (!def) {
|
|
66
|
+
throw new SourcePressError(404, "COLLECTION_NOT_FOUND", `Collection "${collection}" not found`);
|
|
67
|
+
}
|
|
68
|
+
const body = await c.req.json();
|
|
69
|
+
if (!body.slug || !body.body) {
|
|
70
|
+
throw new SourcePressError(400, "INVALID_INPUT", "slug and body are required");
|
|
71
|
+
}
|
|
72
|
+
validateSlug(body.slug);
|
|
73
|
+
// Build file content with frontmatter
|
|
74
|
+
const ext = def.format === "yaml" ? "yaml" : def.format === "json" ? "json" : def.format;
|
|
75
|
+
const basePath = def.path.replace(/\/+$/, "");
|
|
76
|
+
const filePath = `${basePath}/${body.slug}.${ext}`;
|
|
77
|
+
const frontmatterYaml = Object.entries(body.frontmatter ?? {})
|
|
78
|
+
.map(([key, value]) => `${key}: ${JSON.stringify(value)}`)
|
|
79
|
+
.join("\n");
|
|
80
|
+
const fileContent = `---\n${frontmatterYaml}\n---\n\n${body.body}`;
|
|
81
|
+
// Create branch + commit + PR
|
|
82
|
+
const branchName = `sourcepress/create-${collection}-${body.slug}-${Date.now()}`;
|
|
83
|
+
await engine.github.createBranch(branchName);
|
|
84
|
+
await engine.github.createOrUpdateFile(filePath, fileContent, `feat(${collection}): create ${body.slug}`, branchName);
|
|
85
|
+
const pr = await engine.github.createPR(`Create ${collection}: ${body.slug}`, `Created by SourcePress API.\n\nCollection: ${collection}\nSlug: ${body.slug}`, branchName);
|
|
86
|
+
return c.json({ created: true, path: filePath, pr: { number: pr.number, url: pr.html_url } }, 201);
|
|
87
|
+
});
|
|
88
|
+
// PUT /content/:collection/:slug — update content (returns PR)
|
|
89
|
+
app.put("/content/:collection/:slug", async (c) => {
|
|
90
|
+
const collection = c.req.param("collection");
|
|
91
|
+
const slug = c.req.param("slug");
|
|
92
|
+
validateSlug(slug);
|
|
93
|
+
const def = engine.getCollectionDef(collection);
|
|
94
|
+
if (!def) {
|
|
95
|
+
throw new SourcePressError(404, "COLLECTION_NOT_FOUND", `Collection "${collection}" not found`);
|
|
96
|
+
}
|
|
97
|
+
const existing = await engine.getContent(collection, slug);
|
|
98
|
+
if (!existing) {
|
|
99
|
+
throw new SourcePressError(404, "CONTENT_NOT_FOUND", `Content "${slug}" not found in "${collection}"`);
|
|
100
|
+
}
|
|
101
|
+
const body = await c.req.json();
|
|
102
|
+
const mergedFrontmatter = { ...existing.frontmatter, ...(body.frontmatter ?? {}) };
|
|
103
|
+
const mergedBody = body.body ?? existing.body;
|
|
104
|
+
const frontmatterYaml = Object.entries(mergedFrontmatter)
|
|
105
|
+
.map(([key, value]) => `${key}: ${JSON.stringify(value)}`)
|
|
106
|
+
.join("\n");
|
|
107
|
+
const fileContent = `---\n${frontmatterYaml}\n---\n\n${mergedBody}`;
|
|
108
|
+
// Get existing file SHA for update
|
|
109
|
+
const ext = def.format === "yaml" ? "yaml" : def.format === "json" ? "json" : def.format;
|
|
110
|
+
const filePath = `${def.path}/${slug}.${ext}`;
|
|
111
|
+
const existingFile = await engine.github.getFile(filePath);
|
|
112
|
+
const existingSha = existingFile?.sha;
|
|
113
|
+
const branchName = `sourcepress/update-${collection}-${slug}-${Date.now()}`;
|
|
114
|
+
await engine.github.createBranch(branchName);
|
|
115
|
+
await engine.github.createOrUpdateFile(filePath, fileContent, `update(${collection}): update ${slug}`, branchName, existingSha);
|
|
116
|
+
const pr = await engine.github.createPR(`Update ${collection}: ${slug}`, `Updated by SourcePress API.\n\nCollection: ${collection}\nSlug: ${slug}`, branchName);
|
|
117
|
+
return c.json({ updated: true, path: filePath, pr: { number: pr.number, url: pr.html_url } });
|
|
118
|
+
});
|
|
119
|
+
// DELETE /content/:collection/:slug — delete content (returns PR)
|
|
120
|
+
app.delete("/content/:collection/:slug", async (c) => {
|
|
121
|
+
const collection = c.req.param("collection");
|
|
122
|
+
const slug = c.req.param("slug");
|
|
123
|
+
validateSlug(slug);
|
|
124
|
+
const def = engine.getCollectionDef(collection);
|
|
125
|
+
if (!def) {
|
|
126
|
+
throw new SourcePressError(404, "COLLECTION_NOT_FOUND", `Collection "${collection}" not found`);
|
|
127
|
+
}
|
|
128
|
+
const existing = await engine.getContent(collection, slug);
|
|
129
|
+
if (!existing) {
|
|
130
|
+
throw new SourcePressError(404, "CONTENT_NOT_FOUND", `Content "${slug}" not found in "${collection}"`);
|
|
131
|
+
}
|
|
132
|
+
// Delete is implemented as creating a PR that removes the file
|
|
133
|
+
// For now, we create a branch and commit an empty update with a delete marker
|
|
134
|
+
const branchName = `sourcepress/delete-${collection}-${slug}-${Date.now()}`;
|
|
135
|
+
await engine.github.createBranch(branchName);
|
|
136
|
+
const pr = await engine.github.createPR(`Delete ${collection}: ${slug}`, `Deletion requested by SourcePress API.\n\nCollection: ${collection}\nSlug: ${slug}\nPath: ${existing.path}`, branchName);
|
|
137
|
+
return c.json({
|
|
138
|
+
deleted: true,
|
|
139
|
+
path: existing.path,
|
|
140
|
+
pr: { number: pr.number, url: pr.html_url },
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
return app;
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/routes/content.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval.d.ts","sourceRoot":"","sources":["../../src/routes/eval.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAIlD,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,8EA8P/C"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { EvalRunner, judge } from "@sourcepress/ai";
|
|
2
|
+
import { Hono } from "hono";
|
|
3
|
+
import { SourcePressError } from "../middleware/error-handler.js";
|
|
4
|
+
import { handleRouteError } from "../middleware/route-error-handler.js";
|
|
5
|
+
export function evalRoutes(engine) {
|
|
6
|
+
const app = new Hono();
|
|
7
|
+
app.onError(handleRouteError);
|
|
8
|
+
// POST /eval/judge — single judge pass on content
|
|
9
|
+
app.post("/eval/judge", async (c) => {
|
|
10
|
+
const body = await c.req.json();
|
|
11
|
+
if (!body.draft || !body.gold_standard || !body.judge_prompt) {
|
|
12
|
+
throw new SourcePressError(400, "INVALID_INPUT", "draft, gold_standard, and judge_prompt are required");
|
|
13
|
+
}
|
|
14
|
+
const result = await judge({
|
|
15
|
+
draft: body.draft,
|
|
16
|
+
gold_standard: body.gold_standard,
|
|
17
|
+
judge_prompt: body.judge_prompt,
|
|
18
|
+
intent: body.intent,
|
|
19
|
+
}, engine.provider, engine.budget);
|
|
20
|
+
return c.json({
|
|
21
|
+
score: result.score,
|
|
22
|
+
reasoning: result.reasoning,
|
|
23
|
+
usage: result.usage,
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
// POST /eval/run — full generate-judge-improve loop
|
|
27
|
+
app.post("/eval/run", async (c) => {
|
|
28
|
+
const body = await c.req.json();
|
|
29
|
+
if (!body.content_type ||
|
|
30
|
+
!body.knowledge_context ||
|
|
31
|
+
!body.gold_standard ||
|
|
32
|
+
!body.judge_prompt ||
|
|
33
|
+
!body.generation_prompt) {
|
|
34
|
+
throw new SourcePressError(400, "INVALID_INPUT", "content_type, knowledge_context, gold_standard, judge_prompt, and generation_prompt are required");
|
|
35
|
+
}
|
|
36
|
+
const threshold = body.threshold ??
|
|
37
|
+
engine.config.evals?.threshold ??
|
|
38
|
+
70;
|
|
39
|
+
const maxIterations = body.max_iterations ?? 3;
|
|
40
|
+
const config = {
|
|
41
|
+
content_type: body.content_type,
|
|
42
|
+
knowledge_context: body.knowledge_context,
|
|
43
|
+
gold_standard: body.gold_standard,
|
|
44
|
+
judge_prompt: body.judge_prompt,
|
|
45
|
+
generation_prompt: body.generation_prompt,
|
|
46
|
+
intent: body.intent,
|
|
47
|
+
threshold,
|
|
48
|
+
max_iterations: maxIterations,
|
|
49
|
+
collection_schema: body.collection_schema,
|
|
50
|
+
};
|
|
51
|
+
const runner = new EvalRunner(engine.provider, engine.budget);
|
|
52
|
+
const result = await runner.run(config);
|
|
53
|
+
// Log result to results.tsv
|
|
54
|
+
try {
|
|
55
|
+
const resultsPath = "evals/results.tsv";
|
|
56
|
+
const existing = await engine.github.getFile(resultsPath);
|
|
57
|
+
const header = "date\tcontent_type\tprompt_version\tscore\tstatus\treasoning";
|
|
58
|
+
const row = `${new Date().toISOString()}\t${body.content_type}\tdefault\t${result.final_score}\t${result.final_status}\t${(result.iterations[result.iterations.length - 1]?.reasoning ?? "").replace(/\t/g, " ")}`;
|
|
59
|
+
const content = existing ? `${existing.content.trimEnd()}\n${row}\n` : `${header}\n${row}\n`;
|
|
60
|
+
await engine.github.createOrUpdateFile(resultsPath, content, "eval: log result", undefined, existing?.sha);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Non-critical — don't fail the eval if logging fails
|
|
64
|
+
}
|
|
65
|
+
return c.json(result);
|
|
66
|
+
});
|
|
67
|
+
// GET /eval/results — list eval results from evals/results.tsv in the repo
|
|
68
|
+
app.get("/eval/results", async (c) => {
|
|
69
|
+
const resultsPath = "evals/results.tsv";
|
|
70
|
+
const file = await engine.github.getFile(resultsPath);
|
|
71
|
+
if (!file) {
|
|
72
|
+
return c.json({ items: [], total: 0 });
|
|
73
|
+
}
|
|
74
|
+
const lines = file.content.trim().split("\n");
|
|
75
|
+
if (lines.length <= 1) {
|
|
76
|
+
return c.json({ items: [], total: 0 });
|
|
77
|
+
}
|
|
78
|
+
// Parse TSV: date, content_type, prompt_version, score, status, reasoning
|
|
79
|
+
const headers = lines[0].split("\t");
|
|
80
|
+
const items = lines.slice(1).map((line) => {
|
|
81
|
+
const values = line.split("\t");
|
|
82
|
+
const obj = {};
|
|
83
|
+
for (let i = 0; i < headers.length; i++) {
|
|
84
|
+
obj[headers[i].trim()] = values[i]?.trim() ?? "";
|
|
85
|
+
}
|
|
86
|
+
return obj;
|
|
87
|
+
});
|
|
88
|
+
// Filter by content_type if provided
|
|
89
|
+
const contentType = c.req.query("content_type");
|
|
90
|
+
const filtered = contentType
|
|
91
|
+
? items.filter((item) => item.content_type === contentType)
|
|
92
|
+
: items;
|
|
93
|
+
return c.json({ items: filtered, total: filtered.length });
|
|
94
|
+
});
|
|
95
|
+
// GET /eval/prompts — list generation prompts from evals/prompts/ in the repo
|
|
96
|
+
app.get("/eval/prompts", async (c) => {
|
|
97
|
+
const tree = await engine.github.getTree();
|
|
98
|
+
const promptFiles = tree
|
|
99
|
+
.filter((entry) => entry.path.startsWith("evals/prompts/") && entry.type === "blob")
|
|
100
|
+
.map((entry) => ({
|
|
101
|
+
path: entry.path,
|
|
102
|
+
name: entry.path.replace("evals/prompts/", "").replace(/\.(md|txt)$/, ""),
|
|
103
|
+
}));
|
|
104
|
+
return c.json({ items: promptFiles, total: promptFiles.length });
|
|
105
|
+
});
|
|
106
|
+
// GET /eval/prompts/:name — get a single generation prompt
|
|
107
|
+
app.get("/eval/prompts/:name", async (c) => {
|
|
108
|
+
const name = c.req.param("name");
|
|
109
|
+
const filePath = `evals/prompts/${name}.md`;
|
|
110
|
+
const file = await engine.github.getFile(filePath);
|
|
111
|
+
if (!file) {
|
|
112
|
+
throw new SourcePressError(404, "PROMPT_NOT_FOUND", `Generation prompt "${name}" not found`);
|
|
113
|
+
}
|
|
114
|
+
return c.json({
|
|
115
|
+
name,
|
|
116
|
+
path: file.path,
|
|
117
|
+
content: file.content,
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
// PUT /eval/prompts/:name — update a generation prompt (direct commit, self-improving)
|
|
121
|
+
app.put("/eval/prompts/:name", async (c) => {
|
|
122
|
+
const name = c.req.param("name");
|
|
123
|
+
const filePath = `evals/prompts/${name}.md`;
|
|
124
|
+
const body = await c.req.json();
|
|
125
|
+
if (!body.content) {
|
|
126
|
+
throw new SourcePressError(400, "INVALID_INPUT", "content is required");
|
|
127
|
+
}
|
|
128
|
+
const existing = await engine.github.getFile(filePath);
|
|
129
|
+
const existingSha = existing?.sha;
|
|
130
|
+
const result = await engine.github.createOrUpdateFile(filePath, body.content, `update(eval): improve ${name} generation prompt`, undefined, existingSha);
|
|
131
|
+
return c.json({
|
|
132
|
+
updated: true,
|
|
133
|
+
path: filePath,
|
|
134
|
+
commit_sha: result.commit_sha,
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
// GET /eval/standards — list gold standard files
|
|
138
|
+
app.get("/eval/standards", async (c) => {
|
|
139
|
+
const tree = await engine.github.getTree();
|
|
140
|
+
const standardFiles = tree
|
|
141
|
+
.filter((entry) => entry.path.startsWith("evals/standards/") && entry.type === "blob")
|
|
142
|
+
.map((entry) => ({
|
|
143
|
+
path: entry.path,
|
|
144
|
+
name: entry.path.replace("evals/standards/", "").replace(/\.(mdx|md)$/, ""),
|
|
145
|
+
}));
|
|
146
|
+
return c.json({ items: standardFiles, total: standardFiles.length });
|
|
147
|
+
});
|
|
148
|
+
// GET /eval/standards/:name — get a single gold standard
|
|
149
|
+
app.get("/eval/standards/:name", async (c) => {
|
|
150
|
+
const name = c.req.param("name");
|
|
151
|
+
// Try .mdx first, then .md
|
|
152
|
+
let file = await engine.github.getFile(`evals/standards/${name}.mdx`);
|
|
153
|
+
if (!file) {
|
|
154
|
+
file = await engine.github.getFile(`evals/standards/${name}.md`);
|
|
155
|
+
}
|
|
156
|
+
if (!file) {
|
|
157
|
+
throw new SourcePressError(404, "STANDARD_NOT_FOUND", `Gold standard "${name}" not found`);
|
|
158
|
+
}
|
|
159
|
+
return c.json({
|
|
160
|
+
name,
|
|
161
|
+
path: file.path,
|
|
162
|
+
content: file.content,
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
// GET /eval/judge-prompt — get the judge.md prompt
|
|
166
|
+
app.get("/eval/judge-prompt", async (c) => {
|
|
167
|
+
const file = await engine.github.getFile("evals/judge.md");
|
|
168
|
+
if (!file) {
|
|
169
|
+
throw new SourcePressError(404, "JUDGE_PROMPT_NOT_FOUND", "evals/judge.md not found in repository");
|
|
170
|
+
}
|
|
171
|
+
return c.json({
|
|
172
|
+
path: file.path,
|
|
173
|
+
content: file.content,
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
return app;
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=eval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval.js","sourceRoot":"","sources":["../../src/routes/eval.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/routes/graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAIlD,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,8EAyGhD"}
|