@polpo-ai/node 0.11.1

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 (238) hide show
  1. package/LICENSE +13 -0
  2. package/dist/adapters/engine.d.ts +51 -0
  3. package/dist/adapters/engine.d.ts.map +1 -0
  4. package/dist/adapters/engine.js +316 -0
  5. package/dist/adapters/engine.js.map +1 -0
  6. package/dist/adapters/index.d.ts +2 -0
  7. package/dist/adapters/index.d.ts.map +1 -0
  8. package/dist/adapters/index.js +4 -0
  9. package/dist/adapters/index.js.map +1 -0
  10. package/dist/adapters/loop-engine.d.ts +36 -0
  11. package/dist/adapters/loop-engine.d.ts.map +1 -0
  12. package/dist/adapters/loop-engine.js +534 -0
  13. package/dist/adapters/loop-engine.js.map +1 -0
  14. package/dist/adapters/node-filesystem.d.ts +22 -0
  15. package/dist/adapters/node-filesystem.d.ts.map +1 -0
  16. package/dist/adapters/node-filesystem.js +59 -0
  17. package/dist/adapters/node-filesystem.js.map +1 -0
  18. package/dist/adapters/node-shell.d.ts +5 -0
  19. package/dist/adapters/node-shell.d.ts.map +1 -0
  20. package/dist/adapters/node-shell.js +34 -0
  21. package/dist/adapters/node-shell.js.map +1 -0
  22. package/dist/adapters/node-spawner.d.ts +14 -0
  23. package/dist/adapters/node-spawner.d.ts.map +1 -0
  24. package/dist/adapters/node-spawner.js +103 -0
  25. package/dist/adapters/node-spawner.js.map +1 -0
  26. package/dist/assessment/assessor.d.ts +6 -0
  27. package/dist/assessment/assessor.d.ts.map +1 -0
  28. package/dist/assessment/assessor.js +37 -0
  29. package/dist/assessment/assessor.js.map +1 -0
  30. package/dist/assessment/index.d.ts +6 -0
  31. package/dist/assessment/index.d.ts.map +1 -0
  32. package/dist/assessment/index.js +6 -0
  33. package/dist/assessment/index.js.map +1 -0
  34. package/dist/assessment/llm-review.d.ts +34 -0
  35. package/dist/assessment/llm-review.d.ts.map +1 -0
  36. package/dist/assessment/llm-review.js +669 -0
  37. package/dist/assessment/llm-review.js.map +1 -0
  38. package/dist/assessment/schemas.d.ts +5 -0
  39. package/dist/assessment/schemas.d.ts.map +1 -0
  40. package/dist/assessment/schemas.js +5 -0
  41. package/dist/assessment/schemas.js.map +1 -0
  42. package/dist/assessment/scoring.d.ts +5 -0
  43. package/dist/assessment/scoring.d.ts.map +1 -0
  44. package/dist/assessment/scoring.js +5 -0
  45. package/dist/assessment/scoring.js.map +1 -0
  46. package/dist/assessment/transcript-parser.d.ts +31 -0
  47. package/dist/assessment/transcript-parser.d.ts.map +1 -0
  48. package/dist/assessment/transcript-parser.js +203 -0
  49. package/dist/assessment/transcript-parser.js.map +1 -0
  50. package/dist/auth/index.d.ts +2 -0
  51. package/dist/auth/index.d.ts.map +1 -0
  52. package/dist/auth/index.js +4 -0
  53. package/dist/auth/index.js.map +1 -0
  54. package/dist/core/adapter.d.ts +62 -0
  55. package/dist/core/adapter.d.ts.map +1 -0
  56. package/dist/core/adapter.js +2 -0
  57. package/dist/core/adapter.js.map +1 -0
  58. package/dist/core/assessment-orchestrator.d.ts +18 -0
  59. package/dist/core/assessment-orchestrator.d.ts.map +1 -0
  60. package/dist/core/assessment-orchestrator.js +93 -0
  61. package/dist/core/assessment-orchestrator.js.map +1 -0
  62. package/dist/core/config.d.ts +17 -0
  63. package/dist/core/config.d.ts.map +1 -0
  64. package/dist/core/config.js +272 -0
  65. package/dist/core/config.js.map +1 -0
  66. package/dist/core/constants.d.ts +10 -0
  67. package/dist/core/constants.d.ts.map +1 -0
  68. package/dist/core/constants.js +11 -0
  69. package/dist/core/constants.js.map +1 -0
  70. package/dist/core/deadlock-resolver.d.ts +35 -0
  71. package/dist/core/deadlock-resolver.d.ts.map +1 -0
  72. package/dist/core/deadlock-resolver.js +317 -0
  73. package/dist/core/deadlock-resolver.js.map +1 -0
  74. package/dist/core/drizzle-sqlite-schema.d.ts +8 -0
  75. package/dist/core/drizzle-sqlite-schema.d.ts.map +1 -0
  76. package/dist/core/drizzle-sqlite-schema.js +250 -0
  77. package/dist/core/drizzle-sqlite-schema.js.map +1 -0
  78. package/dist/core/events.d.ts +26 -0
  79. package/dist/core/events.d.ts.map +1 -0
  80. package/dist/core/events.js +39 -0
  81. package/dist/core/events.js.map +1 -0
  82. package/dist/core/index.d.ts +37 -0
  83. package/dist/core/index.d.ts.map +1 -0
  84. package/dist/core/index.js +31 -0
  85. package/dist/core/index.js.map +1 -0
  86. package/dist/core/ink.d.ts +165 -0
  87. package/dist/core/ink.d.ts.map +1 -0
  88. package/dist/core/ink.js +445 -0
  89. package/dist/core/ink.js.map +1 -0
  90. package/dist/core/orchestrator.d.ts +387 -0
  91. package/dist/core/orchestrator.d.ts.map +1 -0
  92. package/dist/core/orchestrator.js +1015 -0
  93. package/dist/core/orchestrator.js.map +1 -0
  94. package/dist/core/question-detector.d.ts +19 -0
  95. package/dist/core/question-detector.d.ts.map +1 -0
  96. package/dist/core/question-detector.js +29 -0
  97. package/dist/core/question-detector.js.map +1 -0
  98. package/dist/core/runner.d.ts +14 -0
  99. package/dist/core/runner.d.ts.map +1 -0
  100. package/dist/core/runner.js +299 -0
  101. package/dist/core/runner.js.map +1 -0
  102. package/dist/core/session-reader.d.ts +46 -0
  103. package/dist/core/session-reader.d.ts.map +1 -0
  104. package/dist/core/session-reader.js +166 -0
  105. package/dist/core/session-reader.js.map +1 -0
  106. package/dist/index.d.ts +24 -0
  107. package/dist/index.d.ts.map +1 -0
  108. package/dist/index.js +29 -0
  109. package/dist/index.js.map +1 -0
  110. package/dist/llm/index.d.ts +8 -0
  111. package/dist/llm/index.d.ts.map +1 -0
  112. package/dist/llm/index.js +21 -0
  113. package/dist/llm/index.js.map +1 -0
  114. package/dist/llm/pi-client.d.ts +8 -0
  115. package/dist/llm/pi-client.d.ts.map +1 -0
  116. package/dist/llm/pi-client.js +8 -0
  117. package/dist/llm/pi-client.js.map +1 -0
  118. package/dist/llm/prompts.d.ts +14 -0
  119. package/dist/llm/prompts.d.ts.map +1 -0
  120. package/dist/llm/prompts.js +1618 -0
  121. package/dist/llm/prompts.js.map +1 -0
  122. package/dist/llm/retry.d.ts +5 -0
  123. package/dist/llm/retry.d.ts.map +1 -0
  124. package/dist/llm/retry.js +5 -0
  125. package/dist/llm/retry.js.map +1 -0
  126. package/dist/llm/skills.d.ts +265 -0
  127. package/dist/llm/skills.d.ts.map +1 -0
  128. package/dist/llm/skills.js +804 -0
  129. package/dist/llm/skills.js.map +1 -0
  130. package/dist/quality/index.d.ts +3 -0
  131. package/dist/quality/index.d.ts.map +1 -0
  132. package/dist/quality/index.js +3 -0
  133. package/dist/quality/index.js.map +1 -0
  134. package/dist/quality/quality-controller.d.ts +2 -0
  135. package/dist/quality/quality-controller.d.ts.map +1 -0
  136. package/dist/quality/quality-controller.js +2 -0
  137. package/dist/quality/quality-controller.js.map +1 -0
  138. package/dist/quality/sla-monitor.d.ts +2 -0
  139. package/dist/quality/sla-monitor.d.ts.map +1 -0
  140. package/dist/quality/sla-monitor.js +2 -0
  141. package/dist/quality/sla-monitor.js.map +1 -0
  142. package/dist/scheduling/cron.d.ts +2 -0
  143. package/dist/scheduling/cron.d.ts.map +1 -0
  144. package/dist/scheduling/cron.js +2 -0
  145. package/dist/scheduling/cron.js.map +1 -0
  146. package/dist/scheduling/index.d.ts +3 -0
  147. package/dist/scheduling/index.d.ts.map +1 -0
  148. package/dist/scheduling/index.js +3 -0
  149. package/dist/scheduling/index.js.map +1 -0
  150. package/dist/scheduling/scheduler.d.ts +2 -0
  151. package/dist/scheduling/scheduler.d.ts.map +1 -0
  152. package/dist/scheduling/scheduler.js +2 -0
  153. package/dist/scheduling/scheduler.js.map +1 -0
  154. package/dist/server/app.d.ts +19 -0
  155. package/dist/server/app.d.ts.map +1 -0
  156. package/dist/server/app.js +302 -0
  157. package/dist/server/app.js.map +1 -0
  158. package/dist/server/deps.d.ts +157 -0
  159. package/dist/server/deps.d.ts.map +1 -0
  160. package/dist/server/deps.js +9 -0
  161. package/dist/server/deps.js.map +1 -0
  162. package/dist/server/index.d.ts +43 -0
  163. package/dist/server/index.d.ts.map +1 -0
  164. package/dist/server/index.js +128 -0
  165. package/dist/server/index.js.map +1 -0
  166. package/dist/server/middleware/auth.d.ts +3 -0
  167. package/dist/server/middleware/auth.d.ts.map +1 -0
  168. package/dist/server/middleware/auth.js +35 -0
  169. package/dist/server/middleware/auth.js.map +1 -0
  170. package/dist/server/middleware/error.d.ts +15 -0
  171. package/dist/server/middleware/error.d.ts.map +1 -0
  172. package/dist/server/middleware/error.js +44 -0
  173. package/dist/server/middleware/error.js.map +1 -0
  174. package/dist/server/middleware/rate-limit.d.ts +16 -0
  175. package/dist/server/middleware/rate-limit.d.ts.map +1 -0
  176. package/dist/server/middleware/rate-limit.js +51 -0
  177. package/dist/server/middleware/rate-limit.js.map +1 -0
  178. package/dist/server/routes/config.d.ts +25 -0
  179. package/dist/server/routes/config.d.ts.map +1 -0
  180. package/dist/server/routes/config.js +446 -0
  181. package/dist/server/routes/config.js.map +1 -0
  182. package/dist/server/routes/files.d.ts +11 -0
  183. package/dist/server/routes/files.d.ts.map +1 -0
  184. package/dist/server/routes/files.js +514 -0
  185. package/dist/server/routes/files.js.map +1 -0
  186. package/dist/server/routes/filesystem.d.ts +3 -0
  187. package/dist/server/routes/filesystem.d.ts.map +1 -0
  188. package/dist/server/routes/filesystem.js +152 -0
  189. package/dist/server/routes/filesystem.js.map +1 -0
  190. package/dist/server/routes/providers.d.ts +7 -0
  191. package/dist/server/routes/providers.d.ts.map +1 -0
  192. package/dist/server/routes/providers.js +256 -0
  193. package/dist/server/routes/providers.js.map +1 -0
  194. package/dist/server/routes/skills.d.ts +11 -0
  195. package/dist/server/routes/skills.d.ts.map +1 -0
  196. package/dist/server/routes/skills.js +543 -0
  197. package/dist/server/routes/skills.js.map +1 -0
  198. package/dist/server/security.d.ts +34 -0
  199. package/dist/server/security.d.ts.map +1 -0
  200. package/dist/server/security.js +118 -0
  201. package/dist/server/security.js.map +1 -0
  202. package/dist/server/sse-bridge.d.ts +36 -0
  203. package/dist/server/sse-bridge.d.ts.map +1 -0
  204. package/dist/server/sse-bridge.js +110 -0
  205. package/dist/server/sse-bridge.js.map +1 -0
  206. package/dist/server/types.d.ts +69 -0
  207. package/dist/server/types.d.ts.map +1 -0
  208. package/dist/server/types.js +2 -0
  209. package/dist/server/types.js.map +1 -0
  210. package/dist/setup/env-persistence.d.ts +9 -0
  211. package/dist/setup/env-persistence.d.ts.map +1 -0
  212. package/dist/setup/env-persistence.js +42 -0
  213. package/dist/setup/env-persistence.js.map +1 -0
  214. package/dist/setup/index.d.ts +32 -0
  215. package/dist/setup/index.d.ts.map +1 -0
  216. package/dist/setup/index.js +24 -0
  217. package/dist/setup/index.js.map +1 -0
  218. package/dist/setup/models.d.ts +20 -0
  219. package/dist/setup/models.d.ts.map +1 -0
  220. package/dist/setup/models.js +33 -0
  221. package/dist/setup/models.js.map +1 -0
  222. package/dist/setup/providers.d.ts +26 -0
  223. package/dist/setup/providers.d.ts.map +1 -0
  224. package/dist/setup/providers.js +31 -0
  225. package/dist/setup/providers.js.map +1 -0
  226. package/dist/vault/encrypted-store.d.ts +45 -0
  227. package/dist/vault/encrypted-store.d.ts.map +1 -0
  228. package/dist/vault/encrypted-store.js +149 -0
  229. package/dist/vault/encrypted-store.js.map +1 -0
  230. package/dist/vault/index.d.ts +4 -0
  231. package/dist/vault/index.d.ts.map +1 -0
  232. package/dist/vault/index.js +3 -0
  233. package/dist/vault/index.js.map +1 -0
  234. package/dist/vault/resolver.d.ts +8 -0
  235. package/dist/vault/resolver.d.ts.map +1 -0
  236. package/dist/vault/resolver.js +8 -0
  237. package/dist/vault/resolver.js.map +1 -0
  238. package/package.json +76 -0
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Route dependency interfaces.
3
+ *
4
+ * Each route factory accepts a `() => XxxDeps` thunk that is evaluated
5
+ * at request time (after orchestrator init). This decouples routes from
6
+ * the Orchestrator god-object so consumers can wire stores directly.
7
+ */
8
+ import type { TaskStore } from "@polpo-ai/core/task-store";
9
+ import type { RunStore } from "@polpo-ai/core/run-store";
10
+ import type { LogStore } from "@polpo-ai/core/log-store";
11
+ import type { VaultStore } from "@polpo-ai/core/vault-store";
12
+ import type { PlaybookStore } from "@polpo-ai/core/playbook-store";
13
+ import type { SessionStore } from "@polpo-ai/core/session-store";
14
+ export interface VaultRouteDeps {
15
+ vaultStore?: VaultStore;
16
+ }
17
+ export interface ChatRouteDeps {
18
+ sessionStore?: SessionStore;
19
+ }
20
+ export interface TaskRouteDeps {
21
+ taskStore: TaskStore;
22
+ addTask: (...args: any[]) => Promise<any>;
23
+ deleteTask: (...args: any[]) => Promise<any>;
24
+ retryTask: (...args: any[]) => Promise<any>;
25
+ killTask: (...args: any[]) => Promise<any>;
26
+ reassessTask: (...args: any[]) => Promise<any>;
27
+ forceFailTask: (...args: any[]) => Promise<any>;
28
+ updateTaskDescription: (...args: any[]) => Promise<any>;
29
+ updateTaskAssignment: (...args: any[]) => Promise<any>;
30
+ updateTaskExpectations: (...args: any[]) => Promise<any>;
31
+ }
32
+ export interface AgentRouteDeps {
33
+ getAgents: () => Promise<any[]>;
34
+ addAgent: (...args: any[]) => Promise<any>;
35
+ removeAgent: (...args: any[]) => Promise<any>;
36
+ updateAgent: (...args: any[]) => Promise<any>;
37
+ getTeams: () => Promise<any[]>;
38
+ getTeam: (name?: string) => Promise<any>;
39
+ addTeam: (...args: any[]) => Promise<any>;
40
+ removeTeam: (...args: any[]) => Promise<any>;
41
+ renameTeam: (oldName: string, newName: string) => Promise<any>;
42
+ getStore: () => TaskStore;
43
+ getRunStore: () => RunStore;
44
+ getPolpoDir: () => string;
45
+ }
46
+ export interface MissionRouteDeps {
47
+ getAllMissions: () => Promise<any[]>;
48
+ getResumableMissions: () => Promise<any[]>;
49
+ getMission: (missionId: string) => Promise<any>;
50
+ saveMission: (...args: any[]) => Promise<any>;
51
+ updateMission: (missionId: string, updates: any) => Promise<any>;
52
+ deleteMission: (missionId: string) => Promise<any>;
53
+ executeMission: (missionId: string) => Promise<any>;
54
+ resumeMission: (missionId: string, opts?: any) => Promise<any>;
55
+ abortGroup: (groupName: string) => Promise<any>;
56
+ getActiveCheckpoints: () => any[];
57
+ resumeCheckpointByMissionId: (missionId: string, checkpointName: string) => Promise<any>;
58
+ getActiveDelays: () => any[];
59
+ addMissionTask: (missionId: string, task: any) => Promise<any>;
60
+ updateMissionTask: (missionId: string, taskTitle: string, updates: any) => Promise<any>;
61
+ removeMissionTask: (missionId: string, taskTitle: string) => Promise<any>;
62
+ reorderMissionTasks: (missionId: string, titles: string[]) => Promise<any>;
63
+ addMissionCheckpoint: (missionId: string, checkpoint: any) => Promise<any>;
64
+ updateMissionCheckpoint: (missionId: string, checkpointName: string, updates: any) => Promise<any>;
65
+ removeMissionCheckpoint: (missionId: string, checkpointName: string) => Promise<any>;
66
+ addMissionDelay: (missionId: string, delay: any) => Promise<any>;
67
+ updateMissionDelay: (missionId: string, delayName: string, updates: any) => Promise<any>;
68
+ removeMissionDelay: (missionId: string, delayName: string) => Promise<any>;
69
+ addMissionQualityGate: (missionId: string, gate: any) => Promise<any>;
70
+ updateMissionQualityGate: (missionId: string, gateName: string, updates: any) => Promise<any>;
71
+ removeMissionQualityGate: (missionId: string, gateName: string) => Promise<any>;
72
+ addMissionTeamMember: (missionId: string, member: any) => Promise<any>;
73
+ updateMissionTeamMember: (missionId: string, memberName: string, updates: any) => Promise<any>;
74
+ removeMissionTeamMember: (missionId: string, memberName: string) => Promise<any>;
75
+ updateMissionNotifications: (missionId: string, notifications: any) => Promise<any>;
76
+ }
77
+ export interface PlaybookRouteDeps {
78
+ playbookStore: PlaybookStore;
79
+ saveMission: (...args: any[]) => Promise<any>;
80
+ executeMission: (missionId: string) => Promise<any>;
81
+ }
82
+ export interface ApprovalRouteDeps {
83
+ getAllApprovals: (status?: string) => Promise<any[]>;
84
+ getApprovalRequest: (id: string) => Promise<any>;
85
+ approveRequest: (id: string, resolvedBy?: string, note?: string) => Promise<any>;
86
+ rejectRequest: (id: string, feedback: string, resolvedBy?: string) => Promise<any>;
87
+ canRejectRequest: (id: string) => Promise<{
88
+ allowed: boolean;
89
+ rejectionCount?: number;
90
+ maxRejections?: number;
91
+ }>;
92
+ getPendingApprovals: () => Promise<any[]>;
93
+ }
94
+ export interface NotificationRouterLike {
95
+ getStore: () => any;
96
+ sendDirect: (opts: any) => Promise<any>;
97
+ getRules: () => any[];
98
+ addRule: (rule: any) => void;
99
+ removeRule: (ruleId: string) => boolean;
100
+ getChannelIds: () => string[];
101
+ testChannels: () => Promise<Record<string, boolean>>;
102
+ }
103
+ export interface SchedulerLike {
104
+ getAllSchedules: () => any[];
105
+ getScheduleByMissionId: (missionId: string) => any;
106
+ registerMission: (mission: any) => any;
107
+ unregisterMission: (missionId: string) => boolean;
108
+ }
109
+ export interface ScheduleRouteDeps {
110
+ getScheduler: () => SchedulerLike | undefined;
111
+ getMission: (missionId: string) => Promise<any>;
112
+ updateMission: (missionId: string, updates: any) => Promise<any>;
113
+ }
114
+ export interface WatcherManagerLike {
115
+ getAll: () => any[];
116
+ getActive: () => any[];
117
+ create: (opts: any) => any;
118
+ remove: (watcherId: string) => boolean;
119
+ }
120
+ export interface WatcherRouteDeps {
121
+ getWatcherManager: () => WatcherManagerLike | undefined;
122
+ taskStore: TaskStore;
123
+ }
124
+ export interface StateRouteDeps {
125
+ taskStore: TaskStore;
126
+ getConfig: () => any;
127
+ hasMemory: () => Promise<boolean>;
128
+ getMemory: () => Promise<any>;
129
+ saveMemory: (content: any) => Promise<void>;
130
+ hasAgentMemory: (agentName: string) => Promise<boolean>;
131
+ getAgentMemory: (agentName: string) => Promise<any>;
132
+ saveAgentMemory: (agentName: string, content: any) => Promise<void>;
133
+ getLogStore: () => LogStore | undefined;
134
+ }
135
+ export interface SkillRouteDeps {
136
+ getPolpoDir: () => string;
137
+ getWorkDir: () => string;
138
+ getAgents: () => Promise<any[]>;
139
+ }
140
+ export interface ConfigRouteDeps {
141
+ getConfig: () => any;
142
+ reloadConfig: () => Promise<boolean>;
143
+ getPolpoDir: () => string;
144
+ getNotificationRouter: () => NotificationRouterLike | undefined;
145
+ loadPolpoConfig: (polpoDir: string) => any;
146
+ savePolpoConfig: (polpoDir: string, config: any) => void;
147
+ }
148
+ export interface AuthRouteDeps {
149
+ getConfig: () => any;
150
+ }
151
+ export interface FileRouteDeps {
152
+ getPolpoDir: () => string;
153
+ getWorkDir: () => string;
154
+ getAgentWorkDir: () => string;
155
+ emit: (event: string, data: any) => void;
156
+ }
157
+ //# sourceMappingURL=deps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../../src/server/deps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Route dependency interfaces.
3
+ *
4
+ * Each route factory accepts a `() => XxxDeps` thunk that is evaluated
5
+ * at request time (after orchestrator init). This decouples routes from
6
+ * the Orchestrator god-object so consumers can wire stores directly.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=deps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deps.js","sourceRoot":"","sources":["../../src/server/deps.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,43 @@
1
+ import { Orchestrator } from "../core/orchestrator.js";
2
+ import type { ServerConfig } from "./types.js";
3
+ /**
4
+ * Polpo HTTP Server.
5
+ *
6
+ * Single-orchestrator architecture. Manages one Polpo instance via HTTP API + SSE streaming.
7
+ *
8
+ * Usage:
9
+ * const server = new PolpoServer({
10
+ * port: 3890,
11
+ * host: "0.0.0.0",
12
+ * workDir: "./my-project",
13
+ * autoStart: true,
14
+ * });
15
+ * await server.start();
16
+ */
17
+ export declare class PolpoServer {
18
+ private config;
19
+ private orchestrator;
20
+ private sseBridge;
21
+ private server;
22
+ private shutdownHandlers;
23
+ constructor(config: ServerConfig);
24
+ /** Initialize the orchestrator (called at start or after setup completes). */
25
+ private initOrchestrator;
26
+ /** Called by the initialize endpoint to transition from uninitialized → ready. */
27
+ completeSetup(workDir: string): Promise<void>;
28
+ /** Start the server: init orchestrator if config exists, bind HTTP. */
29
+ start(): Promise<void>;
30
+ /** Graceful shutdown: stop orchestrator, close HTTP server. */
31
+ stop(): Promise<void>;
32
+ /** Get the orchestrator (for programmatic access). */
33
+ getOrchestrator(): Orchestrator;
34
+ }
35
+ export { createApp } from "./app.js";
36
+ export type { AppOptions } from "./app.js";
37
+ export { SSEBridge } from "./sse-bridge.js";
38
+ export type { ServerConfig, ApiResponse, ApiError, SSEEvent, CreateTaskRequest, UpdateTaskRequest, CreateMissionRequest, UpdateMissionRequest, AddAgentRequest, } from "./types.js";
39
+ export { taskRoutes, missionRoutes, chatRoutes, approvalRoutes, playbookRoutes, stateRoutes, completionRoutes, scheduleRoutes, watcherRoutes, vaultRoutes, healthRoutes, agentRoutes, eventRoutes, configRoutes, } from "@polpo-ai/server";
40
+ export { skillRoutes } from "./routes/skills.js";
41
+ export { fileRoutes } from "./routes/files.js";
42
+ export { publicConfigRoutes } from "./routes/config.js";
43
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;;;;;;;;;GAaG;AACH,qBAAa,WAAW;IAMV,OAAO,CAAC,MAAM;IAL1B,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,MAAM,CAAyC;IACvD,OAAO,CAAC,gBAAgB,CAAsB;gBAE1B,MAAM,EAAE,YAAY;IAExC,8EAA8E;YAChE,gBAAgB;IAiB9B,kFAAkF;IAC5E,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKnD,uEAAuE;IACjE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2D5B,+DAA+D;IACzD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAW3B,sDAAsD;IACtD,eAAe,IAAI,YAAY;CAGhC;AAGD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EACV,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,GAChB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EACrD,cAAc,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAC7D,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,GACjF,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,128 @@
1
+ import { existsSync } from "node:fs";
2
+ import { resolve, basename, join } from "node:path";
3
+ import { getPolpoDir } from "../core/constants.js";
4
+ import { serve } from "@hono/node-server";
5
+ import { createApp } from "./app.js";
6
+ import { Orchestrator } from "../core/orchestrator.js";
7
+ import { SSEBridge } from "./sse-bridge.js";
8
+ /**
9
+ * Polpo HTTP Server.
10
+ *
11
+ * Single-orchestrator architecture. Manages one Polpo instance via HTTP API + SSE streaming.
12
+ *
13
+ * Usage:
14
+ * const server = new PolpoServer({
15
+ * port: 3890,
16
+ * host: "0.0.0.0",
17
+ * workDir: "./my-project",
18
+ * autoStart: true,
19
+ * });
20
+ * await server.start();
21
+ */
22
+ export class PolpoServer {
23
+ config;
24
+ orchestrator;
25
+ sseBridge;
26
+ server = null;
27
+ shutdownHandlers = [];
28
+ constructor(config) {
29
+ this.config = config;
30
+ }
31
+ /** Initialize the orchestrator (called at start or after setup completes). */
32
+ async initOrchestrator(overrideWorkDir) {
33
+ const workDir = resolve(overrideWorkDir ?? this.config.workDir);
34
+ const defaultTeam = {
35
+ name: "default",
36
+ agents: [{ name: "dev-1", role: "developer" }],
37
+ };
38
+ await this.orchestrator.initInteractive(basename(workDir), defaultTeam);
39
+ // (Re-)create SSE bridge
40
+ this.sseBridge?.dispose();
41
+ this.sseBridge = new SSEBridge(this.orchestrator);
42
+ this.sseBridge.start();
43
+ console.log("\n Orchestrator initialized — dashboard is ready.\n");
44
+ }
45
+ /** Called by the initialize endpoint to transition from uninitialized → ready. */
46
+ async completeSetup(workDir) {
47
+ this.orchestrator.resetWorkDir(workDir);
48
+ await this.initOrchestrator(workDir);
49
+ }
50
+ /** Start the server: init orchestrator if config exists, bind HTTP. */
51
+ async start() {
52
+ const workDir = resolve(this.config.workDir);
53
+ this.orchestrator = new Orchestrator(workDir);
54
+ const configPath = join(getPolpoDir(workDir), "polpo.json");
55
+ const hasConfig = existsSync(configPath);
56
+ if (hasConfig) {
57
+ await this.initOrchestrator();
58
+ if (this.config.autoStart !== false) {
59
+ this.orchestrator.run().catch((err) => {
60
+ console.error(`[PolpoServer] Supervisor loop crashed:`, err instanceof Error ? err.message : err);
61
+ });
62
+ }
63
+ }
64
+ else {
65
+ // No config yet — placeholder SSE bridge, orchestrator will be initialized after setup
66
+ this.sseBridge = new SSEBridge(this.orchestrator);
67
+ }
68
+ const app = createApp(this.orchestrator, this.sseBridge, {
69
+ apiKeys: this.config.apiKeys,
70
+ corsOrigins: this.config.corsOrigins,
71
+ workDir,
72
+ onInitialize: (workDir) => this.completeSetup(workDir),
73
+ });
74
+ this.server = serve({
75
+ fetch: app.fetch,
76
+ port: this.config.port,
77
+ hostname: this.config.host,
78
+ });
79
+ // Disable Node 18+ requestTimeout (default 5 min). This is a wall-clock
80
+ // timer — NOT idle-based — so it kills long-running streaming responses
81
+ // (e.g. multi-turn tool loops in chat completions) even when data is
82
+ // actively flowing. Setting to 0 disables it entirely.
83
+ // See: https://nodejs.org/api/http.html#serverrequesttimeout
84
+ if ("requestTimeout" in this.server) {
85
+ this.server.requestTimeout = 0;
86
+ }
87
+ const base = `http://${this.config.host}:${this.config.port}`;
88
+ console.log(`\n Listening ${base}`);
89
+ console.log(` WorkDir ${workDir}`);
90
+ console.log(` API ${base}/api/v1/health`);
91
+ console.log();
92
+ // Signal handlers for graceful shutdown
93
+ const onSignal = () => { this.stop(); };
94
+ process.on("SIGTERM", onSignal);
95
+ process.on("SIGINT", onSignal);
96
+ this.shutdownHandlers.push(() => {
97
+ process.off("SIGTERM", onSignal);
98
+ process.off("SIGINT", onSignal);
99
+ });
100
+ }
101
+ /** Graceful shutdown: stop orchestrator, close HTTP server. */
102
+ async stop() {
103
+ console.log("\nShutting down Polpo Server...");
104
+ this.sseBridge?.dispose();
105
+ if (this.orchestrator?.isInitialized) {
106
+ await this.orchestrator.gracefulStop();
107
+ }
108
+ this.server?.close();
109
+ for (const fn of this.shutdownHandlers)
110
+ fn();
111
+ console.log("Polpo Server stopped.");
112
+ }
113
+ /** Get the orchestrator (for programmatic access). */
114
+ getOrchestrator() {
115
+ return this.orchestrator;
116
+ }
117
+ }
118
+ // Re-exports
119
+ export { createApp } from "./app.js";
120
+ export { SSEBridge } from "./sse-bridge.js";
121
+ // Route factories — shared routes re-exported from @polpo-ai/server
122
+ export { taskRoutes, missionRoutes, chatRoutes, approvalRoutes, playbookRoutes, stateRoutes, completionRoutes, scheduleRoutes, watcherRoutes, vaultRoutes, healthRoutes, agentRoutes, eventRoutes, configRoutes, } from "@polpo-ai/server";
123
+ // eventRoutes now in @polpo-ai/server (decoupled with EventBridge interface)
124
+ export { skillRoutes } from "./routes/skills.js";
125
+ export { fileRoutes } from "./routes/files.js";
126
+ // configRoutes now in @polpo-ai/server (decoupled with saveConfig dep)
127
+ export { publicConfigRoutes } from "./routes/config.js";
128
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { MiddlewareHandler } from "hono";
2
+ export declare function authMiddleware(apiKeys: string[]): MiddlewareHandler;
3
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/server/middleware/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAoB9C,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAoBnE"}
@@ -0,0 +1,35 @@
1
+ import { timingSafeEqual } from "node:crypto";
2
+ /**
3
+ * Constant-time string comparison to prevent timing attacks.
4
+ */
5
+ function safeCompare(a, b) {
6
+ if (a.length !== b.length)
7
+ return false;
8
+ return timingSafeEqual(Buffer.from(a), Buffer.from(b));
9
+ }
10
+ /**
11
+ * API key authentication middleware.
12
+ * Checks X-API-Key header against configured keys.
13
+ * If no keys configured, skips auth (local dev mode) with a one-time warning.
14
+ *
15
+ * NOTE: API key via query string (?apiKey=) has been removed to prevent
16
+ * credential leakage in server logs, browser history, and referrer headers.
17
+ */
18
+ let warnedNoKeys = false;
19
+ export function authMiddleware(apiKeys) {
20
+ return async (c, next) => {
21
+ if (apiKeys.length === 0) {
22
+ if (!warnedNoKeys) {
23
+ warnedNoKeys = true;
24
+ console.warn("[polpo] WARNING: No API keys configured — all requests are unauthenticated. Set apiKeys in polpo.json or POLPO_API_KEY env var.");
25
+ }
26
+ return next();
27
+ }
28
+ const key = c.req.header("x-api-key");
29
+ if (!key || !apiKeys.some(k => safeCompare(k, key))) {
30
+ return c.json({ ok: false, error: "API key required", code: "AUTH_REQUIRED" }, 401);
31
+ }
32
+ return next();
33
+ };
34
+ }
35
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/server/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C;;GAEG;AACH,SAAS,WAAW,CAAC,CAAS,EAAE,CAAS;IACvC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;;;;;;GAOG;AACH,IAAI,YAAY,GAAG,KAAK,CAAC;AAEzB,MAAM,UAAU,cAAc,CAAC,OAAiB;IAC9C,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,YAAY,GAAG,IAAI,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC,iIAAiI,CAAC,CAAC;YAClJ,CAAC;YACD,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;YACpD,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,eAAe,EAAE,EAC/D,GAAG,CACJ,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { MiddlewareHandler } from "hono";
2
+ /**
3
+ * Known error class for API errors with specific HTTP status codes.
4
+ */
5
+ export declare class ApiHttpError extends Error {
6
+ code: string;
7
+ status: number;
8
+ constructor(message: string, code: string, status?: number);
9
+ }
10
+ /**
11
+ * Global error handling middleware.
12
+ * Catches thrown errors and maps to ApiError responses.
13
+ */
14
+ export declare function errorMiddleware(): MiddlewareHandler;
15
+ //# sourceMappingURL=error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../src/server/middleware/error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAE9C;;GAEG;AACH,qBAAa,YAAa,SAAQ,KAAK;IAG5B,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,MAAM;gBAFrB,OAAO,EAAE,MAAM,EACR,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,MAAY;CAK9B;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,iBAAiB,CA4CnD"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Known error class for API errors with specific HTTP status codes.
3
+ */
4
+ export class ApiHttpError extends Error {
5
+ code;
6
+ status;
7
+ constructor(message, code, status = 400) {
8
+ super(message);
9
+ this.code = code;
10
+ this.status = status;
11
+ this.name = "ApiHttpError";
12
+ }
13
+ }
14
+ /**
15
+ * Global error handling middleware.
16
+ * Catches thrown errors and maps to ApiError responses.
17
+ */
18
+ export function errorMiddleware() {
19
+ return async (c, next) => {
20
+ try {
21
+ await next();
22
+ }
23
+ catch (err) {
24
+ if (err instanceof ApiHttpError) {
25
+ return c.json({ ok: false, error: err.message, code: err.code }, err.status);
26
+ }
27
+ const message = err instanceof Error ? err.message : String(err);
28
+ // Map known error patterns to status codes
29
+ if (message.includes("not found") || message.includes("Not found")) {
30
+ return c.json({ ok: false, error: message, code: "NOT_FOUND" }, 404);
31
+ }
32
+ if (message.includes("Cannot") && (message.includes("state") || message.includes("status"))) {
33
+ return c.json({ ok: false, error: message, code: "INVALID_STATE" }, 409);
34
+ }
35
+ if (message.includes("already exists") || message.includes("already active")) {
36
+ return c.json({ ok: false, error: message, code: "CONFLICT" }, 409);
37
+ }
38
+ // Never leak internal error details to clients
39
+ console.error("[polpo] Internal server error:", message);
40
+ return c.json({ ok: false, error: "Internal server error", code: "INTERNAL_ERROR" }, 500);
41
+ }
42
+ };
43
+ }
44
+ //# sourceMappingURL=error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../../../src/server/middleware/error.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,KAAK;IAG5B;IACA;IAHT,YACE,OAAe,EACR,IAAY,EACZ,SAAiB,GAAG;QAE3B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,SAAI,GAAJ,IAAI,CAAQ;QACZ,WAAM,GAAN,MAAM,CAAc;QAG3B,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,MAAM,IAAI,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAI,GAAG,YAAY,YAAY,EAAE,CAAC;gBAChC,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EACjD,GAAG,CAAC,MAAa,CAClB,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAEjE,2CAA2C;YAC3C,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBACnE,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,EAChD,GAAG,CACJ,CAAC;YACJ,CAAC;YAED,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBAC5F,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,EACpD,GAAG,CACJ,CAAC;YACJ,CAAC;YAED,IAAI,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAC7E,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAC/C,GAAG,CACJ,CAAC;YACJ,CAAC;YAED,+CAA+C;YAC/C,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,OAAO,CAAC,CAAC;YACzD,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,gBAAgB,EAAE,EACrE,GAAG,CACJ,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * In-memory sliding-window rate limiter middleware.
3
+ *
4
+ * Tracks requests per IP using x-forwarded-for header (or "unknown").
5
+ * Returns 429 Too Many Requests with Retry-After header when limit exceeded.
6
+ * Expired entries are cleaned up periodically.
7
+ */
8
+ import type { MiddlewareHandler } from "hono";
9
+ /**
10
+ * Rate limiting middleware.
11
+ *
12
+ * @param maxReqs - Maximum requests per window (default: 200)
13
+ * @param windowMs - Window duration in ms (default: 60000)
14
+ */
15
+ export declare function rateLimitMiddleware(maxReqs?: number, windowMs?: number): MiddlewareHandler;
16
+ //# sourceMappingURL=rate-limit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../../src/server/middleware/rate-limit.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAW9C;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,MAAyB,EAClC,QAAQ,GAAE,MAA0B,GACnC,iBAAiB,CAwCnB"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * In-memory sliding-window rate limiter middleware.
3
+ *
4
+ * Tracks requests per IP using x-forwarded-for header (or "unknown").
5
+ * Returns 429 Too Many Requests with Retry-After header when limit exceeded.
6
+ * Expired entries are cleaned up periodically.
7
+ */
8
+ const DEFAULT_MAX_REQS = 200;
9
+ const DEFAULT_WINDOW_MS = 60_000; // 1 minute
10
+ const CLEANUP_INTERVAL_MS = 60_000; // 1 minute
11
+ /**
12
+ * Rate limiting middleware.
13
+ *
14
+ * @param maxReqs - Maximum requests per window (default: 200)
15
+ * @param windowMs - Window duration in ms (default: 60000)
16
+ */
17
+ export function rateLimitMiddleware(maxReqs = DEFAULT_MAX_REQS, windowMs = DEFAULT_WINDOW_MS) {
18
+ const windows = new Map();
19
+ // Periodic cleanup of expired entries
20
+ const cleanup = setInterval(() => {
21
+ const now = Date.now();
22
+ for (const [ip, entry] of windows) {
23
+ if (now - entry.windowStart > windowMs) {
24
+ windows.delete(ip);
25
+ }
26
+ }
27
+ }, CLEANUP_INTERVAL_MS);
28
+ // Don't keep the process alive just for cleanup
29
+ if (cleanup.unref)
30
+ cleanup.unref();
31
+ return async (c, next) => {
32
+ const ip = c.req.header("x-forwarded-for")?.split(",")[0]?.trim() || "unknown";
33
+ const now = Date.now();
34
+ let entry = windows.get(ip);
35
+ if (!entry || now - entry.windowStart > windowMs) {
36
+ // New window
37
+ entry = { count: 1, windowStart: now };
38
+ windows.set(ip, entry);
39
+ }
40
+ else {
41
+ entry.count++;
42
+ }
43
+ if (entry.count > maxReqs) {
44
+ const retryAfter = Math.ceil((entry.windowStart + windowMs - now) / 1000);
45
+ c.header("Retry-After", String(retryAfter));
46
+ return c.json({ ok: false, error: "Too many requests", code: "RATE_LIMITED" }, 429);
47
+ }
48
+ return next();
49
+ };
50
+ }
51
+ //# sourceMappingURL=rate-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../../src/server/middleware/rate-limit.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,iBAAiB,GAAG,MAAM,CAAC,CAAC,WAAW;AAC7C,MAAM,mBAAmB,GAAG,MAAM,CAAC,CAAC,WAAW;AAE/C;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,UAAkB,gBAAgB,EAClC,WAAmB,iBAAiB;IAEpC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE/C,sCAAsC;IACtC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;YAClC,IAAI,GAAG,GAAG,KAAK,CAAC,WAAW,GAAG,QAAQ,EAAE,CAAC;gBACvC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC,EAAE,mBAAmB,CAAC,CAAC;IAExB,gDAAgD;IAChD,IAAI,OAAO,CAAC,KAAK;QAAE,OAAO,CAAC,KAAK,EAAE,CAAC;IAEnC,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;QAC/E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,IAAI,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,CAAC,KAAK,IAAI,GAAG,GAAG,KAAK,CAAC,WAAW,GAAG,QAAQ,EAAE,CAAC;YACjD,aAAa;YACb,KAAK,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,GAAG,OAAO,EAAE,CAAC;YAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,WAAW,GAAG,QAAQ,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;YAC1E,CAAC,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;YAC5C,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,IAAI,EAAE,cAAc,EAAE,EAC/D,GAAU,CACX,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { OpenAPIHono } from "@hono/zod-openapi";
2
+ import type { Orchestrator } from "../../core/orchestrator.js";
3
+ /**
4
+ * Config management routes (requires orchestrator).
5
+ * GET /config — return current config (redacted)
6
+ * POST /config/reload — trigger a runtime config reload
7
+ * PATCH /config/settings — partially update settings (persists + reloads)
8
+ * GET /config/channels — list notification channels
9
+ * PUT /config/channels/:n — create or update a channel
10
+ * DELETE /config/channels/:n — delete a channel
11
+ * POST /config/channels/:n/test — test a channel
12
+ */
13
+ export declare function configRoutes(getDeps: () => {
14
+ getConfig: () => any;
15
+ reloadConfig: () => Promise<boolean>;
16
+ getPolpoDir: () => string;
17
+ getNotificationRouter: () => any;
18
+ }): OpenAPIHono;
19
+ /**
20
+ * Public config routes — no auth required.
21
+ * GET /config/status — check if Polpo is configured/initialized
22
+ * POST /config/initialize — save config and init the orchestrator
23
+ */
24
+ export declare function publicConfigRoutes(orchestrator: Orchestrator, workDir: string, onInitialize?: (workDir: string) => Promise<void>): OpenAPIHono;
25
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/server/routes/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAKhE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAiQ/D;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM;IAC1C,SAAS,EAAE,MAAM,GAAG,CAAC;IACrB,YAAY,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,WAAW,EAAE,MAAM,MAAM,CAAC;IAC1B,qBAAqB,EAAE,MAAM,GAAG,CAAC;CAClC,GAAG,WAAW,CA6Gd;AAID;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAChD,WAAW,CA2Fb"}