@polpo-ai/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/LICENSE +21 -0
  2. package/dist/adapter.d.ts +61 -0
  3. package/dist/adapter.d.ts.map +1 -0
  4. package/dist/adapter.js +9 -0
  5. package/dist/adapter.js.map +1 -0
  6. package/dist/agent-manager.d.ts +36 -0
  7. package/dist/agent-manager.d.ts.map +1 -0
  8. package/dist/agent-manager.js +176 -0
  9. package/dist/agent-manager.js.map +1 -0
  10. package/dist/approval-manager.d.ts +49 -0
  11. package/dist/approval-manager.d.ts.map +1 -0
  12. package/dist/approval-manager.js +325 -0
  13. package/dist/approval-manager.js.map +1 -0
  14. package/dist/approval-store.d.ts +19 -0
  15. package/dist/approval-store.d.ts.map +1 -0
  16. package/dist/approval-store.js +2 -0
  17. package/dist/approval-store.js.map +1 -0
  18. package/dist/checkpoint-store.d.ts +20 -0
  19. package/dist/checkpoint-store.d.ts.map +1 -0
  20. package/dist/checkpoint-store.js +2 -0
  21. package/dist/checkpoint-store.js.map +1 -0
  22. package/dist/config-store.d.ts +13 -0
  23. package/dist/config-store.d.ts.map +1 -0
  24. package/dist/config-store.js +2 -0
  25. package/dist/config-store.js.map +1 -0
  26. package/dist/cron.d.ts +29 -0
  27. package/dist/cron.d.ts.map +1 -0
  28. package/dist/cron.js +105 -0
  29. package/dist/cron.js.map +1 -0
  30. package/dist/delay-store.d.ts +21 -0
  31. package/dist/delay-store.d.ts.map +1 -0
  32. package/dist/delay-store.js +2 -0
  33. package/dist/delay-store.js.map +1 -0
  34. package/dist/escalation-manager.d.ts +31 -0
  35. package/dist/escalation-manager.d.ts.map +1 -0
  36. package/dist/escalation-manager.js +281 -0
  37. package/dist/escalation-manager.js.map +1 -0
  38. package/dist/event-bus.d.ts +18 -0
  39. package/dist/event-bus.d.ts.map +1 -0
  40. package/dist/event-bus.js +2 -0
  41. package/dist/event-bus.js.map +1 -0
  42. package/dist/events.d.ts +377 -0
  43. package/dist/events.d.ts.map +1 -0
  44. package/dist/events.js +9 -0
  45. package/dist/events.js.map +1 -0
  46. package/dist/hooks.d.ts +185 -0
  47. package/dist/hooks.d.ts.map +1 -0
  48. package/dist/hooks.js +152 -0
  49. package/dist/hooks.js.map +1 -0
  50. package/dist/index.d.ts +31 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +22 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/log-store.d.ts +31 -0
  55. package/dist/log-store.d.ts.map +1 -0
  56. package/dist/log-store.js +6 -0
  57. package/dist/log-store.js.map +1 -0
  58. package/dist/memory-store.d.ts +17 -0
  59. package/dist/memory-store.d.ts.map +1 -0
  60. package/dist/memory-store.js +2 -0
  61. package/dist/memory-store.js.map +1 -0
  62. package/dist/notification-router-port.d.ts +11 -0
  63. package/dist/notification-router-port.d.ts.map +1 -0
  64. package/dist/notification-router-port.js +2 -0
  65. package/dist/notification-router-port.js.map +1 -0
  66. package/dist/notification-store.d.ts +58 -0
  67. package/dist/notification-store.d.ts.map +1 -0
  68. package/dist/notification-store.js +9 -0
  69. package/dist/notification-store.js.map +1 -0
  70. package/dist/orchestrator-context.d.ts +87 -0
  71. package/dist/orchestrator-context.d.ts.map +1 -0
  72. package/dist/orchestrator-context.js +2 -0
  73. package/dist/orchestrator-context.js.map +1 -0
  74. package/dist/peer-store.d.ts +29 -0
  75. package/dist/peer-store.d.ts.map +1 -0
  76. package/dist/peer-store.js +6 -0
  77. package/dist/peer-store.js.map +1 -0
  78. package/dist/quality-controller.d.ts +46 -0
  79. package/dist/quality-controller.d.ts.map +1 -0
  80. package/dist/quality-controller.js +373 -0
  81. package/dist/quality-controller.js.map +1 -0
  82. package/dist/run-store.d.ts +31 -0
  83. package/dist/run-store.d.ts.map +1 -0
  84. package/dist/run-store.js +2 -0
  85. package/dist/run-store.js.map +1 -0
  86. package/dist/scheduler.d.ts +35 -0
  87. package/dist/scheduler.d.ts.map +1 -0
  88. package/dist/scheduler.js +195 -0
  89. package/dist/scheduler.js.map +1 -0
  90. package/dist/schemas.d.ts +104 -0
  91. package/dist/schemas.d.ts.map +1 -0
  92. package/dist/schemas.js +200 -0
  93. package/dist/schemas.js.map +1 -0
  94. package/dist/session-store.d.ts +50 -0
  95. package/dist/session-store.d.ts.map +1 -0
  96. package/dist/session-store.js +6 -0
  97. package/dist/session-store.js.map +1 -0
  98. package/dist/sla-monitor.d.ts +30 -0
  99. package/dist/sla-monitor.d.ts.map +1 -0
  100. package/dist/sla-monitor.js +156 -0
  101. package/dist/sla-monitor.js.map +1 -0
  102. package/dist/state-machine.d.ts +8 -0
  103. package/dist/state-machine.d.ts.map +1 -0
  104. package/dist/state-machine.js +23 -0
  105. package/dist/state-machine.js.map +1 -0
  106. package/dist/task-manager.d.ts +38 -0
  107. package/dist/task-manager.d.ts.map +1 -0
  108. package/dist/task-manager.js +308 -0
  109. package/dist/task-manager.js.map +1 -0
  110. package/dist/task-store.d.ts +33 -0
  111. package/dist/task-store.d.ts.map +1 -0
  112. package/dist/task-store.js +2 -0
  113. package/dist/task-store.js.map +1 -0
  114. package/dist/task-watcher.d.ts +38 -0
  115. package/dist/task-watcher.d.ts.map +1 -0
  116. package/dist/task-watcher.js +103 -0
  117. package/dist/task-watcher.js.map +1 -0
  118. package/dist/types.d.ts +1073 -0
  119. package/dist/types.d.ts.map +1 -0
  120. package/dist/types.js +35 -0
  121. package/dist/types.js.map +1 -0
  122. package/package.json +170 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Zod schemas for runtime validation of Polpo types.
3
+ * Central source of truth — used by config parser, orchestrator, and API routes.
4
+ */
5
+ import { z } from "zod";
6
+ import type { TaskExpectation } from "./types.js";
7
+ export declare const taskExpectationSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
8
+ type: z.ZodLiteral<"test">;
9
+ command: z.ZodString;
10
+ }, z.core.$strip>, z.ZodObject<{
11
+ type: z.ZodLiteral<"script">;
12
+ command: z.ZodString;
13
+ }, z.core.$strip>, z.ZodObject<{
14
+ type: z.ZodLiteral<"file_exists">;
15
+ paths: z.ZodArray<z.ZodString>;
16
+ }, z.core.$strip>], "type">;
17
+ /**
18
+ * Parse & validate a single expectation. Returns the validated value or null if invalid.
19
+ */
20
+ export declare function parseExpectation(raw: unknown): TaskExpectation | null;
21
+ /**
22
+ * Sanitize an array of expectations: keep only valid ones, silently drop malformed entries.
23
+ * Returns the filtered array + list of warnings for dropped entries.
24
+ */
25
+ export declare function sanitizeExpectations(raw: unknown[]): {
26
+ valid: TaskExpectation[];
27
+ warnings: string[];
28
+ };
29
+ export declare const missionCheckpointSchema: z.ZodObject<{
30
+ name: z.ZodString;
31
+ afterTasks: z.ZodArray<z.ZodString>;
32
+ blocksTasks: z.ZodArray<z.ZodString>;
33
+ message: z.ZodOptional<z.ZodString>;
34
+ notifyChannels: z.ZodOptional<z.ZodArray<z.ZodString>>;
35
+ }, z.core.$strip>;
36
+ export declare const missionDelaySchema: z.ZodObject<{
37
+ name: z.ZodString;
38
+ afterTasks: z.ZodArray<z.ZodString>;
39
+ blocksTasks: z.ZodArray<z.ZodString>;
40
+ duration: z.ZodString;
41
+ message: z.ZodOptional<z.ZodString>;
42
+ notifyChannels: z.ZodOptional<z.ZodArray<z.ZodString>>;
43
+ }, z.core.$strip>;
44
+ export declare const missionQualityGateSchema: z.ZodObject<{
45
+ name: z.ZodString;
46
+ afterTasks: z.ZodArray<z.ZodString>;
47
+ blocksTasks: z.ZodArray<z.ZodString>;
48
+ minScore: z.ZodOptional<z.ZodNumber>;
49
+ requireAllPassed: z.ZodOptional<z.ZodBoolean>;
50
+ condition: z.ZodOptional<z.ZodString>;
51
+ notifyChannels: z.ZodOptional<z.ZodArray<z.ZodString>>;
52
+ }, z.core.$strip>;
53
+ export declare const missionDocumentSchema: z.ZodObject<{
54
+ tasks: z.ZodArray<z.ZodObject<{
55
+ title: z.ZodString;
56
+ description: z.ZodString;
57
+ assignTo: z.ZodOptional<z.ZodString>;
58
+ dependsOn: z.ZodOptional<z.ZodArray<z.ZodString>>;
59
+ expectations: z.ZodOptional<z.ZodArray<z.ZodAny>>;
60
+ expectedOutcomes: z.ZodOptional<z.ZodArray<z.ZodAny>>;
61
+ metrics: z.ZodOptional<z.ZodArray<z.ZodAny>>;
62
+ maxRetries: z.ZodOptional<z.ZodNumber>;
63
+ maxDuration: z.ZodOptional<z.ZodNumber>;
64
+ retryPolicy: z.ZodOptional<z.ZodObject<{
65
+ escalateAfter: z.ZodOptional<z.ZodNumber>;
66
+ fallbackAgent: z.ZodOptional<z.ZodString>;
67
+ }, z.core.$strip>>;
68
+ notifications: z.ZodOptional<z.ZodAny>;
69
+ sideEffects: z.ZodOptional<z.ZodBoolean>;
70
+ }, z.core.$strip>>;
71
+ team: z.ZodOptional<z.ZodArray<z.ZodAny>>;
72
+ qualityGates: z.ZodOptional<z.ZodArray<z.ZodObject<{
73
+ name: z.ZodString;
74
+ afterTasks: z.ZodArray<z.ZodString>;
75
+ blocksTasks: z.ZodArray<z.ZodString>;
76
+ minScore: z.ZodOptional<z.ZodNumber>;
77
+ requireAllPassed: z.ZodOptional<z.ZodBoolean>;
78
+ condition: z.ZodOptional<z.ZodString>;
79
+ notifyChannels: z.ZodOptional<z.ZodArray<z.ZodString>>;
80
+ }, z.core.$strip>>>;
81
+ checkpoints: z.ZodOptional<z.ZodArray<z.ZodObject<{
82
+ name: z.ZodString;
83
+ afterTasks: z.ZodArray<z.ZodString>;
84
+ blocksTasks: z.ZodArray<z.ZodString>;
85
+ message: z.ZodOptional<z.ZodString>;
86
+ notifyChannels: z.ZodOptional<z.ZodArray<z.ZodString>>;
87
+ }, z.core.$strip>>>;
88
+ delays: z.ZodOptional<z.ZodArray<z.ZodObject<{
89
+ name: z.ZodString;
90
+ afterTasks: z.ZodArray<z.ZodString>;
91
+ blocksTasks: z.ZodArray<z.ZodString>;
92
+ duration: z.ZodString;
93
+ message: z.ZodOptional<z.ZodString>;
94
+ notifyChannels: z.ZodOptional<z.ZodArray<z.ZodString>>;
95
+ }, z.core.$strip>>>;
96
+ notifications: z.ZodOptional<z.ZodAny>;
97
+ }, z.core.$strip>;
98
+ export type MissionDocumentParsed = z.infer<typeof missionDocumentSchema>;
99
+ /**
100
+ * Parse and validate a mission JSON document strictly.
101
+ * Returns the validated document or throws with a clear error message.
102
+ */
103
+ export declare function parseMissionDocument(raw: unknown): MissionDocumentParsed;
104
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,eAAe,EAAyC,MAAM,YAAY,CAAC;AAoCzF,eAAO,MAAM,qBAAqB;;;;;;;;;2BAKhC,CAAC;AAEH;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAUrE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG;IAAE,KAAK,EAAE,eAAe,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAgBrG;AAID,eAAO,MAAM,uBAAuB;;;;;;iBAMlC,CAAC;AAIH,eAAO,MAAM,kBAAkB;;;;;;;iBAO7B,CAAC;AAIH,eAAO,MAAM,wBAAwB;;;;;;;;iBAQnC,CAAC;AAwBH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAuEhC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAE1E;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,qBAAqB,CASxE"}
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Zod schemas for runtime validation of Polpo types.
3
+ * Central source of truth — used by config parser, orchestrator, and API routes.
4
+ */
5
+ import { z } from "zod";
6
+ // ── Expectation Schemas (discriminated union on `type`) ──────────────
7
+ const testExpectation = z.object({
8
+ type: z.literal("test"),
9
+ command: z.string().min(1, "test expectation requires a non-empty command"),
10
+ });
11
+ const scriptExpectation = z.object({
12
+ type: z.literal("script"),
13
+ command: z.string().min(1, "script expectation requires a non-empty command"),
14
+ });
15
+ const fileExistsExpectation = z.object({
16
+ type: z.literal("file_exists"),
17
+ paths: z.array(z.string().min(1)).min(1, "file_exists expectation requires at least one path"),
18
+ });
19
+ const evalDimension = z.object({
20
+ name: z.string().min(1),
21
+ description: z.string().min(1),
22
+ weight: z.number().min(0).max(1),
23
+ rubric: z.record(z.string(), z.string()).optional(),
24
+ });
25
+ const llmReviewExpectation = z.object({
26
+ type: z.literal("llm_review"),
27
+ criteria: z.string().min(1).optional(),
28
+ dimensions: z.array(evalDimension).min(1).optional(),
29
+ threshold: z.number().min(1).max(5).optional(),
30
+ }).refine((e) => (e.criteria && e.criteria.trim().length > 0) || (e.dimensions && e.dimensions.length > 0), { message: "llm_review expectation requires criteria or dimensions" });
31
+ export const taskExpectationSchema = z.discriminatedUnion("type", [
32
+ testExpectation,
33
+ scriptExpectation,
34
+ fileExistsExpectation,
35
+ // llmReviewExpectation uses refine so can't be in discriminatedUnion — handled separately
36
+ ]);
37
+ /**
38
+ * Parse & validate a single expectation. Returns the validated value or null if invalid.
39
+ */
40
+ export function parseExpectation(raw) {
41
+ // Try discriminated union first (test, script, file_exists)
42
+ const result = taskExpectationSchema.safeParse(raw);
43
+ if (result.success)
44
+ return result.data;
45
+ // Try llm_review separately (uses refine)
46
+ const llmResult = llmReviewExpectation.safeParse(raw);
47
+ if (llmResult.success)
48
+ return llmResult.data;
49
+ return null;
50
+ }
51
+ /**
52
+ * Sanitize an array of expectations: keep only valid ones, silently drop malformed entries.
53
+ * Returns the filtered array + list of warnings for dropped entries.
54
+ */
55
+ export function sanitizeExpectations(raw) {
56
+ const valid = [];
57
+ const warnings = [];
58
+ for (let i = 0; i < raw.length; i++) {
59
+ const item = raw[i];
60
+ const parsed = parseExpectation(item);
61
+ if (parsed) {
62
+ valid.push(parsed);
63
+ }
64
+ else {
65
+ const type = item?.type ?? "unknown";
66
+ warnings.push(`expectation[${i}] (type: ${type}) dropped — missing required fields`);
67
+ }
68
+ }
69
+ return { valid, warnings };
70
+ }
71
+ // ── Mission Checkpoint Schema ───────────────────────────────────────
72
+ export const missionCheckpointSchema = z.object({
73
+ name: z.string().min(1, "checkpoint requires a name"),
74
+ afterTasks: z.array(z.string().min(1)).min(1, "checkpoint requires at least one task in afterTasks"),
75
+ blocksTasks: z.array(z.string().min(1)).min(1, "checkpoint requires at least one task in blocksTasks"),
76
+ message: z.string().optional(),
77
+ notifyChannels: z.array(z.string().min(1)).optional(),
78
+ });
79
+ // ── Mission Delay Schema ────────────────────────────────────────────
80
+ export const missionDelaySchema = z.object({
81
+ name: z.string().min(1, "delay requires a name"),
82
+ afterTasks: z.array(z.string().min(1)).min(1, "delay requires at least one task in afterTasks"),
83
+ blocksTasks: z.array(z.string().min(1)).min(1, "delay requires at least one task in blocksTasks"),
84
+ duration: z.string().min(1, "delay requires a duration (ISO 8601, e.g. PT2H, PT30M, P1D)"),
85
+ message: z.string().optional(),
86
+ notifyChannels: z.array(z.string().min(1)).optional(),
87
+ });
88
+ // ── Mission Quality Gate Schema ─────────────────────────────────────
89
+ export const missionQualityGateSchema = z.object({
90
+ name: z.string().min(1, "quality gate requires a name"),
91
+ afterTasks: z.array(z.string().min(1)).min(1, "quality gate requires at least one task in afterTasks"),
92
+ blocksTasks: z.array(z.string().min(1)).min(1, "quality gate requires at least one task in blocksTasks"),
93
+ minScore: z.number().min(1).max(5).optional(),
94
+ requireAllPassed: z.boolean().optional(),
95
+ condition: z.string().optional(),
96
+ notifyChannels: z.array(z.string().min(1)).optional(),
97
+ });
98
+ // ── Mission Task Schema ─────────────────────────────────────────────
99
+ const missionTaskSchema = z.object({
100
+ title: z.string().min(1, "task requires a title"),
101
+ description: z.string().min(1, "task requires a description"),
102
+ assignTo: z.string().min(1).optional(),
103
+ dependsOn: z.array(z.string().min(1)).optional(),
104
+ expectations: z.array(z.any()).optional(),
105
+ expectedOutcomes: z.array(z.any()).optional(),
106
+ metrics: z.array(z.any()).optional(),
107
+ maxRetries: z.number().int().min(0).optional(),
108
+ maxDuration: z.number().positive().optional(),
109
+ retryPolicy: z.object({
110
+ escalateAfter: z.number().int().min(0).optional(),
111
+ fallbackAgent: z.string().optional(),
112
+ }).optional(),
113
+ notifications: z.any().optional(),
114
+ sideEffects: z.boolean().optional(),
115
+ });
116
+ // ── Mission Document Schema ─────────────────────────────────────────
117
+ export const missionDocumentSchema = z.object({
118
+ tasks: z.array(missionTaskSchema).min(1, "mission requires at least one task"),
119
+ team: z.array(z.any()).optional(),
120
+ qualityGates: z.array(missionQualityGateSchema).optional(),
121
+ checkpoints: z.array(missionCheckpointSchema).optional(),
122
+ delays: z.array(missionDelaySchema).optional(),
123
+ notifications: z.any().optional(),
124
+ }).superRefine((doc, ctx) => {
125
+ // Enforce unique task titles within a mission document
126
+ const seen = new Set();
127
+ for (let i = 0; i < doc.tasks.length; i++) {
128
+ const title = doc.tasks[i].title;
129
+ if (seen.has(title)) {
130
+ ctx.addIssue({
131
+ code: z.ZodIssueCode.custom,
132
+ message: `Duplicate task title "${title}" — each task must have a unique title`,
133
+ path: ["tasks", i, "title"],
134
+ });
135
+ }
136
+ seen.add(title);
137
+ }
138
+ // Build task lookup: title → dependsOn set
139
+ const taskDeps = new Map();
140
+ for (const t of doc.tasks) {
141
+ taskDeps.set(t.title, new Set(t.dependsOn ?? []));
142
+ }
143
+ // Validate flow-control elements: blocksTasks must have dependsOn including afterTasks
144
+ const validateFlowControl = (kind, items) => {
145
+ for (let i = 0; i < items.length; i++) {
146
+ const fc = items[i];
147
+ // Check afterTasks reference valid task titles
148
+ for (const t of fc.afterTasks) {
149
+ if (!taskDeps.has(t)) {
150
+ ctx.addIssue({
151
+ code: z.ZodIssueCode.custom,
152
+ message: `${kind}[${i}] "${fc.name}": afterTasks references unknown task "${t}"`,
153
+ path: [kind, i, "afterTasks"],
154
+ });
155
+ }
156
+ }
157
+ // Check blocksTasks reference valid titles AND have dependsOn on afterTasks
158
+ for (const bt of fc.blocksTasks) {
159
+ if (!taskDeps.has(bt)) {
160
+ ctx.addIssue({
161
+ code: z.ZodIssueCode.custom,
162
+ message: `${kind}[${i}] "${fc.name}": blocksTasks references unknown task "${bt}"`,
163
+ path: [kind, i, "blocksTasks"],
164
+ });
165
+ continue;
166
+ }
167
+ const deps = taskDeps.get(bt);
168
+ const missingDeps = fc.afterTasks.filter(at => !deps.has(at));
169
+ if (missingDeps.length > 0) {
170
+ ctx.addIssue({
171
+ code: z.ZodIssueCode.custom,
172
+ message: `${kind}[${i}] "${fc.name}": task "${bt}" is in blocksTasks but missing dependsOn: [${missingDeps.map(d => `"${d}"`).join(", ")}]. Without dependsOn, the task will start in parallel ignoring the ${kind.slice(0, -1)}`,
173
+ path: ["tasks", doc.tasks.findIndex(t => t.title === bt), "dependsOn"],
174
+ });
175
+ }
176
+ }
177
+ }
178
+ };
179
+ if (doc.checkpoints)
180
+ validateFlowControl("checkpoints", doc.checkpoints);
181
+ if (doc.delays)
182
+ validateFlowControl("delays", doc.delays);
183
+ if (doc.qualityGates)
184
+ validateFlowControl("qualityGates", doc.qualityGates);
185
+ });
186
+ /**
187
+ * Parse and validate a mission JSON document strictly.
188
+ * Returns the validated document or throws with a clear error message.
189
+ */
190
+ export function parseMissionDocument(raw) {
191
+ const result = missionDocumentSchema.safeParse(raw);
192
+ if (!result.success) {
193
+ const issues = result.error.issues
194
+ .map((i) => `${i.path.join(".")}: ${i.message}`)
195
+ .join("; ");
196
+ throw new Error(`Invalid mission document: ${issues}`);
197
+ }
198
+ return result.data;
199
+ }
200
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Chat session storage — persists conversation threads across TUI restarts.
3
+ * Nomenclature aligned with OpenCode: Session, Message, SessionStore.
4
+ */
5
+ export type MessageRole = "user" | "assistant";
6
+ export type ToolCallState = "preparing" | "calling" | "completed" | "error" | "interrupted";
7
+ export interface ToolCallInfo {
8
+ /** Tool call ID from the LLM */
9
+ id: string;
10
+ /** Tool name (e.g. "create_task", "get_status") */
11
+ name: string;
12
+ /** Tool input arguments (present when state was "calling") */
13
+ arguments?: Record<string, unknown>;
14
+ /** Tool execution result (present when state is "completed" or "error") */
15
+ result?: string;
16
+ /** Final state of the tool call */
17
+ state: ToolCallState;
18
+ }
19
+ export interface Message {
20
+ id: string;
21
+ role: MessageRole;
22
+ content: string;
23
+ ts: string;
24
+ /** Tool calls executed during this assistant message (only for role=assistant) */
25
+ toolCalls?: ToolCallInfo[];
26
+ }
27
+ export interface Session {
28
+ id: string;
29
+ title?: string;
30
+ createdAt: string;
31
+ updatedAt: string;
32
+ messageCount: number;
33
+ }
34
+ export interface SessionStore {
35
+ create(title?: string): Promise<string>;
36
+ addMessage(sessionId: string, role: MessageRole, content: string): Promise<Message>;
37
+ /** Update the content of an existing message (e.g. finalize a streaming response). */
38
+ updateMessage(sessionId: string, messageId: string, content: string, toolCalls?: ToolCallInfo[]): Promise<boolean>;
39
+ getMessages(sessionId: string): Promise<Message[]>;
40
+ getRecentMessages(sessionId: string, limit: number): Promise<Message[]>;
41
+ listSessions(): Promise<Session[]>;
42
+ getSession(sessionId: string): Promise<Session | undefined>;
43
+ getLatestSession(): Promise<Session | undefined>;
44
+ /** Rename (update the title of) an existing session. */
45
+ renameSession(sessionId: string, title: string): Promise<boolean>;
46
+ deleteSession(sessionId: string): Promise<boolean>;
47
+ prune(keepSessions: number): Promise<number>;
48
+ close(): Promise<void> | void;
49
+ }
50
+ //# sourceMappingURL=session-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,CAAC;AAE/C,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,aAAa,CAAC;AAE5F,MAAM,WAAW,YAAY;IAC3B,gCAAgC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,KAAK,EAAE,aAAa,CAAC;CACtB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,kFAAkF;IAClF,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpF,sFAAsF;IACtF,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACnD,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACxE,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACnC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IAC5D,gBAAgB,IAAI,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IACjD,wDAAwD;IACxD,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClE,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,KAAK,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC/B"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Chat session storage — persists conversation threads across TUI restarts.
3
+ * Nomenclature aligned with OpenCode: Session, Message, SessionStore.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=session-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-store.js","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,30 @@
1
+ import type { OrchestratorContext } from "./orchestrator-context.js";
2
+ import type { NotificationRouterPort } from "./notification-router-port.js";
3
+ import type { SLAConfig } from "./types.js";
4
+ /**
5
+ * SLA Monitor — tracks deadlines on tasks and missions.
6
+ *
7
+ * Runs periodically (driven by the orchestrator tick) and emits:
8
+ * - sla:warning — when a configurable % of the deadline has elapsed
9
+ * - sla:violated — when the deadline has passed
10
+ * - sla:met — when an entity completes before its deadline
11
+ *
12
+ * Can optionally force-fail tasks that violate their SLA.
13
+ */
14
+ export declare class SLAMonitor {
15
+ private ctx;
16
+ private config;
17
+ private warned;
18
+ private violated;
19
+ private lastCheckMs;
20
+ private notificationRouter?;
21
+ constructor(ctx: OrchestratorContext, slaConfig?: SLAConfig);
22
+ setNotificationRouter(router: NotificationRouterPort): void;
23
+ init(): void;
24
+ check(): Promise<void>;
25
+ private checkEntity;
26
+ clearEntity(entityId: string): void;
27
+ private registerNotificationRules;
28
+ dispose(): void;
29
+ }
30
+ //# sourceMappingURL=sla-monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sla-monitor.d.ts","sourceRoot":"","sources":["../src/sla-monitor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;;;;;GASG;AACH,qBAAa,UAAU;IAQnB,OAAO,CAAC,GAAG;IAPb,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,kBAAkB,CAAC,CAAyB;gBAG1C,GAAG,EAAE,mBAAmB,EAChC,SAAS,CAAC,EAAE,SAAS;IAWvB,qBAAqB,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI;IAI3D,IAAI,IAAI,IAAI;IA2BN,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAsBd,WAAW;IAiDzB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKnC,OAAO,CAAC,yBAAyB;IAgCjC,OAAO,IAAI,IAAI;CAIhB"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * SLA Monitor — tracks deadlines on tasks and missions.
3
+ *
4
+ * Runs periodically (driven by the orchestrator tick) and emits:
5
+ * - sla:warning — when a configurable % of the deadline has elapsed
6
+ * - sla:violated — when the deadline has passed
7
+ * - sla:met — when an entity completes before its deadline
8
+ *
9
+ * Can optionally force-fail tasks that violate their SLA.
10
+ */
11
+ export class SLAMonitor {
12
+ ctx;
13
+ config;
14
+ warned = new Set();
15
+ violated = new Set();
16
+ lastCheckMs = 0;
17
+ notificationRouter;
18
+ constructor(ctx, slaConfig) {
19
+ this.ctx = ctx;
20
+ this.config = {
21
+ warningThreshold: slaConfig?.warningThreshold ?? 0.8,
22
+ checkIntervalMs: slaConfig?.checkIntervalMs ?? 30_000,
23
+ warningChannels: slaConfig?.warningChannels ?? [],
24
+ violationChannels: slaConfig?.violationChannels ?? [],
25
+ violationAction: slaConfig?.violationAction ?? "notify",
26
+ };
27
+ }
28
+ setNotificationRouter(router) {
29
+ this.notificationRouter = router;
30
+ }
31
+ init() {
32
+ this.registerNotificationRules();
33
+ this.ctx.hooks.register({
34
+ hook: "task:complete",
35
+ phase: "after",
36
+ priority: 200,
37
+ name: "sla-monitor:met",
38
+ handler: (hookCtx) => {
39
+ const { taskId, task } = hookCtx.data;
40
+ if (task?.deadline) {
41
+ const deadline = new Date(task.deadline).getTime();
42
+ const now = Date.now();
43
+ if (now <= deadline) {
44
+ this.ctx.emitter.emit("sla:met", {
45
+ entityId: taskId,
46
+ entityType: "task",
47
+ deadline: task.deadline,
48
+ marginMs: deadline - now,
49
+ });
50
+ }
51
+ this.warned.delete(taskId);
52
+ this.violated.delete(taskId);
53
+ }
54
+ },
55
+ });
56
+ }
57
+ async check() {
58
+ const now = Date.now();
59
+ if (now - this.lastCheckMs < this.config.checkIntervalMs)
60
+ return;
61
+ this.lastCheckMs = now;
62
+ const tasks = await this.ctx.registry.getAllTasks();
63
+ for (const task of tasks) {
64
+ if (!task.deadline)
65
+ continue;
66
+ if (task.status === "done" || task.status === "failed")
67
+ continue;
68
+ await this.checkEntity(task.id, "task", task.deadline, task.createdAt, now);
69
+ }
70
+ const missions = await this.ctx.registry.getAllMissions?.() ?? [];
71
+ for (const mission of missions) {
72
+ if (!mission.deadline)
73
+ continue;
74
+ if (mission.status === "completed" || mission.status === "failed" || mission.status === "cancelled" ||
75
+ mission.status === "scheduled" || mission.status === "recurring")
76
+ continue;
77
+ await this.checkEntity(mission.id, "mission", mission.deadline, mission.createdAt, now);
78
+ }
79
+ }
80
+ async checkEntity(entityId, entityType, deadlineStr, createdAtStr, now) {
81
+ const deadline = new Date(deadlineStr).getTime();
82
+ const createdAt = new Date(createdAtStr).getTime();
83
+ const totalBudget = deadline - createdAt;
84
+ const elapsed = now - createdAt;
85
+ const remaining = deadline - now;
86
+ const percentUsed = totalBudget > 0 ? elapsed / totalBudget : 1;
87
+ if (this.violated.has(entityId))
88
+ return;
89
+ if (now > deadline) {
90
+ this.violated.add(entityId);
91
+ this.warned.add(entityId);
92
+ this.ctx.emitter.emit("sla:violated", {
93
+ entityId,
94
+ entityType,
95
+ deadline: deadlineStr,
96
+ overdueMs: now - deadline,
97
+ });
98
+ if (this.config.violationAction === "fail" && entityType === "task") {
99
+ try {
100
+ await this.ctx.registry.unsafeSetStatus(entityId, "failed", "SLA violated — deadline exceeded");
101
+ }
102
+ catch { /* task may not exist or be in terminal state */ }
103
+ }
104
+ return;
105
+ }
106
+ if (!this.warned.has(entityId) && percentUsed >= this.config.warningThreshold) {
107
+ this.warned.add(entityId);
108
+ this.ctx.emitter.emit("sla:warning", {
109
+ entityId,
110
+ entityType,
111
+ deadline: deadlineStr,
112
+ elapsed,
113
+ remaining,
114
+ percentUsed,
115
+ });
116
+ }
117
+ }
118
+ clearEntity(entityId) {
119
+ this.warned.delete(entityId);
120
+ this.violated.delete(entityId);
121
+ }
122
+ registerNotificationRules() {
123
+ if (!this.notificationRouter)
124
+ return;
125
+ if (this.config.warningChannels.length > 0) {
126
+ this.notificationRouter.addRule({
127
+ id: "sla-auto-warning",
128
+ name: "SLA Warning (auto-registered)",
129
+ events: ["sla:warning"],
130
+ channels: this.config.warningChannels,
131
+ severity: "warning",
132
+ });
133
+ }
134
+ if (this.config.violationChannels.length > 0) {
135
+ this.notificationRouter.addRule({
136
+ id: "sla-auto-violated",
137
+ name: "SLA Violation (auto-registered)",
138
+ events: ["sla:violated"],
139
+ channels: this.config.violationChannels,
140
+ severity: "critical",
141
+ });
142
+ this.notificationRouter.addRule({
143
+ id: "sla-auto-met",
144
+ name: "SLA Met (auto-registered)",
145
+ events: ["sla:met"],
146
+ channels: this.config.violationChannels,
147
+ severity: "info",
148
+ });
149
+ }
150
+ }
151
+ dispose() {
152
+ this.warned.clear();
153
+ this.violated.clear();
154
+ }
155
+ }
156
+ //# sourceMappingURL=sla-monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sla-monitor.js","sourceRoot":"","sources":["../src/sla-monitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { TaskStatus } from "./types.js";
2
+ /** Valid state transitions for the task state machine. */
3
+ export declare const VALID_TRANSITIONS: Readonly<Record<TaskStatus, readonly TaskStatus[]>>;
4
+ /** Check whether a transition from one status to another is valid. */
5
+ export declare function isValidTransition(from: TaskStatus, to: TaskStatus): boolean;
6
+ /** Throw if the transition is invalid. */
7
+ export declare function assertValidTransition(from: TaskStatus, to: TaskStatus): void;
8
+ //# sourceMappingURL=state-machine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-machine.d.ts","sourceRoot":"","sources":["../src/state-machine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,0DAA0D;AAC1D,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,UAAU,EAAE,CAAC,CASxE,CAAC;AAEX,sEAAsE;AACtE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,GAAG,OAAO,CAE3E;AAED,0CAA0C;AAC1C,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,GAAG,IAAI,CAO5E"}
@@ -0,0 +1,23 @@
1
+ /** Valid state transitions for the task state machine. */
2
+ export const VALID_TRANSITIONS = {
3
+ draft: ["pending"],
4
+ pending: ["assigned", "awaiting_approval"],
5
+ awaiting_approval: ["assigned", "failed", "done", "pending"],
6
+ assigned: ["in_progress", "awaiting_approval"],
7
+ in_progress: ["review", "failed", "awaiting_approval"],
8
+ review: ["done", "failed", "awaiting_approval"],
9
+ done: [],
10
+ failed: ["pending"],
11
+ };
12
+ /** Check whether a transition from one status to another is valid. */
13
+ export function isValidTransition(from, to) {
14
+ return VALID_TRANSITIONS[from].includes(to);
15
+ }
16
+ /** Throw if the transition is invalid. */
17
+ export function assertValidTransition(from, to) {
18
+ if (!isValidTransition(from, to)) {
19
+ const allowed = VALID_TRANSITIONS[from];
20
+ throw new Error(`Invalid transition: ${from} → ${to} (allowed: ${allowed.join(", ") || "none"})`);
21
+ }
22
+ }
23
+ //# sourceMappingURL=state-machine.js.map