@polpo-ai/server 0.2.2

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 (73) hide show
  1. package/dist/deps.d.ts +164 -0
  2. package/dist/deps.d.ts.map +1 -0
  3. package/dist/deps.js +9 -0
  4. package/dist/deps.js.map +1 -0
  5. package/dist/errors.d.ts +7 -0
  6. package/dist/errors.d.ts.map +1 -0
  7. package/dist/errors.js +12 -0
  8. package/dist/errors.js.map +1 -0
  9. package/dist/index.d.ts +25 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +25 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/playbook-utils.d.ts +36 -0
  14. package/dist/playbook-utils.d.ts.map +1 -0
  15. package/dist/playbook-utils.js +80 -0
  16. package/dist/playbook-utils.js.map +1 -0
  17. package/dist/routes/approvals.d.ts +17 -0
  18. package/dist/routes/approvals.d.ts.map +1 -0
  19. package/dist/routes/approvals.js +201 -0
  20. package/dist/routes/approvals.js.map +1 -0
  21. package/dist/routes/chat.d.ts +9 -0
  22. package/dist/routes/chat.d.ts.map +1 -0
  23. package/dist/routes/chat.js +170 -0
  24. package/dist/routes/chat.js.map +1 -0
  25. package/dist/routes/health.d.ts +7 -0
  26. package/dist/routes/health.d.ts.map +1 -0
  27. package/dist/routes/health.js +44 -0
  28. package/dist/routes/health.js.map +1 -0
  29. package/dist/routes/missions.d.ts +36 -0
  30. package/dist/routes/missions.d.ts.map +1 -0
  31. package/dist/routes/missions.js +636 -0
  32. package/dist/routes/missions.js.map +1 -0
  33. package/dist/routes/notifications.d.ts +8 -0
  34. package/dist/routes/notifications.d.ts.map +1 -0
  35. package/dist/routes/notifications.js +240 -0
  36. package/dist/routes/notifications.js.map +1 -0
  37. package/dist/routes/peers.d.ts +16 -0
  38. package/dist/routes/peers.d.ts.map +1 -0
  39. package/dist/routes/peers.js +183 -0
  40. package/dist/routes/peers.js.map +1 -0
  41. package/dist/routes/playbooks.d.ts +12 -0
  42. package/dist/routes/playbooks.d.ts.map +1 -0
  43. package/dist/routes/playbooks.js +223 -0
  44. package/dist/routes/playbooks.js.map +1 -0
  45. package/dist/routes/schedules.d.ts +7 -0
  46. package/dist/routes/schedules.d.ts.map +1 -0
  47. package/dist/routes/schedules.js +193 -0
  48. package/dist/routes/schedules.js.map +1 -0
  49. package/dist/routes/state.d.ts +16 -0
  50. package/dist/routes/state.d.ts.map +1 -0
  51. package/dist/routes/state.js +196 -0
  52. package/dist/routes/state.js.map +1 -0
  53. package/dist/routes/tasks.d.ts +17 -0
  54. package/dist/routes/tasks.d.ts.map +1 -0
  55. package/dist/routes/tasks.js +379 -0
  56. package/dist/routes/tasks.js.map +1 -0
  57. package/dist/routes/vault.d.ts +14 -0
  58. package/dist/routes/vault.d.ts.map +1 -0
  59. package/dist/routes/vault.js +237 -0
  60. package/dist/routes/vault.js.map +1 -0
  61. package/dist/routes/watchers.d.ts +6 -0
  62. package/dist/routes/watchers.d.ts.map +1 -0
  63. package/dist/routes/watchers.js +119 -0
  64. package/dist/routes/watchers.js.map +1 -0
  65. package/dist/schemas.d.ts +406 -0
  66. package/dist/schemas.d.ts.map +1 -0
  67. package/dist/schemas.js +314 -0
  68. package/dist/schemas.js.map +1 -0
  69. package/dist/security.d.ts +33 -0
  70. package/dist/security.d.ts.map +1 -0
  71. package/dist/security.js +66 -0
  72. package/dist/security.js.map +1 -0
  73. package/package.json +46 -0
package/dist/deps.d.ts ADDED
@@ -0,0 +1,164 @@
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 the cloud 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
+ import type { PeerStore } from "@polpo-ai/core/peer-store";
15
+ export interface VaultRouteDeps {
16
+ vaultStore?: VaultStore;
17
+ }
18
+ export interface ChatRouteDeps {
19
+ sessionStore?: SessionStore;
20
+ }
21
+ export interface PeerRouteDeps {
22
+ peerStore?: PeerStore;
23
+ }
24
+ export interface TaskRouteDeps {
25
+ taskStore: TaskStore;
26
+ addTask: (...args: any[]) => Promise<any>;
27
+ deleteTask: (...args: any[]) => Promise<any>;
28
+ retryTask: (...args: any[]) => Promise<any>;
29
+ killTask: (...args: any[]) => Promise<any>;
30
+ reassessTask: (...args: any[]) => Promise<any>;
31
+ forceFailTask: (...args: any[]) => Promise<any>;
32
+ updateTaskDescription: (...args: any[]) => Promise<any>;
33
+ updateTaskAssignment: (...args: any[]) => Promise<any>;
34
+ updateTaskExpectations: (...args: any[]) => Promise<any>;
35
+ }
36
+ export interface AgentRouteDeps {
37
+ getAgents: () => Promise<any[]>;
38
+ addAgent: (...args: any[]) => Promise<any>;
39
+ removeAgent: (...args: any[]) => Promise<any>;
40
+ updateAgent: (...args: any[]) => Promise<any>;
41
+ getTeams: () => Promise<any[]>;
42
+ getTeam: (name?: string) => Promise<any>;
43
+ addTeam: (...args: any[]) => Promise<any>;
44
+ removeTeam: (...args: any[]) => Promise<any>;
45
+ renameTeam: (oldName: string, newName: string) => Promise<any>;
46
+ getStore: () => TaskStore;
47
+ getRunStore: () => RunStore;
48
+ getPolpoDir: () => string;
49
+ }
50
+ export interface MissionRouteDeps {
51
+ getAllMissions: () => Promise<any[]>;
52
+ getResumableMissions: () => Promise<any[]>;
53
+ getMission: (missionId: string) => Promise<any>;
54
+ saveMission: (...args: any[]) => Promise<any>;
55
+ updateMission: (missionId: string, updates: any) => Promise<any>;
56
+ deleteMission: (missionId: string) => Promise<any>;
57
+ executeMission: (missionId: string) => Promise<any>;
58
+ resumeMission: (missionId: string, opts?: any) => Promise<any>;
59
+ abortGroup: (groupName: string) => Promise<any>;
60
+ getActiveCheckpoints: () => any[];
61
+ resumeCheckpointByMissionId: (missionId: string, checkpointName: string) => Promise<any>;
62
+ getActiveDelays: () => any[];
63
+ addMissionTask: (missionId: string, task: any) => Promise<any>;
64
+ updateMissionTask: (missionId: string, taskTitle: string, updates: any) => Promise<any>;
65
+ removeMissionTask: (missionId: string, taskTitle: string) => Promise<any>;
66
+ reorderMissionTasks: (missionId: string, titles: string[]) => Promise<any>;
67
+ addMissionCheckpoint: (missionId: string, checkpoint: any) => Promise<any>;
68
+ updateMissionCheckpoint: (missionId: string, checkpointName: string, updates: any) => Promise<any>;
69
+ removeMissionCheckpoint: (missionId: string, checkpointName: string) => Promise<any>;
70
+ addMissionDelay: (missionId: string, delay: any) => Promise<any>;
71
+ updateMissionDelay: (missionId: string, delayName: string, updates: any) => Promise<any>;
72
+ removeMissionDelay: (missionId: string, delayName: string) => Promise<any>;
73
+ addMissionQualityGate: (missionId: string, gate: any) => Promise<any>;
74
+ updateMissionQualityGate: (missionId: string, gateName: string, updates: any) => Promise<any>;
75
+ removeMissionQualityGate: (missionId: string, gateName: string) => Promise<any>;
76
+ addMissionTeamMember: (missionId: string, member: any) => Promise<any>;
77
+ updateMissionTeamMember: (missionId: string, memberName: string, updates: any) => Promise<any>;
78
+ removeMissionTeamMember: (missionId: string, memberName: string) => Promise<any>;
79
+ updateMissionNotifications: (missionId: string, notifications: any) => Promise<any>;
80
+ }
81
+ export interface PlaybookRouteDeps {
82
+ playbookStore: PlaybookStore;
83
+ saveMission: (...args: any[]) => Promise<any>;
84
+ executeMission: (missionId: string) => Promise<any>;
85
+ }
86
+ export interface ApprovalRouteDeps {
87
+ getAllApprovals: (status?: string) => Promise<any[]>;
88
+ getApprovalRequest: (id: string) => Promise<any>;
89
+ approveRequest: (id: string, resolvedBy?: string, note?: string) => Promise<any>;
90
+ rejectRequest: (id: string, feedback: string, resolvedBy?: string) => Promise<any>;
91
+ canRejectRequest: (id: string) => Promise<{
92
+ allowed: boolean;
93
+ rejectionCount?: number;
94
+ maxRejections?: number;
95
+ }>;
96
+ getPendingApprovals: () => Promise<any[]>;
97
+ }
98
+ export interface NotificationRouterLike {
99
+ getStore: () => any;
100
+ sendDirect: (opts: any) => Promise<any>;
101
+ getRules: () => any[];
102
+ addRule: (rule: any) => void;
103
+ removeRule: (ruleId: string) => boolean;
104
+ getChannelIds: () => string[];
105
+ testChannels: () => Promise<Record<string, boolean>>;
106
+ }
107
+ export interface NotificationRouteDeps {
108
+ getNotificationRouter: () => NotificationRouterLike | undefined;
109
+ }
110
+ export interface SchedulerLike {
111
+ getAllSchedules: () => any[];
112
+ getScheduleByMissionId: (missionId: string) => any;
113
+ registerMission: (mission: any) => any;
114
+ unregisterMission: (missionId: string) => boolean;
115
+ }
116
+ export interface ScheduleRouteDeps {
117
+ getScheduler: () => SchedulerLike | undefined;
118
+ getMission: (missionId: string) => Promise<any>;
119
+ updateMission: (missionId: string, updates: any) => Promise<any>;
120
+ }
121
+ export interface WatcherManagerLike {
122
+ getAll: () => any[];
123
+ getActive: () => any[];
124
+ create: (opts: any) => any;
125
+ remove: (watcherId: string) => boolean;
126
+ }
127
+ export interface WatcherRouteDeps {
128
+ getWatcherManager: () => WatcherManagerLike | undefined;
129
+ taskStore: TaskStore;
130
+ }
131
+ export interface StateRouteDeps {
132
+ taskStore: TaskStore;
133
+ getConfig: () => any;
134
+ hasMemory: () => Promise<boolean>;
135
+ getMemory: () => Promise<any>;
136
+ saveMemory: (content: any) => Promise<void>;
137
+ hasAgentMemory: (agentName: string) => Promise<boolean>;
138
+ getAgentMemory: (agentName: string) => Promise<any>;
139
+ saveAgentMemory: (agentName: string, content: any) => Promise<void>;
140
+ getLogStore: () => LogStore | undefined;
141
+ }
142
+ export interface SkillRouteDeps {
143
+ getPolpoDir: () => string;
144
+ getWorkDir: () => string;
145
+ getAgents: () => Promise<any[]>;
146
+ }
147
+ export interface ConfigRouteDeps {
148
+ getConfig: () => any;
149
+ reloadConfig: () => Promise<boolean>;
150
+ getPolpoDir: () => string;
151
+ getNotificationRouter: () => NotificationRouterLike | undefined;
152
+ loadPolpoConfig: (polpoDir: string) => any;
153
+ savePolpoConfig: (polpoDir: string, config: any) => void;
154
+ }
155
+ export interface AuthRouteDeps {
156
+ getConfig: () => any;
157
+ }
158
+ export interface FileRouteDeps {
159
+ getPolpoDir: () => string;
160
+ getWorkDir: () => string;
161
+ getAgentWorkDir: () => string;
162
+ emit: (event: string, data: any) => void;
163
+ }
164
+ //# sourceMappingURL=deps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../src/deps.ts"],"names":[],"mappings":"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"}
package/dist/deps.js ADDED
@@ -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 the cloud can wire stores directly.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=deps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deps.js","sourceRoot":"","sources":["../src/deps.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,7 @@
1
+ /** Typed HTTP error for API responses. */
2
+ export declare class ApiHttpError extends Error {
3
+ code: string;
4
+ status: number;
5
+ constructor(message: string, code: string, status?: number);
6
+ }
7
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,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"}
package/dist/errors.js ADDED
@@ -0,0 +1,12 @@
1
+ /** Typed HTTP error for API responses. */
2
+ export class ApiHttpError extends Error {
3
+ code;
4
+ status;
5
+ constructor(message, code, status = 400) {
6
+ super(message);
7
+ this.code = code;
8
+ this.status = status;
9
+ this.name = "ApiHttpError";
10
+ }
11
+ }
12
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @polpo-ai/server — Edge-compatible Hono route factories.
3
+ *
4
+ * These route factories accept dependency thunks and return OpenAPIHono apps.
5
+ * They work on any runtime: Node.js, Cloudflare Workers, Deno, Bun.
6
+ *
7
+ * For routes that require Node.js (completions, files, agents avatar),
8
+ * import from "polpo-ai" instead.
9
+ */
10
+ export { taskRoutes } from "./routes/tasks.js";
11
+ export { missionRoutes } from "./routes/missions.js";
12
+ export { playbookRoutes } from "./routes/playbooks.js";
13
+ export { approvalRoutes } from "./routes/approvals.js";
14
+ export { chatRoutes } from "./routes/chat.js";
15
+ export { vaultRoutes } from "./routes/vault.js";
16
+ export { peerRoutes } from "./routes/peers.js";
17
+ export { notificationRoutes } from "./routes/notifications.js";
18
+ export { scheduleRoutes } from "./routes/schedules.js";
19
+ export { watcherRoutes } from "./routes/watchers.js";
20
+ export { stateRoutes } from "./routes/state.js";
21
+ export { healthRoutes } from "./routes/health.js";
22
+ export type { TaskRouteDeps, MissionRouteDeps, PlaybookRouteDeps, ApprovalRouteDeps, ChatRouteDeps, VaultRouteDeps, PeerRouteDeps, NotificationRouteDeps, ScheduleRouteDeps, WatcherRouteDeps, StateRouteDeps, ConfigRouteDeps, AuthRouteDeps, FileRouteDeps, SkillRouteDeps, AgentRouteDeps, } from "./deps.js";
23
+ export { validateParams, instantiatePlaybook } from "./playbook-utils.js";
24
+ export type { PlaybookParameter, PlaybookDefinition, ValidationResult } from "./playbook-utils.js";
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,aAAa,EACb,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,aAAa,EACb,aAAa,EACb,cAAc,EACd,cAAc,GACf,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1E,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @polpo-ai/server — Edge-compatible Hono route factories.
3
+ *
4
+ * These route factories accept dependency thunks and return OpenAPIHono apps.
5
+ * They work on any runtime: Node.js, Cloudflare Workers, Deno, Bun.
6
+ *
7
+ * For routes that require Node.js (completions, files, agents avatar),
8
+ * import from "polpo-ai" instead.
9
+ */
10
+ // Route factories
11
+ export { taskRoutes } from "./routes/tasks.js";
12
+ export { missionRoutes } from "./routes/missions.js";
13
+ export { playbookRoutes } from "./routes/playbooks.js";
14
+ export { approvalRoutes } from "./routes/approvals.js";
15
+ export { chatRoutes } from "./routes/chat.js";
16
+ export { vaultRoutes } from "./routes/vault.js";
17
+ export { peerRoutes } from "./routes/peers.js";
18
+ export { notificationRoutes } from "./routes/notifications.js";
19
+ export { scheduleRoutes } from "./routes/schedules.js";
20
+ export { watcherRoutes } from "./routes/watchers.js";
21
+ export { stateRoutes } from "./routes/state.js";
22
+ export { healthRoutes } from "./routes/health.js";
23
+ // Playbook utilities (pure logic, edge-compatible)
24
+ export { validateParams, instantiatePlaybook } from "./playbook-utils.js";
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,kBAAkB;AAClB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAsBlD,mDAAmD;AACnD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Playbook validation and instantiation utilities.
3
+ * Pure logic — no Node.js deps, edge-compatible.
4
+ *
5
+ * Extracted from src/core/playbook.ts (which has node:fs for file-based loading).
6
+ */
7
+ export interface PlaybookParameter {
8
+ name: string;
9
+ description: string;
10
+ type?: "string" | "number" | "boolean";
11
+ required?: boolean;
12
+ default?: string | number | boolean;
13
+ enum?: (string | number)[];
14
+ }
15
+ export interface PlaybookDefinition {
16
+ name: string;
17
+ description: string;
18
+ mission: Record<string, unknown>;
19
+ parameters?: PlaybookParameter[];
20
+ version?: string;
21
+ author?: string;
22
+ tags?: string[];
23
+ }
24
+ export interface ValidationResult {
25
+ valid: boolean;
26
+ errors: string[];
27
+ warnings: string[];
28
+ resolved: Record<string, string | number | boolean>;
29
+ }
30
+ export declare function validateParams(playbook: PlaybookDefinition, params: Record<string, string | number | boolean>): ValidationResult;
31
+ export declare function instantiatePlaybook(playbook: PlaybookDefinition, resolved: Record<string, string | number | boolean>): {
32
+ name: string;
33
+ data: string;
34
+ prompt: string;
35
+ };
36
+ //# sourceMappingURL=playbook-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playbook-utils.d.ts","sourceRoot":"","sources":["../src/playbook-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACpC,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;CACrD;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAChD,gBAAgB,CAwClB;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAClD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAehD"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Playbook validation and instantiation utilities.
3
+ * Pure logic — no Node.js deps, edge-compatible.
4
+ *
5
+ * Extracted from src/core/playbook.ts (which has node:fs for file-based loading).
6
+ */
7
+ export function validateParams(playbook, params) {
8
+ const errors = [];
9
+ const warnings = [];
10
+ const resolved = {};
11
+ const defs = playbook.parameters ?? [];
12
+ for (const def of defs) {
13
+ const value = params[def.name];
14
+ if (value === undefined || value === "") {
15
+ if (def.default !== undefined) {
16
+ resolved[def.name] = def.default;
17
+ }
18
+ else if (def.required) {
19
+ errors.push(`Missing required parameter: ${def.name}`);
20
+ }
21
+ continue;
22
+ }
23
+ const expectedType = def.type ?? "string";
24
+ if (expectedType === "number") {
25
+ const num = Number(value);
26
+ if (isNaN(num)) {
27
+ errors.push(`Parameter "${def.name}" must be a number, got: ${value}`);
28
+ continue;
29
+ }
30
+ resolved[def.name] = num;
31
+ }
32
+ else if (expectedType === "boolean") {
33
+ if (typeof value === "boolean") {
34
+ resolved[def.name] = value;
35
+ }
36
+ else {
37
+ const str = String(value).toLowerCase();
38
+ if (str === "true" || str === "1" || str === "yes")
39
+ resolved[def.name] = true;
40
+ else if (str === "false" || str === "0" || str === "no")
41
+ resolved[def.name] = false;
42
+ else {
43
+ errors.push(`Parameter "${def.name}" must be a boolean, got: ${value}`);
44
+ continue;
45
+ }
46
+ }
47
+ }
48
+ else {
49
+ resolved[def.name] = String(value);
50
+ }
51
+ if (def.enum && def.enum.length > 0 && !def.enum.includes(resolved[def.name])) {
52
+ errors.push(`Parameter "${def.name}" must be one of: ${def.enum.join(", ")}. Got: ${resolved[def.name]}`);
53
+ }
54
+ }
55
+ for (const key of Object.keys(params)) {
56
+ if (!defs.some(d => d.name === key))
57
+ warnings.push(`Unknown parameter: ${key}`);
58
+ }
59
+ return { valid: errors.length === 0, errors, warnings, resolved };
60
+ }
61
+ export function instantiatePlaybook(playbook, resolved) {
62
+ let json = JSON.stringify(playbook.mission);
63
+ for (const [key, value] of Object.entries(resolved)) {
64
+ json = json.split(`{{${key}}}`).join(String(value));
65
+ }
66
+ const unreplaced = json.match(/\{\{([^}]+)\}\}/g);
67
+ if (unreplaced) {
68
+ const names = [...new Set(unreplaced.map(m => m.slice(2, -2)))];
69
+ throw new Error(`Unreplaced placeholders in playbook "${playbook.name}": ${names.join(", ")}`);
70
+ }
71
+ try {
72
+ JSON.parse(json);
73
+ }
74
+ catch (err) {
75
+ throw new Error(`Playbook "${playbook.name}" produced invalid JSON: ${err instanceof Error ? err.message : String(err)}`);
76
+ }
77
+ const paramDesc = Object.entries(resolved).map(([k, v]) => `${k}=${v}`).join(", ");
78
+ return { name: playbook.name, data: json, prompt: `playbook:${playbook.name}${paramDesc ? ` (${paramDesc})` : ""}` };
79
+ }
80
+ //# sourceMappingURL=playbook-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playbook-utils.js","sourceRoot":"","sources":["../src/playbook-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { OpenAPIHono } from "@hono/zod-openapi";
2
+ /**
3
+ * Approval routes.
4
+ *
5
+ * GET /approvals — list approvals (optional ?status=pending|approved|rejected|timeout)
6
+ * GET /approvals/:id — get single approval request
7
+ * POST /approvals/:id/approve — approve a pending request
8
+ * POST /approvals/:id/reject — reject with feedback (task retries with notes)
9
+ */
10
+ export declare function approvalRoutes(getDeps: () => {
11
+ getAllApprovals: (status?: string) => Promise<any[]>;
12
+ getApprovalRequest: (id: string) => Promise<any>;
13
+ approveRequest: (id: string, resolvedBy?: string, note?: string) => Promise<any>;
14
+ rejectRequest: (id: string, feedback: string, resolvedBy?: string) => Promise<any>;
15
+ canRejectRequest: (id: string) => Promise<any>;
16
+ }): OpenAPIHono;
17
+ //# sourceMappingURL=approvals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approvals.d.ts","sourceRoot":"","sources":["../../src/routes/approvals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAuGhE;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM;IAC5C,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,GAAG,CAAC,CAAC;CAChD,GAAG,WAAW,CA2Gd"}
@@ -0,0 +1,201 @@
1
+ import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi";
2
+ import { ApproveRequestSchema, RejectRequestSchema } from "../schemas.js";
3
+ /* ── Route definitions ─────────────────────────────────────────────── */
4
+ const listApprovalsRoute = createRoute({
5
+ method: "get",
6
+ path: "/",
7
+ tags: ["Approvals"],
8
+ summary: "List approval requests",
9
+ request: {
10
+ query: z.object({
11
+ status: z.string().optional(),
12
+ taskId: z.string().optional(),
13
+ }),
14
+ },
15
+ responses: {
16
+ 200: {
17
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), data: z.any() }) } },
18
+ description: "Approval list",
19
+ },
20
+ },
21
+ });
22
+ const getApprovalRoute = createRoute({
23
+ method: "get",
24
+ path: "/{id}",
25
+ tags: ["Approvals"],
26
+ summary: "Get approval",
27
+ request: {
28
+ params: z.object({ id: z.string() }),
29
+ },
30
+ responses: {
31
+ 200: {
32
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), data: z.any() }) } },
33
+ description: "Approval details",
34
+ },
35
+ 404: {
36
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), error: z.string(), code: z.string() }) } },
37
+ description: "Approval not found",
38
+ },
39
+ },
40
+ });
41
+ const approveRoute = createRoute({
42
+ method: "post",
43
+ path: "/{id}/approve",
44
+ tags: ["Approvals"],
45
+ summary: "Approve request",
46
+ request: {
47
+ params: z.object({ id: z.string() }),
48
+ body: {
49
+ content: { "application/json": { schema: ApproveRequestSchema } },
50
+ required: false,
51
+ },
52
+ },
53
+ responses: {
54
+ 200: {
55
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), data: z.any() }) } },
56
+ description: "Approval result",
57
+ },
58
+ 404: {
59
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), error: z.string(), code: z.string() }) } },
60
+ description: "Approval not found",
61
+ },
62
+ 409: {
63
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), error: z.string(), code: z.string() }) } },
64
+ description: "Already resolved",
65
+ },
66
+ },
67
+ });
68
+ const rejectRoute = createRoute({
69
+ method: "post",
70
+ path: "/{id}/reject",
71
+ tags: ["Approvals"],
72
+ summary: "Reject with feedback",
73
+ request: {
74
+ params: z.object({ id: z.string() }),
75
+ body: { content: { "application/json": { schema: RejectRequestSchema } } },
76
+ },
77
+ responses: {
78
+ 200: {
79
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), data: z.any() }) } },
80
+ description: "Rejection result",
81
+ },
82
+ 400: {
83
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), error: z.string(), code: z.string() }) } },
84
+ description: "Bad request",
85
+ },
86
+ 404: {
87
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), error: z.string(), code: z.string() }) } },
88
+ description: "Approval not found",
89
+ },
90
+ 409: {
91
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), error: z.string(), code: z.string() }) } },
92
+ description: "Already resolved or max rejections reached",
93
+ },
94
+ },
95
+ });
96
+ /* ── Handlers ──────────────────────────────────────────────────────── */
97
+ /**
98
+ * Approval routes.
99
+ *
100
+ * GET /approvals — list approvals (optional ?status=pending|approved|rejected|timeout)
101
+ * GET /approvals/:id — get single approval request
102
+ * POST /approvals/:id/approve — approve a pending request
103
+ * POST /approvals/:id/reject — reject with feedback (task retries with notes)
104
+ */
105
+ export function approvalRoutes(getDeps) {
106
+ const app = new OpenAPIHono();
107
+ // GET /approvals — list all approval requests
108
+ app.openapi(listApprovalsRoute, async (c) => {
109
+ const deps = getDeps();
110
+ const query = c.req.valid("query");
111
+ const status = query.status;
112
+ const taskId = query.taskId;
113
+ let data;
114
+ if (taskId) {
115
+ // Filter by task — getAllApprovals doesn't support taskId filter,
116
+ // so we get all and filter manually
117
+ const all = await deps.getAllApprovals(status);
118
+ data = all.filter(r => r.taskId === taskId);
119
+ }
120
+ else {
121
+ data = await deps.getAllApprovals(status);
122
+ }
123
+ return c.json({ ok: true, data });
124
+ });
125
+ // GET /approvals/:id — get single approval request
126
+ app.openapi(getApprovalRoute, async (c) => {
127
+ const deps = getDeps();
128
+ const { id } = c.req.valid("param");
129
+ const request = await deps.getApprovalRequest(id);
130
+ if (!request) {
131
+ return c.json({ ok: false, error: "Approval request not found", code: "NOT_FOUND" }, 404);
132
+ }
133
+ return c.json({ ok: true, data: request }, 200);
134
+ });
135
+ // POST /approvals/:id/approve — approve a pending request
136
+ app.openapi(approveRoute, async (c) => {
137
+ const deps = getDeps();
138
+ const { id } = c.req.valid("param");
139
+ // Body is optional — approve can work with no payload
140
+ let resolvedBy;
141
+ let note;
142
+ try {
143
+ const body = c.req.valid("json");
144
+ resolvedBy = body.resolvedBy;
145
+ note = body.note;
146
+ }
147
+ catch {
148
+ // Empty body or parse error — that's fine, use defaults
149
+ }
150
+ const result = await deps.approveRequest(id, resolvedBy, note);
151
+ if (!result) {
152
+ // Could be not found or already resolved
153
+ const existing = await deps.getApprovalRequest(id);
154
+ if (!existing) {
155
+ return c.json({ ok: false, error: "Approval request not found", code: "NOT_FOUND" }, 404);
156
+ }
157
+ return c.json({
158
+ ok: false,
159
+ error: `Request already resolved with status: ${existing.status}`,
160
+ code: "CONFLICT",
161
+ }, 409);
162
+ }
163
+ return c.json({ ok: true, data: result }, 200);
164
+ });
165
+ // POST /approvals/:id/reject — reject with feedback, task retries with notes
166
+ app.openapi(rejectRoute, async (c) => {
167
+ const deps = getDeps();
168
+ const { id } = c.req.valid("param");
169
+ const body = c.req.valid("json");
170
+ if (!body.feedback) {
171
+ return c.json({ ok: false, error: "feedback is required for rejection", code: "BAD_REQUEST" }, 400);
172
+ }
173
+ // Check if rejection is allowed (max rejections)
174
+ const check = await deps.canRejectRequest(id);
175
+ if (!check.allowed) {
176
+ const existing = await deps.getApprovalRequest(id);
177
+ if (!existing) {
178
+ return c.json({ ok: false, error: "Approval request not found", code: "NOT_FOUND" }, 404);
179
+ }
180
+ if (existing.status !== "pending") {
181
+ return c.json({
182
+ ok: false,
183
+ error: `Request already resolved with status: ${existing.status}`,
184
+ code: "CONFLICT",
185
+ }, 409);
186
+ }
187
+ return c.json({
188
+ ok: false,
189
+ error: `Max rejections reached (${check.rejectionCount}/${check.maxRejections}). Only approve is available.`,
190
+ code: "CONFLICT",
191
+ }, 409);
192
+ }
193
+ const result = await deps.rejectRequest(id, body.feedback, body.resolvedBy);
194
+ if (!result) {
195
+ return c.json({ ok: false, error: "Failed to reject request", code: "CONFLICT" }, 409);
196
+ }
197
+ return c.json({ ok: true, data: result }, 200);
198
+ });
199
+ return app;
200
+ }
201
+ //# sourceMappingURL=approvals.js.map