shreni 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.
- package/ARCHITECTURE.md +260 -0
- package/LICENSE +201 -0
- package/README.md +519 -0
- package/TRADEMARK.md +97 -0
- package/dist/agents/parikshaka.d.ts +11 -0
- package/dist/agents/parikshaka.d.ts.map +1 -0
- package/dist/agents/parikshaka.js +80 -0
- package/dist/agents/parikshaka.js.map +1 -0
- package/dist/agents/providers/claude.d.ts +3 -0
- package/dist/agents/providers/claude.d.ts.map +1 -0
- package/dist/agents/providers/claude.js +100 -0
- package/dist/agents/providers/claude.js.map +1 -0
- package/dist/agents/providers/codex.d.ts +3 -0
- package/dist/agents/providers/codex.d.ts.map +1 -0
- package/dist/agents/providers/codex.js +123 -0
- package/dist/agents/providers/codex.js.map +1 -0
- package/dist/agents/providers/gemini.d.ts +3 -0
- package/dist/agents/providers/gemini.d.ts.map +1 -0
- package/dist/agents/providers/gemini.js +77 -0
- package/dist/agents/providers/gemini.js.map +1 -0
- package/dist/agents/providers/index.d.ts +6 -0
- package/dist/agents/providers/index.d.ts.map +1 -0
- package/dist/agents/providers/index.js +35 -0
- package/dist/agents/providers/index.js.map +1 -0
- package/dist/agents/providers/registry.d.ts +20 -0
- package/dist/agents/providers/registry.d.ts.map +1 -0
- package/dist/agents/providers/registry.js +91 -0
- package/dist/agents/providers/registry.js.map +1 -0
- package/dist/agents/providers/types.d.ts +42 -0
- package/dist/agents/providers/types.d.ts.map +1 -0
- package/dist/agents/providers/types.js +61 -0
- package/dist/agents/providers/types.js.map +1 -0
- package/dist/agents/runner.d.ts +6 -0
- package/dist/agents/runner.d.ts.map +1 -0
- package/dist/agents/runner.js +159 -0
- package/dist/agents/runner.js.map +1 -0
- package/dist/agents/silpi.d.ts +3 -0
- package/dist/agents/silpi.d.ts.map +1 -0
- package/dist/agents/silpi.js +101 -0
- package/dist/agents/silpi.js.map +1 -0
- package/dist/agents/viharapala.d.ts +5 -0
- package/dist/agents/viharapala.d.ts.map +1 -0
- package/dist/agents/viharapala.js +128 -0
- package/dist/agents/viharapala.js.map +1 -0
- package/dist/cli/agents.d.ts +14 -0
- package/dist/cli/agents.d.ts.map +1 -0
- package/dist/cli/agents.js +47 -0
- package/dist/cli/agents.js.map +1 -0
- package/dist/cli/detect-toolchain.d.ts +10 -0
- package/dist/cli/detect-toolchain.d.ts.map +1 -0
- package/dist/cli/detect-toolchain.js +77 -0
- package/dist/cli/detect-toolchain.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +342 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init-kshetra.d.ts +59 -0
- package/dist/cli/init-kshetra.d.ts.map +1 -0
- package/dist/cli/init-kshetra.js +531 -0
- package/dist/cli/init-kshetra.js.map +1 -0
- package/dist/cli/list.d.ts +11 -0
- package/dist/cli/list.d.ts.map +1 -0
- package/dist/cli/list.js +45 -0
- package/dist/cli/list.js.map +1 -0
- package/dist/cli/logs.d.ts +20 -0
- package/dist/cli/logs.d.ts.map +1 -0
- package/dist/cli/logs.js +144 -0
- package/dist/cli/logs.js.map +1 -0
- package/dist/cli/migrate.d.ts +8 -0
- package/dist/cli/migrate.d.ts.map +1 -0
- package/dist/cli/migrate.js +116 -0
- package/dist/cli/migrate.js.map +1 -0
- package/dist/cli/pause.d.ts +24 -0
- package/dist/cli/pause.d.ts.map +1 -0
- package/dist/cli/pause.js +41 -0
- package/dist/cli/pause.js.map +1 -0
- package/dist/cli/phalaka-autostart.d.ts +11 -0
- package/dist/cli/phalaka-autostart.d.ts.map +1 -0
- package/dist/cli/phalaka-autostart.js +28 -0
- package/dist/cli/phalaka-autostart.js.map +1 -0
- package/dist/cli/phalaka-server.d.ts +2 -0
- package/dist/cli/phalaka-server.d.ts.map +1 -0
- package/dist/cli/phalaka-server.js +20 -0
- package/dist/cli/phalaka-server.js.map +1 -0
- package/dist/cli/phalaka.d.ts +30 -0
- package/dist/cli/phalaka.d.ts.map +1 -0
- package/dist/cli/phalaka.js +60 -0
- package/dist/cli/phalaka.js.map +1 -0
- package/dist/cli/pid.d.ts +9 -0
- package/dist/cli/pid.d.ts.map +1 -0
- package/dist/cli/pid.js +66 -0
- package/dist/cli/pid.js.map +1 -0
- package/dist/cli/provider-preflight.d.ts +11 -0
- package/dist/cli/provider-preflight.d.ts.map +1 -0
- package/dist/cli/provider-preflight.js +70 -0
- package/dist/cli/provider-preflight.js.map +1 -0
- package/dist/cli/register.d.ts +8 -0
- package/dist/cli/register.d.ts.map +1 -0
- package/dist/cli/register.js +34 -0
- package/dist/cli/register.js.map +1 -0
- package/dist/cli/run.d.ts +3 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +40 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/start.d.ts +11 -0
- package/dist/cli/start.d.ts.map +1 -0
- package/dist/cli/start.js +26 -0
- package/dist/cli/start.js.map +1 -0
- package/dist/cli/status.d.ts +39 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +207 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/stop.d.ts +13 -0
- package/dist/cli/stop.d.ts.map +1 -0
- package/dist/cli/stop.js +18 -0
- package/dist/cli/stop.js.map +1 -0
- package/dist/cli/sync.d.ts +6 -0
- package/dist/cli/sync.d.ts.map +1 -0
- package/dist/cli/sync.js +31 -0
- package/dist/cli/sync.js.map +1 -0
- package/dist/cli/tail.d.ts +6 -0
- package/dist/cli/tail.d.ts.map +1 -0
- package/dist/cli/tail.js +170 -0
- package/dist/cli/tail.js.map +1 -0
- package/dist/cli/telemetry.d.ts +2 -0
- package/dist/cli/telemetry.d.ts.map +1 -0
- package/dist/cli/telemetry.js +42 -0
- package/dist/cli/telemetry.js.map +1 -0
- package/dist/cli/verify-hooks.d.ts +12 -0
- package/dist/cli/verify-hooks.d.ts.map +1 -0
- package/dist/cli/verify-hooks.js +38 -0
- package/dist/cli/verify-hooks.js.map +1 -0
- package/dist/cli/worker.d.ts +2 -0
- package/dist/cli/worker.d.ts.map +1 -0
- package/dist/cli/worker.js +211 -0
- package/dist/cli/worker.js.map +1 -0
- package/dist/kshetra/config.d.ts +64 -0
- package/dist/kshetra/config.d.ts.map +1 -0
- package/dist/kshetra/config.js +173 -0
- package/dist/kshetra/config.js.map +1 -0
- package/dist/kshetra/registry.d.ts +5 -0
- package/dist/kshetra/registry.d.ts.map +1 -0
- package/dist/kshetra/registry.js +69 -0
- package/dist/kshetra/registry.js.map +1 -0
- package/dist/kshetra/state.d.ts +57 -0
- package/dist/kshetra/state.d.ts.map +1 -0
- package/dist/kshetra/state.js +195 -0
- package/dist/kshetra/state.js.map +1 -0
- package/dist/kshetra/toolchain.d.ts +20 -0
- package/dist/kshetra/toolchain.d.ts.map +1 -0
- package/dist/kshetra/toolchain.js +146 -0
- package/dist/kshetra/toolchain.js.map +1 -0
- package/dist/phalaka/api.d.ts +123 -0
- package/dist/phalaka/api.d.ts.map +1 -0
- package/dist/phalaka/api.js +196 -0
- package/dist/phalaka/api.js.map +1 -0
- package/dist/phalaka/beads-read.d.ts +49 -0
- package/dist/phalaka/beads-read.d.ts.map +1 -0
- package/dist/phalaka/beads-read.js +174 -0
- package/dist/phalaka/beads-read.js.map +1 -0
- package/dist/phalaka/pid.d.ts +6 -0
- package/dist/phalaka/pid.d.ts.map +1 -0
- package/dist/phalaka/pid.js +48 -0
- package/dist/phalaka/pid.js.map +1 -0
- package/dist/phalaka/server.d.ts +10 -0
- package/dist/phalaka/server.d.ts.map +1 -0
- package/dist/phalaka/server.js +30 -0
- package/dist/phalaka/server.js.map +1 -0
- package/dist/phalaka/token.d.ts +5 -0
- package/dist/phalaka/token.d.ts.map +1 -0
- package/dist/phalaka/token.js +40 -0
- package/dist/phalaka/token.js.map +1 -0
- package/dist/phalaka/ui.d.ts +15 -0
- package/dist/phalaka/ui.d.ts.map +1 -0
- package/dist/phalaka/ui.js +233 -0
- package/dist/phalaka/ui.js.map +1 -0
- package/dist/sthapathi/activity-log.d.ts +68 -0
- package/dist/sthapathi/activity-log.d.ts.map +1 -0
- package/dist/sthapathi/activity-log.js +57 -0
- package/dist/sthapathi/activity-log.js.map +1 -0
- package/dist/sthapathi/beads.d.ts +27 -0
- package/dist/sthapathi/beads.d.ts.map +1 -0
- package/dist/sthapathi/beads.js +153 -0
- package/dist/sthapathi/beads.js.map +1 -0
- package/dist/sthapathi/branch.d.ts +5 -0
- package/dist/sthapathi/branch.d.ts.map +1 -0
- package/dist/sthapathi/branch.js +20 -0
- package/dist/sthapathi/branch.js.map +1 -0
- package/dist/sthapathi/dispatch.d.ts +14 -0
- package/dist/sthapathi/dispatch.d.ts.map +1 -0
- package/dist/sthapathi/dispatch.js +326 -0
- package/dist/sthapathi/dispatch.js.map +1 -0
- package/dist/sthapathi/errors.d.ts +27 -0
- package/dist/sthapathi/errors.d.ts.map +1 -0
- package/dist/sthapathi/errors.js +174 -0
- package/dist/sthapathi/errors.js.map +1 -0
- package/dist/sthapathi/gh.d.ts +19 -0
- package/dist/sthapathi/gh.d.ts.map +1 -0
- package/dist/sthapathi/gh.js +69 -0
- package/dist/sthapathi/gh.js.map +1 -0
- package/dist/sthapathi/git.d.ts +41 -0
- package/dist/sthapathi/git.d.ts.map +1 -0
- package/dist/sthapathi/git.js +199 -0
- package/dist/sthapathi/git.js.map +1 -0
- package/dist/sthapathi/guard.d.ts +24 -0
- package/dist/sthapathi/guard.d.ts.map +1 -0
- package/dist/sthapathi/guard.js +64 -0
- package/dist/sthapathi/guard.js.map +1 -0
- package/dist/sthapathi/health.d.ts +23 -0
- package/dist/sthapathi/health.d.ts.map +1 -0
- package/dist/sthapathi/health.js +142 -0
- package/dist/sthapathi/health.js.map +1 -0
- package/dist/sthapathi/index.d.ts +21 -0
- package/dist/sthapathi/index.d.ts.map +1 -0
- package/dist/sthapathi/index.js +88 -0
- package/dist/sthapathi/index.js.map +1 -0
- package/dist/sthapathi/lifecycle.d.ts +7 -0
- package/dist/sthapathi/lifecycle.d.ts.map +1 -0
- package/dist/sthapathi/lifecycle.js +43 -0
- package/dist/sthapathi/lifecycle.js.map +1 -0
- package/dist/sthapathi/lint.d.ts +8 -0
- package/dist/sthapathi/lint.d.ts.map +1 -0
- package/dist/sthapathi/lint.js +33 -0
- package/dist/sthapathi/lint.js.map +1 -0
- package/dist/sthapathi/merge.d.ts +18 -0
- package/dist/sthapathi/merge.d.ts.map +1 -0
- package/dist/sthapathi/merge.js +259 -0
- package/dist/sthapathi/merge.js.map +1 -0
- package/dist/sthapathi/notifications.d.ts +14 -0
- package/dist/sthapathi/notifications.d.ts.map +1 -0
- package/dist/sthapathi/notifications.js +57 -0
- package/dist/sthapathi/notifications.js.map +1 -0
- package/dist/sthapathi/parikshaka-dispatch.d.ts +12 -0
- package/dist/sthapathi/parikshaka-dispatch.d.ts.map +1 -0
- package/dist/sthapathi/parikshaka-dispatch.js +0 -0
- package/dist/sthapathi/parikshaka-dispatch.js.map +1 -0
- package/dist/sthapathi/pickup.d.ts +13 -0
- package/dist/sthapathi/pickup.d.ts.map +1 -0
- package/dist/sthapathi/pickup.js +144 -0
- package/dist/sthapathi/pickup.js.map +1 -0
- package/dist/sthapathi/recover.d.ts +16 -0
- package/dist/sthapathi/recover.d.ts.map +1 -0
- package/dist/sthapathi/recover.js +149 -0
- package/dist/sthapathi/recover.js.map +1 -0
- package/dist/sthapathi/retry.d.ts +11 -0
- package/dist/sthapathi/retry.d.ts.map +1 -0
- package/dist/sthapathi/retry.js +42 -0
- package/dist/sthapathi/retry.js.map +1 -0
- package/dist/sthapathi/self-heal.d.ts +19 -0
- package/dist/sthapathi/self-heal.d.ts.map +1 -0
- package/dist/sthapathi/self-heal.js +46 -0
- package/dist/sthapathi/self-heal.js.map +1 -0
- package/dist/sthapathi/types.d.ts +56 -0
- package/dist/sthapathi/types.d.ts.map +1 -0
- package/dist/sthapathi/types.js +4 -0
- package/dist/sthapathi/types.js.map +1 -0
- package/dist/sthapathi/watchdog.d.ts +27 -0
- package/dist/sthapathi/watchdog.d.ts.map +1 -0
- package/dist/sthapathi/watchdog.js +145 -0
- package/dist/sthapathi/watchdog.js.map +1 -0
- package/dist/telemetry/telemetry.d.ts +42 -0
- package/dist/telemetry/telemetry.d.ts.map +1 -0
- package/dist/telemetry/telemetry.js +189 -0
- package/dist/telemetry/telemetry.js.map +1 -0
- package/dist/test-setup.d.ts +2 -0
- package/dist/test-setup.d.ts.map +1 -0
- package/dist/test-setup.js +16 -0
- package/dist/test-setup.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildAgentContext = buildAgentContext;
|
|
4
|
+
exports.runSilpiSafe = runSilpiSafe;
|
|
5
|
+
exports.runViharapalaSafe = runViharapalaSafe;
|
|
6
|
+
exports.runSilpiViharapalaLoop = runSilpiViharapalaLoop;
|
|
7
|
+
exports.runHealthRepairLoop = runHealthRepairLoop;
|
|
8
|
+
const promises_1 = require("fs/promises");
|
|
9
|
+
const path_1 = require("path");
|
|
10
|
+
const os_1 = require("os");
|
|
11
|
+
const beads_js_1 = require("./beads.js");
|
|
12
|
+
const silpi_js_1 = require("../agents/silpi.js");
|
|
13
|
+
const viharapala_js_1 = require("../agents/viharapala.js");
|
|
14
|
+
const retry_js_1 = require("./retry.js");
|
|
15
|
+
const errors_js_1 = require("./errors.js");
|
|
16
|
+
const activity_log_js_1 = require("./activity-log.js");
|
|
17
|
+
const branch_js_1 = require("./branch.js");
|
|
18
|
+
const merge_js_1 = require("./merge.js");
|
|
19
|
+
const health_js_1 = require("./health.js");
|
|
20
|
+
const lint_js_1 = require("./lint.js");
|
|
21
|
+
const state_js_1 = require("../kshetra/state.js");
|
|
22
|
+
const errors_js_2 = require("./errors.js");
|
|
23
|
+
const guard_js_1 = require("./guard.js");
|
|
24
|
+
// Bail out of a round loop the instant a self-heal abort is requested, so the
|
|
25
|
+
// worker's RECOVER isn't racing a fresh round starting between agent calls
|
|
26
|
+
//. Throwing AgentAbortedError unwinds cleanly through
|
|
27
|
+
// runTaskSafely, which swallows it (no cycle-error handling).
|
|
28
|
+
function throwIfAborted(signal) {
|
|
29
|
+
if (signal?.aborted)
|
|
30
|
+
throw new errors_js_2.AgentAbortedError();
|
|
31
|
+
}
|
|
32
|
+
async function readFileOptional(filePath) {
|
|
33
|
+
try {
|
|
34
|
+
return await (0, promises_1.readFile)(filePath, 'utf8');
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return '';
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async function loadUniversalSkills() {
|
|
41
|
+
return readFileOptional((0, path_1.join)((0, os_1.homedir)(), '.shreni', 'skills', 'SKILLS.md'));
|
|
42
|
+
}
|
|
43
|
+
async function buildAgentContext(kshetra, task) {
|
|
44
|
+
const bdClient = (0, beads_js_1.bd)(kshetra);
|
|
45
|
+
// Injection flip (the agent-execution design §3.1): the provider CLI now loads the
|
|
46
|
+
// repo's own config natively (instruction file, `.claude/` skills/rules/
|
|
47
|
+
// subagents, per-dir CLAUDE.md, the @-imported conventions docs), so Shreni no
|
|
48
|
+
// longer reads-and-injects any of that — doing so would double-load. Shreni
|
|
49
|
+
// injects only what has no repo-native home: bd's workflow context, the task
|
|
50
|
+
// details + acceptance criteria, the cross-project universalSkills, and the
|
|
51
|
+
// reviewer-only reviewGuide (§3.3 — no provider has a reviewer-only native
|
|
52
|
+
// file, so this one stays Shreni-injected).
|
|
53
|
+
const reviewGuidePath = kshetra.conventions?.reviewGuide
|
|
54
|
+
? (0, path_1.join)(kshetra.repo.path, kshetra.conventions.reviewGuide)
|
|
55
|
+
: null;
|
|
56
|
+
const [projectMemory, taskDetails, universalSkills, reviewGuide] = await Promise.all([
|
|
57
|
+
bdClient.prime(),
|
|
58
|
+
bdClient.show(task.id),
|
|
59
|
+
loadUniversalSkills(),
|
|
60
|
+
reviewGuidePath ? readFileOptional(reviewGuidePath) : Promise.resolve(''),
|
|
61
|
+
]);
|
|
62
|
+
return {
|
|
63
|
+
kshetra,
|
|
64
|
+
task,
|
|
65
|
+
projectMemory,
|
|
66
|
+
taskDetails,
|
|
67
|
+
universalSkills,
|
|
68
|
+
reviewGuide,
|
|
69
|
+
// NOT YET IMPLEMENTED: RAG codebase-search retrieval is not wired up, so no
|
|
70
|
+
// relevant-code chunks are injected. Silpi guards on truthiness
|
|
71
|
+
// (silpi.ts: `if (context.ragChunks)`), so an empty string simply omits the
|
|
72
|
+
// "== RELEVANT CODE ==" section. Populate this once retrieval lands.
|
|
73
|
+
ragChunks: '',
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
async function runSilpiSafe(kshetra, task, context, round, branch, feedback) {
|
|
77
|
+
const bdClient = (0, beads_js_1.bd)(kshetra);
|
|
78
|
+
await bdClient.addNote(task.id, `Round ${round}: dispatching Silpi`);
|
|
79
|
+
try {
|
|
80
|
+
const output = await (0, retry_js_1.withRetry)(`Silpi r${round}`, () => (0, silpi_js_1.runSilpi)(context, round, feedback, branch));
|
|
81
|
+
await bdClient.addNote(task.id, `Round ${round}: Silpi submitted`);
|
|
82
|
+
return output;
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
if (err instanceof errors_js_1.ParseError) {
|
|
86
|
+
await bdClient.addNote(task.id, `Round ${round}: Silpi output malformed — ${err.message}`);
|
|
87
|
+
throw new errors_js_1.AgentError('MALFORMED_OUTPUT', { task, round, cause: err });
|
|
88
|
+
}
|
|
89
|
+
await bdClient.addNote(task.id, `Round ${round}: Silpi failed after retries — ${err.message}`);
|
|
90
|
+
throw new errors_js_1.AgentError('API_FAILURE', { task, round, cause: err });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async function runViharapalaSafe(kshetra, task, context, silpiOut, round, branch) {
|
|
94
|
+
const bdClient = (0, beads_js_1.bd)(kshetra);
|
|
95
|
+
await bdClient.addNote(task.id, `Round ${round}: dispatching Viharapala`);
|
|
96
|
+
try {
|
|
97
|
+
const output = await (0, retry_js_1.withRetry)(`Viharapala r${round}`, () => (0, viharapala_js_1.runViharapala)(context, silpiOut, round, context.taskDetails, branch));
|
|
98
|
+
await bdClient.addNote(task.id, `Round ${round}: ${output.verdict}`);
|
|
99
|
+
return output;
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
if (err instanceof errors_js_1.ParseError) {
|
|
103
|
+
await bdClient.addNote(task.id, `Round ${round}: Viharapala output malformed — ${err.message}`);
|
|
104
|
+
throw new errors_js_1.AgentError('MALFORMED_OUTPUT', { task, round, cause: err });
|
|
105
|
+
}
|
|
106
|
+
await bdClient.addNote(task.id, `Round ${round}: Viharapala failed after retries — ${err.message}`);
|
|
107
|
+
throw new errors_js_1.AgentError('API_FAILURE', { task, round, cause: err });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Verify the agent stayed on the bead branch and left main untouched. On a
|
|
111
|
+
// violation, salvage any stray commits, restore main, flag the bead, and return
|
|
112
|
+
// an abort result for the caller to return immediately. Returns null when clean.
|
|
113
|
+
async function guardAfterAgent(kshetra, task, guard, round) {
|
|
114
|
+
try {
|
|
115
|
+
await (0, guard_js_1.assertOnBranch)(kshetra, guard);
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
if (!(err instanceof guard_js_1.OffBranchError))
|
|
120
|
+
throw err;
|
|
121
|
+
const salvage = await (0, guard_js_1.recoverOffBranch)(kshetra, task, guard);
|
|
122
|
+
const salvageNote = salvage ? ` Stray commits preserved on "${salvage}".` : '';
|
|
123
|
+
(0, activity_log_js_1.emit)({ type: 'task_done', kshetra: kshetra.id, beadId: task.id, title: task.title, approved: false, rounds: round });
|
|
124
|
+
await (0, beads_js_1.bd)(kshetra).flag(task.id, `Aborted round ${round}: agent left the bead branch — ${err.message}. ` +
|
|
125
|
+
`main restored to origin.${salvageNote} Investigate manually.`);
|
|
126
|
+
return { approved: false, note: `Aborted: off-branch (${err.detail.actualHead})` };
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async function runSilpiViharapalaLoop(kshetra, task, _branchParam, signal) {
|
|
130
|
+
if ((0, health_js_1.isHealthBead)(task)) {
|
|
131
|
+
return runHealthRepairLoop(kshetra, task, signal);
|
|
132
|
+
}
|
|
133
|
+
const bdClient = (0, beads_js_1.bd)(kshetra);
|
|
134
|
+
let round = 0;
|
|
135
|
+
let feedback = null;
|
|
136
|
+
let lastSilpiOut = null;
|
|
137
|
+
// Why the most recent round failed — so the terminal "blocked" message can
|
|
138
|
+
// tell "your own tests/lint failed" apart from "the reviewer rejected you".
|
|
139
|
+
let lastRejectSource = null;
|
|
140
|
+
(0, activity_log_js_1.emit)({ type: 'task_claimed', kshetra: kshetra.id, beadId: task.id, title: task.title });
|
|
141
|
+
// Claiming a bead is forward progress — stamp liveness and clear the stall track so
|
|
142
|
+
// a fresh cycle never re-trips the watchdog on a stale repeat count (the design §3.2).
|
|
143
|
+
(0, state_js_1.recordProgress)(kshetra);
|
|
144
|
+
// Create the bead branch; workers operate on this branch for the whole lifecycle.
|
|
145
|
+
const branch = await (0, branch_js_1.createTaskBranch)(task, kshetra);
|
|
146
|
+
// Snapshot the sanctioned starting point (on-branch, main at origin) so each
|
|
147
|
+
// round can prove the agent didn't commit to main or wander off-branch.
|
|
148
|
+
const guard = await (0, guard_js_1.captureGuard)(kshetra, branch);
|
|
149
|
+
while (round < kshetra.agents.maxRoundsPerBead) {
|
|
150
|
+
round++;
|
|
151
|
+
throwIfAborted(signal);
|
|
152
|
+
(0, activity_log_js_1.emit)({ type: 'round_start', kshetra: kshetra.id, beadId: task.id, round, agent: 'silpi' });
|
|
153
|
+
const context = await buildAgentContext(kshetra, task);
|
|
154
|
+
const silpiOut = await (0, silpi_js_1.runSilpi)(context, round, feedback, branch, signal);
|
|
155
|
+
lastSilpiOut = silpiOut;
|
|
156
|
+
const offBranch = await guardAfterAgent(kshetra, task, guard, round);
|
|
157
|
+
if (offBranch)
|
|
158
|
+
return offBranch;
|
|
159
|
+
// Baseline-aware test gate: treat the suite as passing when the current
|
|
160
|
+
// failCount is within the accepted baseline of known/quarantined failures.
|
|
161
|
+
// This mirrors the health-repair loop and the pickup gate, so pre-existing
|
|
162
|
+
// unrelated failures (or ones quarantined into the baseline) don't auto-
|
|
163
|
+
// reject an otherwise clean diff. A task that ADDS failures (failCount >
|
|
164
|
+
// baseline) makes health.green false and still rejects, so real regressions
|
|
165
|
+
// are not let through. silpiOut.testsPassed is kept for logging only.
|
|
166
|
+
const health = await (0, health_js_1.measureHealth)(kshetra);
|
|
167
|
+
// Enforced lint gate: run stack.lintCommand ourselves rather than trusting
|
|
168
|
+
// Silpi's self-reported lintPassed (the toolchain design §3.3). When no lint gate
|
|
169
|
+
// is configured, runLintGate skips-and-logs and reports passed=true.
|
|
170
|
+
const lint = await (0, lint_js_1.runLintGate)(kshetra);
|
|
171
|
+
(0, activity_log_js_1.emit)({
|
|
172
|
+
type: 'silpi_done',
|
|
173
|
+
kshetra: kshetra.id,
|
|
174
|
+
beadId: task.id,
|
|
175
|
+
round,
|
|
176
|
+
summary: silpiOut.summary,
|
|
177
|
+
confidence: silpiOut.confidenceScore,
|
|
178
|
+
files: silpiOut.filesChanged.map(f => f.path),
|
|
179
|
+
lintPassed: lint.passed,
|
|
180
|
+
testsPassed: health.green,
|
|
181
|
+
});
|
|
182
|
+
for (const insight of silpiOut.insights) {
|
|
183
|
+
await bdClient.remember(insight);
|
|
184
|
+
}
|
|
185
|
+
if (!health.green || !lint.passed) {
|
|
186
|
+
await bdClient.addNote(task.id, `Round ${round}: lint/tests failed`);
|
|
187
|
+
lastRejectSource = 'tests';
|
|
188
|
+
feedback = {
|
|
189
|
+
verdict: 'REJECT',
|
|
190
|
+
mustFix: ['Tests or lint failed — fix before resubmitting'],
|
|
191
|
+
overallScore: 0,
|
|
192
|
+
suggestions: [],
|
|
193
|
+
issues: [],
|
|
194
|
+
insights: [],
|
|
195
|
+
};
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
await bdClient.addNote(task.id, `Round ${round}: submitted for review`);
|
|
199
|
+
throwIfAborted(signal);
|
|
200
|
+
(0, activity_log_js_1.emit)({ type: 'round_start', kshetra: kshetra.id, beadId: task.id, round, agent: 'viharapala' });
|
|
201
|
+
feedback = await (0, viharapala_js_1.runViharapala)(context, silpiOut, round, context.taskDetails, branch, signal);
|
|
202
|
+
(0, activity_log_js_1.emit)({
|
|
203
|
+
type: 'viharapala_done',
|
|
204
|
+
kshetra: kshetra.id,
|
|
205
|
+
beadId: task.id,
|
|
206
|
+
round,
|
|
207
|
+
verdict: feedback.verdict,
|
|
208
|
+
score: feedback.overallScore,
|
|
209
|
+
mustFix: feedback.mustFix,
|
|
210
|
+
});
|
|
211
|
+
for (const insight of feedback.insights) {
|
|
212
|
+
await bdClient.remember(insight);
|
|
213
|
+
}
|
|
214
|
+
await bdClient.addNote(task.id, `Round ${round}: ${feedback.verdict}`);
|
|
215
|
+
if (feedback.verdict === 'APPROVE') {
|
|
216
|
+
(0, activity_log_js_1.emit)({ type: 'task_done', kshetra: kshetra.id, beadId: task.id, title: task.title, approved: true, rounds: round });
|
|
217
|
+
(0, state_js_1.recordProgress)(kshetra); // a completed bead is forward progress (the design §3.2)
|
|
218
|
+
// mergePolicy (3r2): 'pr' opens a PR and defers (bead stays open, closed on
|
|
219
|
+
// merge by reconcilePullRequests); 'push' squash-merges to main + closes now.
|
|
220
|
+
if ((0, merge_js_1.resolveMergePolicy)(kshetra) === 'pr') {
|
|
221
|
+
await (0, merge_js_1.openPrAndDefer)(task, kshetra, silpiOut);
|
|
222
|
+
return { approved: true, note: `Approved round ${round} — PR opened, awaiting merge` };
|
|
223
|
+
}
|
|
224
|
+
// Squash-merge the bead branch into main, close the task, fire Parikshaka
|
|
225
|
+
await (0, merge_js_1.squashMergeAndClose)(task, kshetra, silpiOut);
|
|
226
|
+
return { approved: true, note: `Approved round ${round}` };
|
|
227
|
+
}
|
|
228
|
+
lastRejectSource = 'reviewer';
|
|
229
|
+
}
|
|
230
|
+
(0, activity_log_js_1.emit)({ type: 'task_done', kshetra: kshetra.id, beadId: task.id, title: task.title, approved: false, rounds: round });
|
|
231
|
+
const cause = lastRejectSource === 'tests'
|
|
232
|
+
? "task's own tests/lint kept failing"
|
|
233
|
+
: 'Viharapala kept rejecting';
|
|
234
|
+
await bdClient.flag(task.id, `Blocked after ${round} rounds — ${cause}.`);
|
|
235
|
+
return { approved: false, note: `Blocked after ${round} rounds (${lastRejectSource ?? 'unknown'})` };
|
|
236
|
+
}
|
|
237
|
+
// Repair loop for [shreni-health] beads. Exempt from the green precondition
|
|
238
|
+
// (it is the thing that restores green); gated on "failures must strictly
|
|
239
|
+
// decrease" instead. On reaching zero it merges and resets the baseline. If it
|
|
240
|
+
// stalls, it quarantines the remaining failures (bumps the accepted baseline so
|
|
241
|
+
// feature work isn't wedged forever) and flags for a human.
|
|
242
|
+
async function runHealthRepairLoop(kshetra, task, signal) {
|
|
243
|
+
const bdClient = (0, beads_js_1.bd)(kshetra);
|
|
244
|
+
let round = 0;
|
|
245
|
+
let feedback = null;
|
|
246
|
+
let lastSilpiOut = null;
|
|
247
|
+
(0, activity_log_js_1.emit)({ type: 'task_claimed', kshetra: kshetra.id, beadId: task.id, title: task.title });
|
|
248
|
+
(0, state_js_1.recordProgress)(kshetra); // forward progress: a repair bead claimed (the design §3.2)
|
|
249
|
+
const branch = await (0, branch_js_1.createTaskBranch)(task, kshetra);
|
|
250
|
+
const guard = await (0, guard_js_1.captureGuard)(kshetra, branch);
|
|
251
|
+
// Failures on the branch before any repair work — the bar each round must beat.
|
|
252
|
+
let prevFailCount = (await (0, health_js_1.measureHealth)(kshetra)).failCount;
|
|
253
|
+
await bdClient.addNote(task.id, `Repair start: ${prevFailCount} failing`);
|
|
254
|
+
while (round < kshetra.agents.maxRoundsPerBead) {
|
|
255
|
+
round++;
|
|
256
|
+
throwIfAborted(signal);
|
|
257
|
+
(0, activity_log_js_1.emit)({ type: 'round_start', kshetra: kshetra.id, beadId: task.id, round, agent: 'silpi' });
|
|
258
|
+
const context = await buildAgentContext(kshetra, task);
|
|
259
|
+
const silpiOut = await (0, silpi_js_1.runSilpi)(context, round, feedback, branch, signal);
|
|
260
|
+
lastSilpiOut = silpiOut;
|
|
261
|
+
for (const insight of silpiOut.insights) {
|
|
262
|
+
await bdClient.remember(insight);
|
|
263
|
+
}
|
|
264
|
+
const offBranch = await guardAfterAgent(kshetra, task, guard, round);
|
|
265
|
+
if (offBranch)
|
|
266
|
+
return offBranch;
|
|
267
|
+
const health = await (0, health_js_1.measureHealth)(kshetra);
|
|
268
|
+
(0, activity_log_js_1.emit)({
|
|
269
|
+
type: 'silpi_done',
|
|
270
|
+
kshetra: kshetra.id,
|
|
271
|
+
beadId: task.id,
|
|
272
|
+
round,
|
|
273
|
+
summary: silpiOut.summary,
|
|
274
|
+
confidence: silpiOut.confidenceScore,
|
|
275
|
+
files: silpiOut.filesChanged.map(f => f.path),
|
|
276
|
+
lintPassed: silpiOut.lintPassed,
|
|
277
|
+
testsPassed: health.green,
|
|
278
|
+
});
|
|
279
|
+
if (health.green) {
|
|
280
|
+
await bdClient.addNote(task.id, `Round ${round}: suite green — merging`);
|
|
281
|
+
(0, activity_log_js_1.emit)({ type: 'task_done', kshetra: kshetra.id, beadId: task.id, title: task.title, approved: true, rounds: round });
|
|
282
|
+
(0, state_js_1.recordProgress)(kshetra); // suite restored to green is forward progress (the design §3.2)
|
|
283
|
+
// Health-repair beads ALWAYS merge to main directly, regardless of
|
|
284
|
+
// mergePolicy: they are the mechanism that restores a green base so feature
|
|
285
|
+
// work can proceed, so deferring one behind a human PR gate would wedge the
|
|
286
|
+
// whole queue. Only feature work honours the 'pr' policy.
|
|
287
|
+
await (0, merge_js_1.squashMergeAndClose)(task, kshetra, silpiOut);
|
|
288
|
+
(0, state_js_1.setHealthBaseline)(kshetra, 0);
|
|
289
|
+
return { approved: true, note: `Suite restored to green round ${round}` };
|
|
290
|
+
}
|
|
291
|
+
if (health.failCount >= 0 && health.failCount < prevFailCount) {
|
|
292
|
+
await bdClient.addNote(task.id, `Round ${round}: progress ${prevFailCount} -> ${health.failCount} failing`);
|
|
293
|
+
prevFailCount = health.failCount;
|
|
294
|
+
feedback = repairFeedback(health.failCount, true);
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
await bdClient.addNote(task.id, `Round ${round}: no progress (${health.failCount} failing)`);
|
|
298
|
+
feedback = repairFeedback(health.failCount, false);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// Stalled: quarantine the remaining failures so the rest of the queue can move,
|
|
302
|
+
// and escalate. Without this, an unfixable suite would wedge the whole Kshetra.
|
|
303
|
+
void lastSilpiOut;
|
|
304
|
+
(0, state_js_1.setHealthBaseline)(kshetra, prevFailCount);
|
|
305
|
+
(0, activity_log_js_1.emit)({ type: 'task_done', kshetra: kshetra.id, beadId: task.id, title: task.title, approved: false, rounds: round });
|
|
306
|
+
await bdClient.flag(task.id, `[needs-human] Could not restore green after ${round} rounds — ` +
|
|
307
|
+
`${prevFailCount} failing test(s) quarantined as the accepted baseline. ` +
|
|
308
|
+
`Investigate manually; feature work resumes against this baseline.`);
|
|
309
|
+
return { approved: false, note: `Quarantined ${prevFailCount} failing after ${round} rounds` };
|
|
310
|
+
}
|
|
311
|
+
function repairFeedback(failCount, progress) {
|
|
312
|
+
const label = failCount >= 0 ? `${failCount}` : 'some';
|
|
313
|
+
return {
|
|
314
|
+
verdict: 'REJECT',
|
|
315
|
+
mustFix: [
|
|
316
|
+
progress
|
|
317
|
+
? `${label} test(s) still failing — keep fixing, do not touch unrelated code.`
|
|
318
|
+
: `Still ${label} failing and no progress this round — try a different approach; fix the tests, don't delete them.`,
|
|
319
|
+
],
|
|
320
|
+
overallScore: 0,
|
|
321
|
+
suggestions: [],
|
|
322
|
+
issues: [],
|
|
323
|
+
insights: [],
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=dispatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/sthapathi/dispatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { KshetraConfig } from '../kshetra/config.js';
|
|
2
|
+
import type { Task } from './types.js';
|
|
3
|
+
export declare class ParseError extends Error {
|
|
4
|
+
readonly cause?: unknown | undefined;
|
|
5
|
+
constructor(message: string, cause?: unknown | undefined);
|
|
6
|
+
}
|
|
7
|
+
export declare class AgentAbortedError extends Error {
|
|
8
|
+
constructor(message?: string);
|
|
9
|
+
}
|
|
10
|
+
export type AgentErrorKind = 'MALFORMED_OUTPUT' | 'API_FAILURE';
|
|
11
|
+
export declare class AgentError extends Error {
|
|
12
|
+
readonly kind: AgentErrorKind;
|
|
13
|
+
readonly context: {
|
|
14
|
+
task: Task;
|
|
15
|
+
round: number;
|
|
16
|
+
cause?: unknown;
|
|
17
|
+
};
|
|
18
|
+
constructor(kind: AgentErrorKind, context: {
|
|
19
|
+
task: Task;
|
|
20
|
+
round: number;
|
|
21
|
+
cause?: unknown;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
export declare function cleanupBranch(kshetra: KshetraConfig, task: Task): Promise<void>;
|
|
25
|
+
export declare function notifyOperator(kshetra: KshetraConfig, task: Task | null, event: string, reason?: string, remediation?: string): Promise<void>;
|
|
26
|
+
export declare function handleCycleError(kshetra: KshetraConfig, task: Task | null, err: Error): Promise<void>;
|
|
27
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/sthapathi/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAOvC,qBAAa,UAAW,SAAQ,KAAK;aACU,KAAK,CAAC,EAAE,OAAO;gBAAhD,OAAO,EAAE,MAAM,EAAkB,KAAK,CAAC,EAAE,OAAO,YAAA;CAI7D;AAQD,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,OAAO,SAAoC;CAIxD;AAED,MAAM,MAAM,cAAc,GAAG,kBAAkB,GAAG,aAAa,CAAC;AAEhE,qBAAa,UAAW,SAAQ,KAAK;aAEjB,IAAI,EAAE,cAAc;aACpB,OAAO,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;gBADvD,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAK1E;AA2BD,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAYrF;AAMD,wBAAsB,cAAc,CAClC,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,IAAI,GAAG,IAAI,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,IAAI,GAAG,IAAI,EACjB,GAAG,EAAE,KAAK,GACT,OAAO,CAAC,IAAI,CAAC,CAwEf"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AgentError = exports.AgentAbortedError = exports.ParseError = void 0;
|
|
4
|
+
exports.cleanupBranch = cleanupBranch;
|
|
5
|
+
exports.notifyOperator = notifyOperator;
|
|
6
|
+
exports.handleCycleError = handleCycleError;
|
|
7
|
+
const beads_js_1 = require("./beads.js");
|
|
8
|
+
const state_js_1 = require("../kshetra/state.js");
|
|
9
|
+
const git_js_1 = require("./git.js");
|
|
10
|
+
const branch_js_1 = require("./branch.js");
|
|
11
|
+
const notifications_js_1 = require("./notifications.js");
|
|
12
|
+
class ParseError extends Error {
|
|
13
|
+
cause;
|
|
14
|
+
constructor(message, cause) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.cause = cause;
|
|
17
|
+
this.name = 'ParseError';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.ParseError = ParseError;
|
|
21
|
+
// Thrown when an in-flight agent run is deliberately aborted for self-heal
|
|
22
|
+
//: `shreni resume` on a hung (reason:'stuck') worker cancels
|
|
23
|
+
// the wedged provider subprocess so the worker can RECOVER in-process. This is a
|
|
24
|
+
// SANCTIONED cancellation, not a failure — handleCycleError/classifyError must
|
|
25
|
+
// never see it (it would flag the bead and clean the branch out from under the
|
|
26
|
+
// recovery path), so runTaskSafely intercepts it and returns quietly.
|
|
27
|
+
class AgentAbortedError extends Error {
|
|
28
|
+
constructor(message = 'agent run aborted for self-heal') {
|
|
29
|
+
super(message);
|
|
30
|
+
this.name = 'AgentAbortedError';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.AgentAbortedError = AgentAbortedError;
|
|
34
|
+
class AgentError extends Error {
|
|
35
|
+
kind;
|
|
36
|
+
context;
|
|
37
|
+
constructor(kind, context) {
|
|
38
|
+
super(`${kind}: ${context.cause?.message ?? String(context.cause)}`);
|
|
39
|
+
this.kind = kind;
|
|
40
|
+
this.context = context;
|
|
41
|
+
this.name = 'AgentError';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.AgentError = AgentError;
|
|
45
|
+
function classifyError(err) {
|
|
46
|
+
if (err instanceof beads_js_1.BeadsError)
|
|
47
|
+
return 'BD_FAILED';
|
|
48
|
+
if (err instanceof git_js_1.GitError)
|
|
49
|
+
return 'GIT_FAILED';
|
|
50
|
+
if (err instanceof AgentError) {
|
|
51
|
+
return err.kind === 'MALFORMED_OUTPUT' ? 'MALFORMED_OUTPUT' : 'AGENT_FAILED';
|
|
52
|
+
}
|
|
53
|
+
const e = err;
|
|
54
|
+
const apiDownStatuses = [429, 502, 503, 529];
|
|
55
|
+
if (e.status !== undefined && apiDownStatuses.includes(e.status))
|
|
56
|
+
return 'API_DOWN';
|
|
57
|
+
const msg = e.message ?? e.code ?? '';
|
|
58
|
+
if (msg.includes('ECONNRESET') || msg.includes('ETIMEDOUT') || msg.includes('ENOTFOUND')) {
|
|
59
|
+
return 'API_DOWN';
|
|
60
|
+
}
|
|
61
|
+
return 'UNKNOWN';
|
|
62
|
+
}
|
|
63
|
+
// The bead branch is created at the start of every cycle but only deleted on
|
|
64
|
+
// the success path (squashMergeAndClose). On a terminal failure we abandon the
|
|
65
|
+
// branch here so it can't linger and silently wedge the next pickup() — a
|
|
66
|
+
// leftover branch makes preFlightCheck throw on every poll. Best-effort: a
|
|
67
|
+
// cleanup failure must never mask the original cycle error. NOT called for
|
|
68
|
+
// GIT_FAILED / merge conflicts, where the branch is deliberately kept for
|
|
69
|
+
// human inspection.
|
|
70
|
+
async function cleanupBranch(kshetra, task) {
|
|
71
|
+
const g = (0, git_js_1.git)(kshetra);
|
|
72
|
+
const branch = (0, branch_js_1.branchName)(task);
|
|
73
|
+
try {
|
|
74
|
+
if (!(await g.branchExists(branch)))
|
|
75
|
+
return;
|
|
76
|
+
// Must be off the branch to delete it; force-delete since the abandoned
|
|
77
|
+
// branch may hold partial commits we are discarding.
|
|
78
|
+
await g.checkout(kshetra.repo.mainBranch);
|
|
79
|
+
await g.deleteBranch(branch, { force: true });
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
console.warn(`[shreni:${kshetra.id}] failed to clean up branch ${branch}: ${err.message}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Notify a human of an end-state / stuck-state that needs intervention. Appends
|
|
86
|
+
// a durable record to the per-Kshetra notifications feed (polled by Phalaka) and
|
|
87
|
+
// logs it. The message names the cause and, when provided, lists remediation
|
|
88
|
+
// steps. Never throws — notification must not crash the worker.
|
|
89
|
+
async function notifyOperator(kshetra, task, event, reason, remediation) {
|
|
90
|
+
const lines = [`[${kshetra.name}] ${event.replace(/_/g, ' ').toUpperCase()}`];
|
|
91
|
+
if (task)
|
|
92
|
+
lines.push(`Bead: ${task.id} — ${task.title}`);
|
|
93
|
+
if (reason)
|
|
94
|
+
lines.push(`Cause: ${reason}`);
|
|
95
|
+
if (remediation)
|
|
96
|
+
lines.push(`Try:\n${remediation}`);
|
|
97
|
+
const message = lines.join('\n');
|
|
98
|
+
(0, notifications_js_1.appendNotification)(kshetra.id, {
|
|
99
|
+
ts: new Date().toISOString(),
|
|
100
|
+
event,
|
|
101
|
+
beadId: task?.id,
|
|
102
|
+
reason,
|
|
103
|
+
remediation,
|
|
104
|
+
message,
|
|
105
|
+
});
|
|
106
|
+
console.error(`[shreni notify:${kshetra.id}] ${message}`);
|
|
107
|
+
}
|
|
108
|
+
async function handleCycleError(kshetra, task, err) {
|
|
109
|
+
const bdClient = (0, beads_js_1.bd)(kshetra);
|
|
110
|
+
// Track repeating cycle errors so the watchdog can trip on a stall loop
|
|
111
|
+
// (e.g. the same git/agent failure recurring across polls).
|
|
112
|
+
const errorClass = classifyError(err);
|
|
113
|
+
(0, state_js_1.recordStall)(kshetra, `cycle:${errorClass}`);
|
|
114
|
+
switch (errorClass) {
|
|
115
|
+
case 'API_DOWN':
|
|
116
|
+
if (task) {
|
|
117
|
+
await bdClient.addNote(task.id, `Paused: API unavailable — ${err.message}. Will retry.`);
|
|
118
|
+
// The retry re-picks the task and creates a fresh branch, so drop the
|
|
119
|
+
// current one — otherwise preFlightCheck would reject the retry.
|
|
120
|
+
await cleanupBranch(kshetra, task);
|
|
121
|
+
}
|
|
122
|
+
(0, state_js_1.pauseKshetra)(kshetra, {
|
|
123
|
+
reason: 'api_down',
|
|
124
|
+
message: err.message,
|
|
125
|
+
cooldownMs: 5 * 60 * 1000,
|
|
126
|
+
});
|
|
127
|
+
await notifyOperator(kshetra, task, 'api_down');
|
|
128
|
+
break;
|
|
129
|
+
case 'AGENT_FAILED':
|
|
130
|
+
if (task) {
|
|
131
|
+
await bdClient.flag(task.id, `Agent failed: ${err.message}`);
|
|
132
|
+
await (0, beads_js_1.syncBeads)(kshetra);
|
|
133
|
+
await cleanupBranch(kshetra, task);
|
|
134
|
+
}
|
|
135
|
+
await notifyOperator(kshetra, task, 'agent_failed');
|
|
136
|
+
break;
|
|
137
|
+
case 'MALFORMED_OUTPUT':
|
|
138
|
+
if (task) {
|
|
139
|
+
await bdClient.flag(task.id, `Malformed output after retries: ${err.message}`);
|
|
140
|
+
await (0, beads_js_1.syncBeads)(kshetra);
|
|
141
|
+
await cleanupBranch(kshetra, task);
|
|
142
|
+
}
|
|
143
|
+
await notifyOperator(kshetra, task, 'agent_failed');
|
|
144
|
+
break;
|
|
145
|
+
case 'GIT_FAILED':
|
|
146
|
+
if (task) {
|
|
147
|
+
await bdClient.flag(task.id, `Git failure: ${err.message}. Branch kept.`);
|
|
148
|
+
await (0, beads_js_1.syncBeads)(kshetra);
|
|
149
|
+
}
|
|
150
|
+
(0, state_js_1.pauseKshetra)(kshetra, {
|
|
151
|
+
reason: 'git_failed',
|
|
152
|
+
message: err.message,
|
|
153
|
+
manual: true,
|
|
154
|
+
});
|
|
155
|
+
await notifyOperator(kshetra, task, 'git_failed');
|
|
156
|
+
break;
|
|
157
|
+
case 'BD_FAILED':
|
|
158
|
+
(0, state_js_1.pauseKshetra)(kshetra, {
|
|
159
|
+
reason: 'bd_failed',
|
|
160
|
+
message: err.message,
|
|
161
|
+
manual: true,
|
|
162
|
+
});
|
|
163
|
+
await notifyOperator(kshetra, null, 'bd_failed');
|
|
164
|
+
break;
|
|
165
|
+
default:
|
|
166
|
+
if (task) {
|
|
167
|
+
await bdClient.flag(task.id, `Unexpected error: ${err.message}`);
|
|
168
|
+
await (0, beads_js_1.syncBeads)(kshetra);
|
|
169
|
+
await cleanupBranch(kshetra, task);
|
|
170
|
+
}
|
|
171
|
+
await notifyOperator(kshetra, task, 'unknown_error');
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/sthapathi/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare class GhError extends Error {
|
|
2
|
+
readonly code: string;
|
|
3
|
+
readonly cause?: unknown | undefined;
|
|
4
|
+
constructor(code: string, message: string, cause?: unknown | undefined);
|
|
5
|
+
}
|
|
6
|
+
export interface PrState {
|
|
7
|
+
state: 'OPEN' | 'MERGED' | 'CLOSED';
|
|
8
|
+
url: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function gh(repoPath: string): {
|
|
11
|
+
prCreate(opts: {
|
|
12
|
+
base: string;
|
|
13
|
+
head: string;
|
|
14
|
+
title: string;
|
|
15
|
+
body: string;
|
|
16
|
+
}): Promise<string>;
|
|
17
|
+
prView(head: string): Promise<PrState | null>;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=gh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gh.d.ts","sourceRoot":"","sources":["../../src/sthapathi/gh.ts"],"names":[],"mappings":"AAKA,qBAAa,OAAQ,SAAQ,KAAK;aAEd,IAAI,EAAE,MAAM;aAEZ,KAAK,CAAC,EAAE,OAAO;gBAFf,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,OAAO,YAAA;CAKlC;AAED,MAAM,WAAW,OAAO;IAEtB,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACpC,GAAG,EAAE,MAAM,CAAC;CACb;AAeD,wBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM;mBAKV;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;iBAoB/E,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;EAWtD"}
|