@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.
- package/LICENSE +13 -0
- package/dist/adapters/engine.d.ts +51 -0
- package/dist/adapters/engine.d.ts.map +1 -0
- package/dist/adapters/engine.js +316 -0
- package/dist/adapters/engine.js.map +1 -0
- package/dist/adapters/index.d.ts +2 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +4 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/loop-engine.d.ts +36 -0
- package/dist/adapters/loop-engine.d.ts.map +1 -0
- package/dist/adapters/loop-engine.js +534 -0
- package/dist/adapters/loop-engine.js.map +1 -0
- package/dist/adapters/node-filesystem.d.ts +22 -0
- package/dist/adapters/node-filesystem.d.ts.map +1 -0
- package/dist/adapters/node-filesystem.js +59 -0
- package/dist/adapters/node-filesystem.js.map +1 -0
- package/dist/adapters/node-shell.d.ts +5 -0
- package/dist/adapters/node-shell.d.ts.map +1 -0
- package/dist/adapters/node-shell.js +34 -0
- package/dist/adapters/node-shell.js.map +1 -0
- package/dist/adapters/node-spawner.d.ts +14 -0
- package/dist/adapters/node-spawner.d.ts.map +1 -0
- package/dist/adapters/node-spawner.js +103 -0
- package/dist/adapters/node-spawner.js.map +1 -0
- package/dist/assessment/assessor.d.ts +6 -0
- package/dist/assessment/assessor.d.ts.map +1 -0
- package/dist/assessment/assessor.js +37 -0
- package/dist/assessment/assessor.js.map +1 -0
- package/dist/assessment/index.d.ts +6 -0
- package/dist/assessment/index.d.ts.map +1 -0
- package/dist/assessment/index.js +6 -0
- package/dist/assessment/index.js.map +1 -0
- package/dist/assessment/llm-review.d.ts +34 -0
- package/dist/assessment/llm-review.d.ts.map +1 -0
- package/dist/assessment/llm-review.js +669 -0
- package/dist/assessment/llm-review.js.map +1 -0
- package/dist/assessment/schemas.d.ts +5 -0
- package/dist/assessment/schemas.d.ts.map +1 -0
- package/dist/assessment/schemas.js +5 -0
- package/dist/assessment/schemas.js.map +1 -0
- package/dist/assessment/scoring.d.ts +5 -0
- package/dist/assessment/scoring.d.ts.map +1 -0
- package/dist/assessment/scoring.js +5 -0
- package/dist/assessment/scoring.js.map +1 -0
- package/dist/assessment/transcript-parser.d.ts +31 -0
- package/dist/assessment/transcript-parser.d.ts.map +1 -0
- package/dist/assessment/transcript-parser.js +203 -0
- package/dist/assessment/transcript-parser.js.map +1 -0
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +4 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/core/adapter.d.ts +62 -0
- package/dist/core/adapter.d.ts.map +1 -0
- package/dist/core/adapter.js +2 -0
- package/dist/core/adapter.js.map +1 -0
- package/dist/core/assessment-orchestrator.d.ts +18 -0
- package/dist/core/assessment-orchestrator.d.ts.map +1 -0
- package/dist/core/assessment-orchestrator.js +93 -0
- package/dist/core/assessment-orchestrator.js.map +1 -0
- package/dist/core/config.d.ts +17 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +272 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/constants.d.ts +10 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +11 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/deadlock-resolver.d.ts +35 -0
- package/dist/core/deadlock-resolver.d.ts.map +1 -0
- package/dist/core/deadlock-resolver.js +317 -0
- package/dist/core/deadlock-resolver.js.map +1 -0
- package/dist/core/drizzle-sqlite-schema.d.ts +8 -0
- package/dist/core/drizzle-sqlite-schema.d.ts.map +1 -0
- package/dist/core/drizzle-sqlite-schema.js +250 -0
- package/dist/core/drizzle-sqlite-schema.js.map +1 -0
- package/dist/core/events.d.ts +26 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +39 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/index.d.ts +37 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +31 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/ink.d.ts +165 -0
- package/dist/core/ink.d.ts.map +1 -0
- package/dist/core/ink.js +445 -0
- package/dist/core/ink.js.map +1 -0
- package/dist/core/orchestrator.d.ts +387 -0
- package/dist/core/orchestrator.d.ts.map +1 -0
- package/dist/core/orchestrator.js +1015 -0
- package/dist/core/orchestrator.js.map +1 -0
- package/dist/core/question-detector.d.ts +19 -0
- package/dist/core/question-detector.d.ts.map +1 -0
- package/dist/core/question-detector.js +29 -0
- package/dist/core/question-detector.js.map +1 -0
- package/dist/core/runner.d.ts +14 -0
- package/dist/core/runner.d.ts.map +1 -0
- package/dist/core/runner.js +299 -0
- package/dist/core/runner.js.map +1 -0
- package/dist/core/session-reader.d.ts +46 -0
- package/dist/core/session-reader.d.ts.map +1 -0
- package/dist/core/session-reader.js +166 -0
- package/dist/core/session-reader.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/index.d.ts +8 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +21 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/pi-client.d.ts +8 -0
- package/dist/llm/pi-client.d.ts.map +1 -0
- package/dist/llm/pi-client.js +8 -0
- package/dist/llm/pi-client.js.map +1 -0
- package/dist/llm/prompts.d.ts +14 -0
- package/dist/llm/prompts.d.ts.map +1 -0
- package/dist/llm/prompts.js +1618 -0
- package/dist/llm/prompts.js.map +1 -0
- package/dist/llm/retry.d.ts +5 -0
- package/dist/llm/retry.d.ts.map +1 -0
- package/dist/llm/retry.js +5 -0
- package/dist/llm/retry.js.map +1 -0
- package/dist/llm/skills.d.ts +265 -0
- package/dist/llm/skills.d.ts.map +1 -0
- package/dist/llm/skills.js +804 -0
- package/dist/llm/skills.js.map +1 -0
- package/dist/quality/index.d.ts +3 -0
- package/dist/quality/index.d.ts.map +1 -0
- package/dist/quality/index.js +3 -0
- package/dist/quality/index.js.map +1 -0
- package/dist/quality/quality-controller.d.ts +2 -0
- package/dist/quality/quality-controller.d.ts.map +1 -0
- package/dist/quality/quality-controller.js +2 -0
- package/dist/quality/quality-controller.js.map +1 -0
- package/dist/quality/sla-monitor.d.ts +2 -0
- package/dist/quality/sla-monitor.d.ts.map +1 -0
- package/dist/quality/sla-monitor.js +2 -0
- package/dist/quality/sla-monitor.js.map +1 -0
- package/dist/scheduling/cron.d.ts +2 -0
- package/dist/scheduling/cron.d.ts.map +1 -0
- package/dist/scheduling/cron.js +2 -0
- package/dist/scheduling/cron.js.map +1 -0
- package/dist/scheduling/index.d.ts +3 -0
- package/dist/scheduling/index.d.ts.map +1 -0
- package/dist/scheduling/index.js +3 -0
- package/dist/scheduling/index.js.map +1 -0
- package/dist/scheduling/scheduler.d.ts +2 -0
- package/dist/scheduling/scheduler.d.ts.map +1 -0
- package/dist/scheduling/scheduler.js +2 -0
- package/dist/scheduling/scheduler.js.map +1 -0
- package/dist/server/app.d.ts +19 -0
- package/dist/server/app.d.ts.map +1 -0
- package/dist/server/app.js +302 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/deps.d.ts +157 -0
- package/dist/server/deps.d.ts.map +1 -0
- package/dist/server/deps.js +9 -0
- package/dist/server/deps.js.map +1 -0
- package/dist/server/index.d.ts +43 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +128 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/middleware/auth.d.ts +3 -0
- package/dist/server/middleware/auth.d.ts.map +1 -0
- package/dist/server/middleware/auth.js +35 -0
- package/dist/server/middleware/auth.js.map +1 -0
- package/dist/server/middleware/error.d.ts +15 -0
- package/dist/server/middleware/error.d.ts.map +1 -0
- package/dist/server/middleware/error.js +44 -0
- package/dist/server/middleware/error.js.map +1 -0
- package/dist/server/middleware/rate-limit.d.ts +16 -0
- package/dist/server/middleware/rate-limit.d.ts.map +1 -0
- package/dist/server/middleware/rate-limit.js +51 -0
- package/dist/server/middleware/rate-limit.js.map +1 -0
- package/dist/server/routes/config.d.ts +25 -0
- package/dist/server/routes/config.d.ts.map +1 -0
- package/dist/server/routes/config.js +446 -0
- package/dist/server/routes/config.js.map +1 -0
- package/dist/server/routes/files.d.ts +11 -0
- package/dist/server/routes/files.d.ts.map +1 -0
- package/dist/server/routes/files.js +514 -0
- package/dist/server/routes/files.js.map +1 -0
- package/dist/server/routes/filesystem.d.ts +3 -0
- package/dist/server/routes/filesystem.d.ts.map +1 -0
- package/dist/server/routes/filesystem.js +152 -0
- package/dist/server/routes/filesystem.js.map +1 -0
- package/dist/server/routes/providers.d.ts +7 -0
- package/dist/server/routes/providers.d.ts.map +1 -0
- package/dist/server/routes/providers.js +256 -0
- package/dist/server/routes/providers.js.map +1 -0
- package/dist/server/routes/skills.d.ts +11 -0
- package/dist/server/routes/skills.d.ts.map +1 -0
- package/dist/server/routes/skills.js +543 -0
- package/dist/server/routes/skills.js.map +1 -0
- package/dist/server/security.d.ts +34 -0
- package/dist/server/security.d.ts.map +1 -0
- package/dist/server/security.js +118 -0
- package/dist/server/security.js.map +1 -0
- package/dist/server/sse-bridge.d.ts +36 -0
- package/dist/server/sse-bridge.d.ts.map +1 -0
- package/dist/server/sse-bridge.js +110 -0
- package/dist/server/sse-bridge.js.map +1 -0
- package/dist/server/types.d.ts +69 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +2 -0
- package/dist/server/types.js.map +1 -0
- package/dist/setup/env-persistence.d.ts +9 -0
- package/dist/setup/env-persistence.d.ts.map +1 -0
- package/dist/setup/env-persistence.js +42 -0
- package/dist/setup/env-persistence.js.map +1 -0
- package/dist/setup/index.d.ts +32 -0
- package/dist/setup/index.d.ts.map +1 -0
- package/dist/setup/index.js +24 -0
- package/dist/setup/index.js.map +1 -0
- package/dist/setup/models.d.ts +20 -0
- package/dist/setup/models.d.ts.map +1 -0
- package/dist/setup/models.js +33 -0
- package/dist/setup/models.js.map +1 -0
- package/dist/setup/providers.d.ts +26 -0
- package/dist/setup/providers.d.ts.map +1 -0
- package/dist/setup/providers.js +31 -0
- package/dist/setup/providers.js.map +1 -0
- package/dist/vault/encrypted-store.d.ts +45 -0
- package/dist/vault/encrypted-store.d.ts.map +1 -0
- package/dist/vault/encrypted-store.js +149 -0
- package/dist/vault/encrypted-store.js.map +1 -0
- package/dist/vault/index.d.ts +4 -0
- package/dist/vault/index.d.ts.map +1 -0
- package/dist/vault/index.js +3 -0
- package/dist/vault/index.js.map +1 -0
- package/dist/vault/resolver.d.ts +8 -0
- package/dist/vault/resolver.d.ts.map +1 -0
- package/dist/vault/resolver.js +8 -0
- package/dist/vault/resolver.js.map +1 -0
- 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":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAIjE,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAID,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1C,UAAU,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7C,SAAS,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5C,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3C,YAAY,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/C,aAAa,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAChD,qBAAqB,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACxD,oBAAoB,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACvD,sBAAsB,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CAC1D;AAID,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAChC,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3C,WAAW,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9C,WAAW,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9C,QAAQ,EAAE,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/B,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACzC,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1C,UAAU,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7C,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/D,QAAQ,EAAE,MAAM,SAAS,CAAC;IAC1B,WAAW,EAAE,MAAM,QAAQ,CAAC;IAC5B,WAAW,EAAE,MAAM,MAAM,CAAC;CAC3B;AAID,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACrC,oBAAoB,EAAE,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3C,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAChD,WAAW,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9C,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACjE,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACnD,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACpD,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/D,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAChD,oBAAoB,EAAE,MAAM,GAAG,EAAE,CAAC;IAClC,2BAA2B,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACzF,eAAe,EAAE,MAAM,GAAG,EAAE,CAAC;IAC7B,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/D,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACxF,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1E,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3E,oBAAoB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3E,uBAAuB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACnG,uBAAuB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACrF,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACjE,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACzF,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3E,qBAAqB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACtE,wBAAwB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9F,wBAAwB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAChF,oBAAoB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACvE,uBAAuB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/F,uBAAuB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACjF,0BAA0B,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CACrF;AAID,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9C,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CACrD;AAID,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACrD,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACjD,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACjF,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACnF,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjH,mBAAmB,EAAE,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;CAC3C;AAID,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,GAAG,CAAC;IACpB,UAAU,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACxC,QAAQ,EAAE,MAAM,GAAG,EAAE,CAAC;IACtB,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IAC7B,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IACxC,aAAa,EAAE,MAAM,MAAM,EAAE,CAAC;IAC9B,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACtD;AAID,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,MAAM,GAAG,EAAE,CAAC;IAC7B,sBAAsB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,GAAG,CAAC;IACnD,eAAe,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,GAAG,CAAC;IACvC,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;CACnD;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,aAAa,GAAG,SAAS,CAAC;IAC9C,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAChD,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CAClE;AAID,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC;IACvB,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,GAAG,CAAC;IAC3B,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;CACxC;AAED,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,EAAE,MAAM,kBAAkB,GAAG,SAAS,CAAC;IACxD,SAAS,EAAE,SAAS,CAAC;CACtB;AAID,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,CAAC;IACrB,SAAS,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,SAAS,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9B,UAAU,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACpD,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,WAAW,EAAE,MAAM,QAAQ,GAAG,SAAS,CAAC;CACzC;AAID,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;CACjC;AAID,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,GAAG,CAAC;IACrB,YAAY,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,WAAW,EAAE,MAAM,MAAM,CAAC;IAC1B,qBAAqB,EAAE,MAAM,sBAAsB,GAAG,SAAS,CAAC;IAChE,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,CAAC;IAC3C,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;CAC1D;AAID,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,GAAG,CAAC;CACtB;AAID,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,MAAM,CAAC;IAC9B,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;CAC1C"}
|
|
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,WAAW;IAMF;IALZ,YAAY,CAAgB;IAC5B,SAAS,CAAa;IACtB,MAAM,GAAoC,IAAI,CAAC;IAC/C,gBAAgB,GAAmB,EAAE,CAAC;IAE9C,YAAoB,MAAoB;QAApB,WAAM,GAAN,MAAM,CAAc;IAAG,CAAC;IAE5C,8EAA8E;IACtE,KAAK,CAAC,gBAAgB,CAAC,eAAwB;QACrD,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChE,MAAM,WAAW,GAAS;YACxB,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;SAC/C,CAAC;QAEF,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC;QAExE,yBAAyB;QACzB,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAEvB,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IACtE,CAAC;IAED,kFAAkF;IAClF,KAAK,CAAC,aAAa,CAAC,OAAe;QACjC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,uEAAuE;IACvE,KAAK,CAAC,KAAK;QACT,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;QAE9C,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QAEzC,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAE9B,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;gBACpC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBACpC,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACpG,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,CAAC;YACN,uFAAuF;YACvF,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,EAAE;YACvD,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;YAC5B,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACpC,OAAO;YACP,YAAY,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;SAC/D,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YAClB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;SAC3B,CAAC,CAAC;QAEH,wEAAwE;QACxE,wEAAwE;QACxE,qEAAqE;QACrE,uDAAuD;QACvD,6DAA6D;QAC7D,IAAI,gBAAgB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACnC,IAAI,CAAC,MAAqC,CAAC,cAAc,GAAG,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,IAAI,GAAG,UAAU,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAE9D,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,wCAAwC;QACxC,MAAM,QAAQ,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAChC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE;YAC9B,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,+DAA+D;IAC/D,KAAK,CAAC,IAAI;QACR,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;QAC1B,IAAI,IAAI,CAAC,YAAY,EAAE,aAAa,EAAE,CAAC;YACrC,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;QACrB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,gBAAgB;YAAE,EAAE,EAAE,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC;IAED,sDAAsD;IACtD,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,aAAa;AACb,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAa5C,oEAAoE;AACpE,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;AAC1B,6EAA6E;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,uEAAuE;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -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"}
|