@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,317 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deadlock resolution: LLM-powered dependency unblocking.
|
|
3
|
+
*
|
|
4
|
+
* When a plan task fails and blocks downstream dependents, the resolver
|
|
5
|
+
* analyzes the failure and decides whether blocked tasks can proceed
|
|
6
|
+
* (absorb), whether the failed dep should be retried, or whether the
|
|
7
|
+
* chain should be failed.
|
|
8
|
+
*/
|
|
9
|
+
import { queryText, resolveModelSpec } from "../llm/pi-client.js";
|
|
10
|
+
import { withRetry } from "../llm/retry.js";
|
|
11
|
+
/** Inline query helper (replaces deleted query.ts) */
|
|
12
|
+
async function queryOrchestratorText(prompt, model) {
|
|
13
|
+
const spec = resolveModelSpec(model);
|
|
14
|
+
return withRetry(async () => {
|
|
15
|
+
const result = await queryText(prompt, spec);
|
|
16
|
+
return { text: result.text, usage: result.usage, model: result.model };
|
|
17
|
+
}, { maxRetries: 2 });
|
|
18
|
+
}
|
|
19
|
+
// ── State ─────────────────────────────────────────────
|
|
20
|
+
let resolving = false;
|
|
21
|
+
/** Whether an async resolution is currently in progress. */
|
|
22
|
+
export function isResolving() {
|
|
23
|
+
return resolving;
|
|
24
|
+
}
|
|
25
|
+
// ── Analysis ──────────────────────────────────────────
|
|
26
|
+
/**
|
|
27
|
+
* Classify each pending task's blockage: resolvable (failed deps) vs
|
|
28
|
+
* unresolvable (missing deps). Follows cascade chains to root failures.
|
|
29
|
+
*/
|
|
30
|
+
export function analyzeBlockedTasks(pending, allTasks) {
|
|
31
|
+
const taskMap = new Map(allTasks.map(t => [t.id, t]));
|
|
32
|
+
const resolvable = [];
|
|
33
|
+
const unresolvable = [];
|
|
34
|
+
for (const task of pending) {
|
|
35
|
+
const failedDeps = [];
|
|
36
|
+
const missingDeps = [];
|
|
37
|
+
for (const depId of task.dependsOn) {
|
|
38
|
+
const dep = taskMap.get(depId);
|
|
39
|
+
if (!dep) {
|
|
40
|
+
missingDeps.push(depId);
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (dep.status === "failed") {
|
|
44
|
+
failedDeps.push(dep);
|
|
45
|
+
}
|
|
46
|
+
else if (dep.status === "pending") {
|
|
47
|
+
// Cascade: dep is pending but itself blocked — find root cause
|
|
48
|
+
const root = findRootFailure(dep, taskMap, new Set());
|
|
49
|
+
if (root) {
|
|
50
|
+
failedDeps.push(root);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// Pending dep with no root failure found — treat as missing
|
|
54
|
+
missingDeps.push(depId);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// dep.status === "done" → this dep is fine, skip
|
|
58
|
+
}
|
|
59
|
+
if (failedDeps.length > 0) {
|
|
60
|
+
resolvable.push({ task, failedDeps, missingDeps });
|
|
61
|
+
}
|
|
62
|
+
else if (missingDeps.length > 0) {
|
|
63
|
+
unresolvable.push({ task, failedDeps: [], missingDeps });
|
|
64
|
+
}
|
|
65
|
+
// If neither: all deps are done (shouldn't be here) or still running
|
|
66
|
+
}
|
|
67
|
+
return { resolvable, unresolvable };
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Walk the dependency chain to find the root failed task.
|
|
71
|
+
* Returns the first failed ancestor, or null if no failed root found.
|
|
72
|
+
*/
|
|
73
|
+
function findRootFailure(task, taskMap, visited) {
|
|
74
|
+
if (visited.has(task.id))
|
|
75
|
+
return null; // circular
|
|
76
|
+
visited.add(task.id);
|
|
77
|
+
for (const depId of task.dependsOn) {
|
|
78
|
+
const dep = taskMap.get(depId);
|
|
79
|
+
if (!dep)
|
|
80
|
+
continue;
|
|
81
|
+
if (dep.status === "failed")
|
|
82
|
+
return dep;
|
|
83
|
+
if (dep.status === "pending") {
|
|
84
|
+
const root = findRootFailure(dep, taskMap, visited);
|
|
85
|
+
if (root)
|
|
86
|
+
return root;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
// ── Resolution ────────────────────────────────────────
|
|
92
|
+
/**
|
|
93
|
+
* Async deadlock resolution. For each resolvable blockage, calls LLM
|
|
94
|
+
* to decide action (absorb/retry/fail) and applies the decision.
|
|
95
|
+
*
|
|
96
|
+
* Pattern: fire-and-forget from tick(), results applied via registry.updateTask()
|
|
97
|
+
* and picked up on next tick.
|
|
98
|
+
*/
|
|
99
|
+
export async function resolveDeadlock(analysis, orchestrator) {
|
|
100
|
+
resolving = true;
|
|
101
|
+
try {
|
|
102
|
+
const settings = orchestrator.getConfig()?.settings;
|
|
103
|
+
const maxAttempts = settings?.maxResolutionAttempts ?? 2;
|
|
104
|
+
const model = settings?.orchestratorModel;
|
|
105
|
+
const memory = await orchestrator.getMemory();
|
|
106
|
+
const allTasks = await orchestrator.getStore().getAllTasks();
|
|
107
|
+
// Deduplicate: if multiple blocked tasks share the same failed dep,
|
|
108
|
+
// process each blocked task independently but track retried deps
|
|
109
|
+
const retriedDeps = new Set();
|
|
110
|
+
for (const blockage of analysis.resolvable) {
|
|
111
|
+
const task = blockage.task;
|
|
112
|
+
// Guard: max resolution attempts
|
|
113
|
+
if ((task.resolutionAttempts ?? 0) >= maxAttempts) {
|
|
114
|
+
orchestrator.emit("deadlock:unresolvable", {
|
|
115
|
+
taskId: task.id,
|
|
116
|
+
reason: "max resolution attempts reached",
|
|
117
|
+
});
|
|
118
|
+
await forceFailTask(orchestrator, task.id);
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
// Use the first (most relevant) failed dep for the LLM prompt
|
|
122
|
+
const failedDep = blockage.failedDeps[0];
|
|
123
|
+
orchestrator.emit("deadlock:resolving", {
|
|
124
|
+
taskId: task.id,
|
|
125
|
+
failedDepId: failedDep.id,
|
|
126
|
+
});
|
|
127
|
+
let decision;
|
|
128
|
+
try {
|
|
129
|
+
decision = await classifyBlockage(task, failedDep, allTasks, memory, model);
|
|
130
|
+
}
|
|
131
|
+
catch { /* LLM classification failed */
|
|
132
|
+
orchestrator.emit("deadlock:unresolvable", {
|
|
133
|
+
taskId: task.id,
|
|
134
|
+
reason: "LLM analysis failed",
|
|
135
|
+
});
|
|
136
|
+
await forceFailTask(orchestrator, task.id);
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
await applyDecision(decision, task, failedDep, blockage, orchestrator, retriedDeps);
|
|
140
|
+
}
|
|
141
|
+
// Force-fail unresolvable tasks (missing deps)
|
|
142
|
+
for (const blockage of analysis.unresolvable) {
|
|
143
|
+
orchestrator.emit("deadlock:unresolvable", {
|
|
144
|
+
taskId: blockage.task.id,
|
|
145
|
+
reason: `missing dependencies: ${blockage.missingDeps.join(", ")}`,
|
|
146
|
+
});
|
|
147
|
+
await forceFailTask(orchestrator, blockage.task.id);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
finally {
|
|
151
|
+
resolving = false;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// ── LLM Classification ───────────────────────────────
|
|
155
|
+
async function classifyBlockage(blockedTask, failedDep, allTasks, memory, model) {
|
|
156
|
+
const prompt = buildResolutionPrompt(blockedTask, failedDep, allTasks, memory);
|
|
157
|
+
const response = (await queryOrchestratorText(prompt, model)).text;
|
|
158
|
+
try {
|
|
159
|
+
const cleaned = response.replace(/```json?\n?/g, "").replace(/```/g, "").trim();
|
|
160
|
+
const parsed = JSON.parse(cleaned);
|
|
161
|
+
const action = parsed.action;
|
|
162
|
+
if (action !== "absorb" && action !== "retry" && action !== "fail") {
|
|
163
|
+
return { action: "fail", reason: "invalid LLM response" };
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
action,
|
|
167
|
+
reason: parsed.reason || "no reason provided",
|
|
168
|
+
absorbedDescription: parsed.absorbedDescription,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
catch { /* malformed JSON response */
|
|
172
|
+
return { action: "fail", reason: "failed to parse LLM response" };
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
function buildResolutionPrompt(blockedTask, failedDep, allTasks, memory) {
|
|
176
|
+
const siblings = blockedTask.group
|
|
177
|
+
? allTasks.filter(t => t.group === blockedTask.group && t.id !== blockedTask.id && t.id !== failedDep.id && t.status === "done")
|
|
178
|
+
: [];
|
|
179
|
+
const errorInfo = failedDep.result
|
|
180
|
+
? (failedDep.result.stderr || `exit code ${failedDep.result.exitCode}`)
|
|
181
|
+
: "unknown error";
|
|
182
|
+
const assessmentInfo = failedDep.result?.assessment
|
|
183
|
+
? `\nAssessment score: ${failedDep.result.assessment.globalScore?.toFixed(1) ?? "N/A"}/5`
|
|
184
|
+
: "";
|
|
185
|
+
const resultExcerpt = failedDep.result?.stdout
|
|
186
|
+
? `\nResult output (last 500 chars): ${failedDep.result.stdout.slice(-500)}`
|
|
187
|
+
: "";
|
|
188
|
+
const parts = [
|
|
189
|
+
`You are Polpo, an AI agent orchestration framework, managing a coding plan. A task has FAILED, blocking a downstream task.`,
|
|
190
|
+
`Analyze the situation and decide how to unblock the downstream task.`,
|
|
191
|
+
``,
|
|
192
|
+
`## Failed Task`,
|
|
193
|
+
`Title: ${failedDep.title}`,
|
|
194
|
+
`Description: ${failedDep.originalDescription || failedDep.description}`,
|
|
195
|
+
`Error: ${errorInfo}${assessmentInfo}${resultExcerpt}`,
|
|
196
|
+
``,
|
|
197
|
+
`## Blocked Downstream Task`,
|
|
198
|
+
`Title: ${blockedTask.title}`,
|
|
199
|
+
`Description: ${blockedTask.originalDescription || blockedTask.description}`,
|
|
200
|
+
];
|
|
201
|
+
if (siblings.length > 0) {
|
|
202
|
+
parts.push(``, `## Completed Siblings (same plan)`);
|
|
203
|
+
for (const s of siblings.slice(0, 5)) {
|
|
204
|
+
const resultBrief = s.result?.stdout ? s.result.stdout.slice(0, 150) : "";
|
|
205
|
+
parts.push(`- [done] ${s.title}${resultBrief ? `: ${resultBrief}` : ""}`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (memory) {
|
|
209
|
+
parts.push(``, `## Shared Memory`, memory.slice(0, 1000));
|
|
210
|
+
}
|
|
211
|
+
parts.push(``, `## Decision`, `Choose ONE action:`, `- "absorb": The blocked task CAN proceed by incorporating the failed task's work into its own scope. Provide a clear updated description that tells the agent what extra work to do.`, `- "retry": The failed task should be retried (transient error, environment issue, might succeed on retry).`, `- "fail": The blocked task genuinely CANNOT proceed without the dependency. No workaround exists.`, ``, `Respond with ONLY a JSON object:`, `{"action": "absorb|retry|fail", "reason": "brief explanation", "absorbedDescription": "updated description for the blocked task if action is absorb"}`);
|
|
212
|
+
return parts.join("\n");
|
|
213
|
+
}
|
|
214
|
+
// ── Apply Decision ────────────────────────────────────
|
|
215
|
+
async function applyDecision(decision, blockedTask, failedDep, blockage, orchestrator, retriedDeps) {
|
|
216
|
+
const store = orchestrator.getStore();
|
|
217
|
+
switch (decision.action) {
|
|
218
|
+
case "absorb": {
|
|
219
|
+
// Save original description before first resolution
|
|
220
|
+
if (!blockedTask.originalDescription) {
|
|
221
|
+
await store.updateTask(blockedTask.id, { originalDescription: blockedTask.description });
|
|
222
|
+
}
|
|
223
|
+
// Build absorbed description
|
|
224
|
+
const errorInfo = failedDep.result
|
|
225
|
+
? (failedDep.result.stderr || `exit code ${failedDep.result.exitCode}`)
|
|
226
|
+
: "unknown error";
|
|
227
|
+
const absorbBlock = [
|
|
228
|
+
`[Dependency Resolution]`,
|
|
229
|
+
`The dependency "${failedDep.title}" could not be completed.`,
|
|
230
|
+
`Original dependency task: ${(failedDep.originalDescription || failedDep.description).slice(0, 500)}`,
|
|
231
|
+
`Error: ${errorInfo}`,
|
|
232
|
+
`You must handle this work as part of your task.`,
|
|
233
|
+
``,
|
|
234
|
+
decision.absorbedDescription || "",
|
|
235
|
+
``,
|
|
236
|
+
`---`,
|
|
237
|
+
`ORIGINAL TASK: ${blockedTask.originalDescription || blockedTask.description}`,
|
|
238
|
+
].join("\n");
|
|
239
|
+
// Remove failed dep from dependsOn
|
|
240
|
+
const newDeps = blockedTask.dependsOn.filter(id => id !== failedDep.id);
|
|
241
|
+
// Also remove any other failed deps from this blockage
|
|
242
|
+
const allFailedIds = new Set(blockage.failedDeps.map(d => d.id));
|
|
243
|
+
const cleanDeps = newDeps.filter(id => !allFailedIds.has(id));
|
|
244
|
+
await store.unsafeSetStatus(blockedTask.id, "pending", "deadlock absorb — failed dep removed");
|
|
245
|
+
await store.updateTask(blockedTask.id, {
|
|
246
|
+
dependsOn: cleanDeps,
|
|
247
|
+
description: absorbBlock,
|
|
248
|
+
resolutionAttempts: (blockedTask.resolutionAttempts ?? 0) + 1,
|
|
249
|
+
});
|
|
250
|
+
orchestrator.emit("deadlock:resolved", {
|
|
251
|
+
taskId: blockedTask.id,
|
|
252
|
+
failedDepId: failedDep.id,
|
|
253
|
+
action: "absorb",
|
|
254
|
+
reason: decision.reason,
|
|
255
|
+
});
|
|
256
|
+
break;
|
|
257
|
+
}
|
|
258
|
+
case "retry": {
|
|
259
|
+
// Retry the failed dep (if not already retried in this resolution round)
|
|
260
|
+
if (!retriedDeps.has(failedDep.id)) {
|
|
261
|
+
const fresh = await store.getTask(failedDep.id);
|
|
262
|
+
if (fresh && fresh.retries < fresh.maxRetries) {
|
|
263
|
+
// Use transition to properly increment retries
|
|
264
|
+
await store.transition(failedDep.id, "pending");
|
|
265
|
+
retriedDeps.add(failedDep.id);
|
|
266
|
+
orchestrator.emit("deadlock:resolved", {
|
|
267
|
+
taskId: blockedTask.id,
|
|
268
|
+
failedDepId: failedDep.id,
|
|
269
|
+
action: "retry",
|
|
270
|
+
reason: decision.reason,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
// No retries left → force-fail the blocked task
|
|
275
|
+
orchestrator.emit("deadlock:unresolvable", {
|
|
276
|
+
taskId: blockedTask.id,
|
|
277
|
+
reason: `dependency "${failedDep.title}" has no retries remaining`,
|
|
278
|
+
});
|
|
279
|
+
await forceFailTask(orchestrator, blockedTask.id);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
// If already retried: do nothing, next tick will re-evaluate
|
|
283
|
+
break;
|
|
284
|
+
}
|
|
285
|
+
case "fail":
|
|
286
|
+
default: {
|
|
287
|
+
orchestrator.emit("deadlock:unresolvable", {
|
|
288
|
+
taskId: blockedTask.id,
|
|
289
|
+
reason: decision.reason,
|
|
290
|
+
});
|
|
291
|
+
await forceFailTask(orchestrator, blockedTask.id);
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// ── Helpers ───────────────────────────────────────────
|
|
297
|
+
async function forceFailTask(orchestrator, taskId) {
|
|
298
|
+
const store = orchestrator.getStore();
|
|
299
|
+
try {
|
|
300
|
+
const task = await store.getTask(taskId);
|
|
301
|
+
if (!task || task.status === "done" || task.status === "failed")
|
|
302
|
+
return;
|
|
303
|
+
// Walk through state machine to reach failed
|
|
304
|
+
if (task.status === "pending")
|
|
305
|
+
await store.transition(taskId, "assigned");
|
|
306
|
+
const t2 = await store.getTask(taskId);
|
|
307
|
+
if (t2 && t2.status === "assigned")
|
|
308
|
+
await store.transition(taskId, "in_progress");
|
|
309
|
+
const t3 = await store.getTask(taskId);
|
|
310
|
+
if (t3 && t3.status === "in_progress")
|
|
311
|
+
await store.transition(taskId, "failed");
|
|
312
|
+
else if (t3 && t3.status === "review")
|
|
313
|
+
await store.transition(taskId, "failed");
|
|
314
|
+
}
|
|
315
|
+
catch { /* already terminal or transition error */ }
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=deadlock-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deadlock-resolver.js","sourceRoot":"","sources":["../../src/core/deadlock-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create all SQLite tables for @polpo-ai/drizzle stores.
|
|
3
|
+
* Equivalent to ensurePgSchema() but for SQLite (uses raw SQL via better-sqlite3).
|
|
4
|
+
*/
|
|
5
|
+
export declare function ensureSqliteSchema(db: {
|
|
6
|
+
exec(sql: string): void;
|
|
7
|
+
}): void;
|
|
8
|
+
//# sourceMappingURL=drizzle-sqlite-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drizzle-sqlite-schema.d.ts","sourceRoot":"","sources":["../../src/core/drizzle-sqlite-schema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE;IAAE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAoPxE"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create all SQLite tables for @polpo-ai/drizzle stores.
|
|
3
|
+
* Equivalent to ensurePgSchema() but for SQLite (uses raw SQL via better-sqlite3).
|
|
4
|
+
*/
|
|
5
|
+
export function ensureSqliteSchema(db) {
|
|
6
|
+
db.exec(`
|
|
7
|
+
CREATE TABLE IF NOT EXISTS tasks (
|
|
8
|
+
id TEXT PRIMARY KEY,
|
|
9
|
+
title TEXT NOT NULL,
|
|
10
|
+
description TEXT NOT NULL,
|
|
11
|
+
assign_to TEXT NOT NULL,
|
|
12
|
+
"group" TEXT,
|
|
13
|
+
mission_id TEXT,
|
|
14
|
+
depends_on TEXT NOT NULL DEFAULT '[]',
|
|
15
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
16
|
+
retries INTEGER NOT NULL DEFAULT 0,
|
|
17
|
+
max_retries INTEGER NOT NULL DEFAULT 2,
|
|
18
|
+
max_duration INTEGER,
|
|
19
|
+
retry_policy TEXT,
|
|
20
|
+
expectations TEXT NOT NULL DEFAULT '[]',
|
|
21
|
+
metrics TEXT NOT NULL DEFAULT '[]',
|
|
22
|
+
result TEXT,
|
|
23
|
+
phase TEXT,
|
|
24
|
+
fix_attempts INTEGER NOT NULL DEFAULT 0,
|
|
25
|
+
resolution_attempts INTEGER NOT NULL DEFAULT 0,
|
|
26
|
+
original_description TEXT,
|
|
27
|
+
session_id TEXT,
|
|
28
|
+
notifications TEXT,
|
|
29
|
+
outcomes TEXT,
|
|
30
|
+
expected_outcomes TEXT,
|
|
31
|
+
deadline TEXT,
|
|
32
|
+
priority TEXT,
|
|
33
|
+
side_effects INTEGER,
|
|
34
|
+
revision_count INTEGER,
|
|
35
|
+
"user" TEXT,
|
|
36
|
+
created_at TEXT NOT NULL,
|
|
37
|
+
updated_at TEXT NOT NULL
|
|
38
|
+
);
|
|
39
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
|
|
40
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_group ON tasks("group");
|
|
41
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_assign_to ON tasks(assign_to);
|
|
42
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_mission_id ON tasks(mission_id);
|
|
43
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_user ON tasks("user");
|
|
44
|
+
|
|
45
|
+
CREATE TABLE IF NOT EXISTS missions (
|
|
46
|
+
id TEXT PRIMARY KEY,
|
|
47
|
+
name TEXT NOT NULL UNIQUE,
|
|
48
|
+
data TEXT NOT NULL,
|
|
49
|
+
prompt TEXT,
|
|
50
|
+
status TEXT NOT NULL DEFAULT 'draft',
|
|
51
|
+
schedule TEXT,
|
|
52
|
+
end_date TEXT,
|
|
53
|
+
quality_threshold TEXT,
|
|
54
|
+
deadline TEXT,
|
|
55
|
+
notifications TEXT,
|
|
56
|
+
execution_count INTEGER NOT NULL DEFAULT 0,
|
|
57
|
+
"user" TEXT,
|
|
58
|
+
created_at TEXT NOT NULL,
|
|
59
|
+
updated_at TEXT NOT NULL
|
|
60
|
+
);
|
|
61
|
+
CREATE INDEX IF NOT EXISTS idx_missions_status ON missions(status);
|
|
62
|
+
CREATE INDEX IF NOT EXISTS idx_missions_user ON missions("user");
|
|
63
|
+
|
|
64
|
+
CREATE TABLE IF NOT EXISTS metadata (
|
|
65
|
+
key TEXT PRIMARY KEY,
|
|
66
|
+
value TEXT NOT NULL
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
CREATE TABLE IF NOT EXISTS processes (
|
|
70
|
+
agent_name TEXT NOT NULL,
|
|
71
|
+
pid INTEGER NOT NULL,
|
|
72
|
+
task_id TEXT NOT NULL,
|
|
73
|
+
started_at TEXT NOT NULL,
|
|
74
|
+
alive INTEGER NOT NULL DEFAULT 1,
|
|
75
|
+
activity TEXT NOT NULL DEFAULT '{}'
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
CREATE TABLE IF NOT EXISTS runs (
|
|
79
|
+
id TEXT PRIMARY KEY,
|
|
80
|
+
task_id TEXT NOT NULL,
|
|
81
|
+
pid INTEGER NOT NULL DEFAULT 0,
|
|
82
|
+
agent_name TEXT NOT NULL,
|
|
83
|
+
adapter_type TEXT NOT NULL,
|
|
84
|
+
session_id TEXT,
|
|
85
|
+
status TEXT NOT NULL DEFAULT 'running',
|
|
86
|
+
started_at TEXT NOT NULL,
|
|
87
|
+
updated_at TEXT NOT NULL,
|
|
88
|
+
activity TEXT NOT NULL DEFAULT '{}',
|
|
89
|
+
result TEXT,
|
|
90
|
+
outcomes TEXT,
|
|
91
|
+
config TEXT,
|
|
92
|
+
config_path TEXT NOT NULL,
|
|
93
|
+
"user" TEXT
|
|
94
|
+
);
|
|
95
|
+
CREATE INDEX IF NOT EXISTS idx_runs_status ON runs(status);
|
|
96
|
+
CREATE INDEX IF NOT EXISTS idx_runs_task_id ON runs(task_id);
|
|
97
|
+
CREATE INDEX IF NOT EXISTS idx_runs_user ON runs("user");
|
|
98
|
+
|
|
99
|
+
CREATE TABLE IF NOT EXISTS sessions (
|
|
100
|
+
id TEXT PRIMARY KEY,
|
|
101
|
+
title TEXT,
|
|
102
|
+
"user" TEXT,
|
|
103
|
+
metadata TEXT,
|
|
104
|
+
created_at TEXT NOT NULL,
|
|
105
|
+
updated_at TEXT NOT NULL
|
|
106
|
+
);
|
|
107
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_user ON sessions("user");
|
|
108
|
+
|
|
109
|
+
CREATE TABLE IF NOT EXISTS messages (
|
|
110
|
+
id TEXT PRIMARY KEY,
|
|
111
|
+
session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
|
|
112
|
+
role TEXT NOT NULL,
|
|
113
|
+
content TEXT NOT NULL,
|
|
114
|
+
ts TEXT NOT NULL,
|
|
115
|
+
tool_calls TEXT
|
|
116
|
+
);
|
|
117
|
+
CREATE INDEX IF NOT EXISTS idx_messages_session ON messages(session_id, ts);
|
|
118
|
+
|
|
119
|
+
CREATE TABLE IF NOT EXISTS notifications (
|
|
120
|
+
id TEXT PRIMARY KEY,
|
|
121
|
+
timestamp TEXT NOT NULL,
|
|
122
|
+
rule_id TEXT NOT NULL,
|
|
123
|
+
rule_name TEXT NOT NULL,
|
|
124
|
+
channel TEXT NOT NULL,
|
|
125
|
+
channel_type TEXT NOT NULL,
|
|
126
|
+
status TEXT NOT NULL,
|
|
127
|
+
error TEXT,
|
|
128
|
+
title TEXT NOT NULL,
|
|
129
|
+
body TEXT NOT NULL,
|
|
130
|
+
severity TEXT NOT NULL,
|
|
131
|
+
source_event TEXT NOT NULL,
|
|
132
|
+
attachment_count INTEGER NOT NULL DEFAULT 0,
|
|
133
|
+
attachment_types TEXT
|
|
134
|
+
);
|
|
135
|
+
CREATE INDEX IF NOT EXISTS idx_notifications_timestamp ON notifications(timestamp);
|
|
136
|
+
CREATE INDEX IF NOT EXISTS idx_notifications_status ON notifications(status);
|
|
137
|
+
CREATE INDEX IF NOT EXISTS idx_notifications_channel ON notifications(channel);
|
|
138
|
+
CREATE INDEX IF NOT EXISTS idx_notifications_rule_id ON notifications(rule_id);
|
|
139
|
+
|
|
140
|
+
CREATE TABLE IF NOT EXISTS log_sessions (
|
|
141
|
+
id TEXT PRIMARY KEY,
|
|
142
|
+
started_at TEXT NOT NULL
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
CREATE TABLE IF NOT EXISTS log_entries (
|
|
146
|
+
id TEXT PRIMARY KEY,
|
|
147
|
+
session_id TEXT NOT NULL REFERENCES log_sessions(id) ON DELETE CASCADE,
|
|
148
|
+
ts TEXT NOT NULL,
|
|
149
|
+
event TEXT NOT NULL,
|
|
150
|
+
data TEXT
|
|
151
|
+
);
|
|
152
|
+
CREATE INDEX IF NOT EXISTS idx_log_entries_session ON log_entries(session_id);
|
|
153
|
+
CREATE INDEX IF NOT EXISTS idx_log_entries_ts ON log_entries(ts);
|
|
154
|
+
|
|
155
|
+
CREATE TABLE IF NOT EXISTS approvals (
|
|
156
|
+
id TEXT PRIMARY KEY,
|
|
157
|
+
gate_id TEXT NOT NULL,
|
|
158
|
+
gate_name TEXT NOT NULL,
|
|
159
|
+
task_id TEXT,
|
|
160
|
+
mission_id TEXT,
|
|
161
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
162
|
+
payload TEXT,
|
|
163
|
+
requested_at TEXT NOT NULL,
|
|
164
|
+
resolved_at TEXT,
|
|
165
|
+
resolved_by TEXT,
|
|
166
|
+
note TEXT
|
|
167
|
+
);
|
|
168
|
+
CREATE INDEX IF NOT EXISTS idx_approvals_status ON approvals(status);
|
|
169
|
+
CREATE INDEX IF NOT EXISTS idx_approvals_task_id ON approvals(task_id);
|
|
170
|
+
|
|
171
|
+
CREATE TABLE IF NOT EXISTS memory (
|
|
172
|
+
key TEXT PRIMARY KEY,
|
|
173
|
+
content TEXT NOT NULL DEFAULT ''
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
CREATE TABLE IF NOT EXISTS peers (
|
|
177
|
+
id TEXT PRIMARY KEY,
|
|
178
|
+
channel TEXT NOT NULL,
|
|
179
|
+
external_id TEXT NOT NULL,
|
|
180
|
+
display_name TEXT,
|
|
181
|
+
first_seen_at TEXT NOT NULL,
|
|
182
|
+
last_seen_at TEXT NOT NULL,
|
|
183
|
+
linked_to TEXT
|
|
184
|
+
);
|
|
185
|
+
CREATE INDEX IF NOT EXISTS idx_peers_channel ON peers(channel);
|
|
186
|
+
CREATE INDEX IF NOT EXISTS idx_peers_external_id ON peers(external_id);
|
|
187
|
+
|
|
188
|
+
CREATE TABLE IF NOT EXISTS peer_allowlist (
|
|
189
|
+
peer_id TEXT PRIMARY KEY
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
CREATE TABLE IF NOT EXISTS pairing_requests (
|
|
193
|
+
id TEXT PRIMARY KEY,
|
|
194
|
+
peer_id TEXT NOT NULL,
|
|
195
|
+
channel TEXT NOT NULL,
|
|
196
|
+
external_id TEXT NOT NULL,
|
|
197
|
+
display_name TEXT,
|
|
198
|
+
code TEXT NOT NULL UNIQUE,
|
|
199
|
+
created_at TEXT NOT NULL,
|
|
200
|
+
expires_at TEXT NOT NULL,
|
|
201
|
+
resolved INTEGER NOT NULL DEFAULT 0
|
|
202
|
+
);
|
|
203
|
+
CREATE INDEX IF NOT EXISTS idx_pairing_code ON pairing_requests(code);
|
|
204
|
+
CREATE INDEX IF NOT EXISTS idx_pairing_peer ON pairing_requests(peer_id);
|
|
205
|
+
|
|
206
|
+
CREATE TABLE IF NOT EXISTS peer_sessions (
|
|
207
|
+
peer_id TEXT PRIMARY KEY,
|
|
208
|
+
session_id TEXT NOT NULL
|
|
209
|
+
);
|
|
210
|
+
|
|
211
|
+
CREATE TABLE IF NOT EXISTS teams (
|
|
212
|
+
name TEXT PRIMARY KEY,
|
|
213
|
+
description TEXT,
|
|
214
|
+
created_at TEXT NOT NULL,
|
|
215
|
+
updated_at TEXT NOT NULL
|
|
216
|
+
);
|
|
217
|
+
|
|
218
|
+
CREATE TABLE IF NOT EXISTS agents (
|
|
219
|
+
name TEXT PRIMARY KEY,
|
|
220
|
+
team_name TEXT NOT NULL,
|
|
221
|
+
config TEXT NOT NULL,
|
|
222
|
+
created_at TEXT NOT NULL,
|
|
223
|
+
updated_at TEXT NOT NULL
|
|
224
|
+
);
|
|
225
|
+
|
|
226
|
+
CREATE TABLE IF NOT EXISTS vault (
|
|
227
|
+
agent TEXT NOT NULL,
|
|
228
|
+
service TEXT NOT NULL,
|
|
229
|
+
type TEXT NOT NULL,
|
|
230
|
+
label TEXT,
|
|
231
|
+
credentials TEXT NOT NULL,
|
|
232
|
+
created_at TEXT NOT NULL,
|
|
233
|
+
updated_at TEXT NOT NULL,
|
|
234
|
+
PRIMARY KEY (agent, service)
|
|
235
|
+
);
|
|
236
|
+
|
|
237
|
+
CREATE TABLE IF NOT EXISTS playbooks (
|
|
238
|
+
name TEXT PRIMARY KEY,
|
|
239
|
+
description TEXT NOT NULL,
|
|
240
|
+
mission TEXT NOT NULL,
|
|
241
|
+
parameters TEXT,
|
|
242
|
+
version TEXT,
|
|
243
|
+
author TEXT,
|
|
244
|
+
tags TEXT,
|
|
245
|
+
created_at TEXT NOT NULL,
|
|
246
|
+
updated_at TEXT NOT NULL
|
|
247
|
+
);
|
|
248
|
+
`);
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=drizzle-sqlite-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drizzle-sqlite-schema.js","sourceRoot":"","sources":["../../src/core/drizzle-sqlite-schema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAA+B;IAChE,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkPP,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event system for Polpo.
|
|
3
|
+
*
|
|
4
|
+
* Type definitions (PolpoEventMap, PolpoEvent) come from @polpo-ai/core.
|
|
5
|
+
* TypedEmitter (extends Node.js EventEmitter) lives here in the shell.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from "node:events";
|
|
8
|
+
export type { PolpoEventMap, PolpoEvent } from "@polpo-ai/core/events";
|
|
9
|
+
export type { EventBus } from "@polpo-ai/core/event-bus";
|
|
10
|
+
import type { PolpoEvent, PolpoEventMap } from "@polpo-ai/core/events";
|
|
11
|
+
import type { EventBus } from "@polpo-ai/core/event-bus";
|
|
12
|
+
import type { LogStore } from "@polpo-ai/core/log-store";
|
|
13
|
+
export declare class TypedEmitter extends EventEmitter implements EventBus {
|
|
14
|
+
private logSink?;
|
|
15
|
+
/** Attach a persistent log store. All emitted events will be written to it. */
|
|
16
|
+
setLogSink(store: LogStore): void;
|
|
17
|
+
emit<K extends PolpoEvent>(event: K, payload: PolpoEventMap[K]): boolean;
|
|
18
|
+
emit(event: string | symbol, ...args: unknown[]): boolean;
|
|
19
|
+
on<K extends PolpoEvent>(event: K, listener: (payload: PolpoEventMap[K]) => void): this;
|
|
20
|
+
on(event: string | symbol, listener: (...args: unknown[]) => void): this;
|
|
21
|
+
once<K extends PolpoEvent>(event: K, listener: (payload: PolpoEventMap[K]) => void): this;
|
|
22
|
+
once(event: string | symbol, listener: (...args: unknown[]) => void): this;
|
|
23
|
+
off<K extends PolpoEvent>(event: K, listener: (payload: PolpoEventMap[K]) => void): this;
|
|
24
|
+
off(event: string | symbol, listener: (...args: unknown[]) => void): this;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/core/events.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACvE,YAAY,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAKzD,qBAAa,YAAa,SAAQ,YAAa,YAAW,QAAQ;IAChE,OAAO,CAAC,OAAO,CAAC,CAAW;IAE3B,+EAA+E;IAC/E,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAIxB,IAAI,CAAC,CAAC,SAAS,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,OAAO;IACxE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO;IAczD,EAAE,CAAC,CAAC,SAAS,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IACvF,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI;IAKxE,IAAI,CAAC,CAAC,SAAS,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IACzF,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI;IAK1E,GAAG,CAAC,CAAC,SAAS,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IACxF,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI;CAInF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event system for Polpo.
|
|
3
|
+
*
|
|
4
|
+
* Type definitions (PolpoEventMap, PolpoEvent) come from @polpo-ai/core.
|
|
5
|
+
* TypedEmitter (extends Node.js EventEmitter) lives here in the shell.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from "node:events";
|
|
8
|
+
/** Events to exclude from persistent logging (too frequent or internal). */
|
|
9
|
+
const LOG_EXCLUDED = new Set(["orchestrator:tick", "newListener", "removeListener"]);
|
|
10
|
+
export class TypedEmitter extends EventEmitter {
|
|
11
|
+
logSink;
|
|
12
|
+
/** Attach a persistent log store. All emitted events will be written to it. */
|
|
13
|
+
setLogSink(store) {
|
|
14
|
+
this.logSink = store;
|
|
15
|
+
}
|
|
16
|
+
emit(event, ...args) {
|
|
17
|
+
if (this.logSink && typeof event === "string" && !LOG_EXCLUDED.has(event)) {
|
|
18
|
+
try {
|
|
19
|
+
this.logSink.append({
|
|
20
|
+
ts: new Date().toISOString(),
|
|
21
|
+
event,
|
|
22
|
+
data: args[0],
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
catch { /* never let logging break the system */ }
|
|
26
|
+
}
|
|
27
|
+
return super.emit(event, ...args);
|
|
28
|
+
}
|
|
29
|
+
on(event, listener) {
|
|
30
|
+
return super.on(event, listener);
|
|
31
|
+
}
|
|
32
|
+
once(event, listener) {
|
|
33
|
+
return super.once(event, listener);
|
|
34
|
+
}
|
|
35
|
+
off(event, listener) {
|
|
36
|
+
return super.off(event, listener);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=events.js.map
|