@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.
Files changed (184) hide show
  1. package/.omc/state/agent-replay-31d84b63-606a-4368-b9e6-93fe4f5ae0f7.jsonl +2 -0
  2. package/.omc/state/last-tool-error.json +7 -0
  3. package/.omc/state/mission-state.json +53 -0
  4. package/.omc/state/subagent-tracking.json +17 -0
  5. package/.turbo/turbo-build.log +4 -0
  6. package/.turbo/turbo-test.log +26 -0
  7. package/dist/__tests__/app-integration.test.d.ts +2 -0
  8. package/dist/__tests__/app-integration.test.d.ts.map +1 -0
  9. package/dist/__tests__/app-integration.test.js +71 -0
  10. package/dist/__tests__/app-integration.test.js.map +1 -0
  11. package/dist/__tests__/approval.test.d.ts +2 -0
  12. package/dist/__tests__/approval.test.d.ts.map +1 -0
  13. package/dist/__tests__/approval.test.js +170 -0
  14. package/dist/__tests__/approval.test.js.map +1 -0
  15. package/dist/__tests__/content.test.d.ts +2 -0
  16. package/dist/__tests__/content.test.d.ts.map +1 -0
  17. package/dist/__tests__/content.test.js +187 -0
  18. package/dist/__tests__/content.test.js.map +1 -0
  19. package/dist/__tests__/engine.test.d.ts +2 -0
  20. package/dist/__tests__/engine.test.d.ts.map +1 -0
  21. package/dist/__tests__/engine.test.js +77 -0
  22. package/dist/__tests__/engine.test.js.map +1 -0
  23. package/dist/__tests__/eval.test.d.ts +2 -0
  24. package/dist/__tests__/eval.test.d.ts.map +1 -0
  25. package/dist/__tests__/eval.test.js +320 -0
  26. package/dist/__tests__/eval.test.js.map +1 -0
  27. package/dist/__tests__/graph.test.d.ts +2 -0
  28. package/dist/__tests__/graph.test.d.ts.map +1 -0
  29. package/dist/__tests__/graph.test.js +169 -0
  30. package/dist/__tests__/graph.test.js.map +1 -0
  31. package/dist/__tests__/health.test.d.ts +2 -0
  32. package/dist/__tests__/health.test.d.ts.map +1 -0
  33. package/dist/__tests__/health.test.js +56 -0
  34. package/dist/__tests__/health.test.js.map +1 -0
  35. package/dist/__tests__/import.test.d.ts +2 -0
  36. package/dist/__tests__/import.test.d.ts.map +1 -0
  37. package/dist/__tests__/import.test.js +138 -0
  38. package/dist/__tests__/import.test.js.map +1 -0
  39. package/dist/__tests__/intent.test.d.ts +2 -0
  40. package/dist/__tests__/intent.test.d.ts.map +1 -0
  41. package/dist/__tests__/intent.test.js +122 -0
  42. package/dist/__tests__/intent.test.js.map +1 -0
  43. package/dist/__tests__/jobs.test.d.ts +2 -0
  44. package/dist/__tests__/jobs.test.d.ts.map +1 -0
  45. package/dist/__tests__/jobs.test.js +96 -0
  46. package/dist/__tests__/jobs.test.js.map +1 -0
  47. package/dist/__tests__/knowledge.test.d.ts +2 -0
  48. package/dist/__tests__/knowledge.test.d.ts.map +1 -0
  49. package/dist/__tests__/knowledge.test.js +110 -0
  50. package/dist/__tests__/knowledge.test.js.map +1 -0
  51. package/dist/__tests__/media-routes.test.d.ts +2 -0
  52. package/dist/__tests__/media-routes.test.d.ts.map +1 -0
  53. package/dist/__tests__/media-routes.test.js +88 -0
  54. package/dist/__tests__/media-routes.test.js.map +1 -0
  55. package/dist/__tests__/schema.test.d.ts +2 -0
  56. package/dist/__tests__/schema.test.d.ts.map +1 -0
  57. package/dist/__tests__/schema.test.js +92 -0
  58. package/dist/__tests__/schema.test.js.map +1 -0
  59. package/dist/app.d.ts +7 -0
  60. package/dist/app.d.ts.map +1 -0
  61. package/dist/app.js +85 -0
  62. package/dist/app.js.map +1 -0
  63. package/dist/engine.d.ts +38 -0
  64. package/dist/engine.d.ts.map +1 -0
  65. package/dist/engine.js +106 -0
  66. package/dist/engine.js.map +1 -0
  67. package/dist/index.d.ts +8 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +9 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/middleware/auth.d.ts +17 -0
  72. package/dist/middleware/auth.d.ts.map +1 -0
  73. package/dist/middleware/auth.js +54 -0
  74. package/dist/middleware/auth.js.map +1 -0
  75. package/dist/middleware/cors.d.ts +2 -0
  76. package/dist/middleware/cors.d.ts.map +1 -0
  77. package/dist/middleware/cors.js +13 -0
  78. package/dist/middleware/cors.js.map +1 -0
  79. package/dist/middleware/error-handler.d.ts +24 -0
  80. package/dist/middleware/error-handler.d.ts.map +1 -0
  81. package/dist/middleware/error-handler.js +30 -0
  82. package/dist/middleware/error-handler.js.map +1 -0
  83. package/dist/middleware/index.d.ts +7 -0
  84. package/dist/middleware/index.d.ts.map +1 -0
  85. package/dist/middleware/index.js +5 -0
  86. package/dist/middleware/index.js.map +1 -0
  87. package/dist/middleware/rate-limit.d.ts +11 -0
  88. package/dist/middleware/rate-limit.d.ts.map +1 -0
  89. package/dist/middleware/rate-limit.js +26 -0
  90. package/dist/middleware/rate-limit.js.map +1 -0
  91. package/dist/middleware/route-error-handler.d.ts +12 -0
  92. package/dist/middleware/route-error-handler.d.ts.map +1 -0
  93. package/dist/middleware/route-error-handler.js +9 -0
  94. package/dist/middleware/route-error-handler.js.map +1 -0
  95. package/dist/routes/approval.d.ts +4 -0
  96. package/dist/routes/approval.d.ts.map +1 -0
  97. package/dist/routes/approval.js +70 -0
  98. package/dist/routes/approval.js.map +1 -0
  99. package/dist/routes/content.d.ts +4 -0
  100. package/dist/routes/content.d.ts.map +1 -0
  101. package/dist/routes/content.js +145 -0
  102. package/dist/routes/content.js.map +1 -0
  103. package/dist/routes/eval.d.ts +4 -0
  104. package/dist/routes/eval.d.ts.map +1 -0
  105. package/dist/routes/eval.js +178 -0
  106. package/dist/routes/eval.js.map +1 -0
  107. package/dist/routes/graph.d.ts +4 -0
  108. package/dist/routes/graph.d.ts.map +1 -0
  109. package/dist/routes/graph.js +90 -0
  110. package/dist/routes/graph.js.map +1 -0
  111. package/dist/routes/health.d.ts +13 -0
  112. package/dist/routes/health.d.ts.map +1 -0
  113. package/dist/routes/health.js +19 -0
  114. package/dist/routes/health.js.map +1 -0
  115. package/dist/routes/import.d.ts +4 -0
  116. package/dist/routes/import.d.ts.map +1 -0
  117. package/dist/routes/import.js +85 -0
  118. package/dist/routes/import.js.map +1 -0
  119. package/dist/routes/index.d.ts +12 -0
  120. package/dist/routes/index.d.ts.map +1 -0
  121. package/dist/routes/index.js +12 -0
  122. package/dist/routes/index.js.map +1 -0
  123. package/dist/routes/intent.d.ts +4 -0
  124. package/dist/routes/intent.d.ts.map +1 -0
  125. package/dist/routes/intent.js +80 -0
  126. package/dist/routes/intent.js.map +1 -0
  127. package/dist/routes/jobs.d.ts +4 -0
  128. package/dist/routes/jobs.d.ts.map +1 -0
  129. package/dist/routes/jobs.js +67 -0
  130. package/dist/routes/jobs.js.map +1 -0
  131. package/dist/routes/knowledge.d.ts +4 -0
  132. package/dist/routes/knowledge.d.ts.map +1 -0
  133. package/dist/routes/knowledge.js +48 -0
  134. package/dist/routes/knowledge.js.map +1 -0
  135. package/dist/routes/media.d.ts +4 -0
  136. package/dist/routes/media.d.ts.map +1 -0
  137. package/dist/routes/media.js +87 -0
  138. package/dist/routes/media.js.map +1 -0
  139. package/dist/routes/schema.d.ts +4 -0
  140. package/dist/routes/schema.d.ts.map +1 -0
  141. package/dist/routes/schema.js +54 -0
  142. package/dist/routes/schema.js.map +1 -0
  143. package/dist/standalone.d.ts +2 -0
  144. package/dist/standalone.d.ts.map +1 -0
  145. package/dist/standalone.js +115 -0
  146. package/dist/standalone.js.map +1 -0
  147. package/package.json +36 -0
  148. package/src/__tests__/app-integration.test.ts +80 -0
  149. package/src/__tests__/approval.test.ts +195 -0
  150. package/src/__tests__/content.test.ts +202 -0
  151. package/src/__tests__/engine.test.ts +86 -0
  152. package/src/__tests__/eval.test.ts +343 -0
  153. package/src/__tests__/graph.test.ts +182 -0
  154. package/src/__tests__/health.test.ts +68 -0
  155. package/src/__tests__/import.test.ts +148 -0
  156. package/src/__tests__/intent.test.ts +133 -0
  157. package/src/__tests__/jobs.test.ts +107 -0
  158. package/src/__tests__/knowledge.test.ts +121 -0
  159. package/src/__tests__/media-routes.test.ts +109 -0
  160. package/src/__tests__/schema.test.ts +100 -0
  161. package/src/app.ts +92 -0
  162. package/src/engine.ts +168 -0
  163. package/src/index.ts +31 -0
  164. package/src/middleware/auth.ts +66 -0
  165. package/src/middleware/cors.ts +15 -0
  166. package/src/middleware/error-handler.ts +42 -0
  167. package/src/middleware/index.ts +6 -0
  168. package/src/middleware/rate-limit.ts +27 -0
  169. package/src/middleware/route-error-handler.ts +13 -0
  170. package/src/routes/approval.ts +90 -0
  171. package/src/routes/content.ts +256 -0
  172. package/src/routes/eval.ts +262 -0
  173. package/src/routes/graph.ts +111 -0
  174. package/src/routes/health.ts +33 -0
  175. package/src/routes/import.ts +122 -0
  176. package/src/routes/index.ts +11 -0
  177. package/src/routes/intent.ts +105 -0
  178. package/src/routes/jobs.ts +84 -0
  179. package/src/routes/knowledge.ts +73 -0
  180. package/src/routes/media.ts +117 -0
  181. package/src/routes/schema.ts +75 -0
  182. package/src/standalone.ts +130 -0
  183. package/tsconfig.json +8 -0
  184. 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,4 @@
1
+ import { Hono } from "hono";
2
+ import type { EngineContext } from "../engine.js";
3
+ export declare function approvalRoutes(engine: EngineContext): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
4
+ //# sourceMappingURL=approval.d.ts.map
@@ -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,4 @@
1
+ import { Hono } from "hono";
2
+ import type { EngineContext } from "../engine.js";
3
+ export declare function contentRoutes(engine: EngineContext): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
4
+ //# sourceMappingURL=content.d.ts.map
@@ -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,4 @@
1
+ import { Hono } from "hono";
2
+ import type { EngineContext } from "../engine.js";
3
+ export declare function evalRoutes(engine: EngineContext): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
4
+ //# sourceMappingURL=eval.d.ts.map
@@ -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,4 @@
1
+ import { Hono } from "hono";
2
+ import type { EngineContext } from "../engine.js";
3
+ export declare function graphRoutes(engine: EngineContext): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
4
+ //# sourceMappingURL=graph.d.ts.map
@@ -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"}