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.
Files changed (269) hide show
  1. package/ARCHITECTURE.md +260 -0
  2. package/LICENSE +201 -0
  3. package/README.md +519 -0
  4. package/TRADEMARK.md +97 -0
  5. package/dist/agents/parikshaka.d.ts +11 -0
  6. package/dist/agents/parikshaka.d.ts.map +1 -0
  7. package/dist/agents/parikshaka.js +80 -0
  8. package/dist/agents/parikshaka.js.map +1 -0
  9. package/dist/agents/providers/claude.d.ts +3 -0
  10. package/dist/agents/providers/claude.d.ts.map +1 -0
  11. package/dist/agents/providers/claude.js +100 -0
  12. package/dist/agents/providers/claude.js.map +1 -0
  13. package/dist/agents/providers/codex.d.ts +3 -0
  14. package/dist/agents/providers/codex.d.ts.map +1 -0
  15. package/dist/agents/providers/codex.js +123 -0
  16. package/dist/agents/providers/codex.js.map +1 -0
  17. package/dist/agents/providers/gemini.d.ts +3 -0
  18. package/dist/agents/providers/gemini.d.ts.map +1 -0
  19. package/dist/agents/providers/gemini.js +77 -0
  20. package/dist/agents/providers/gemini.js.map +1 -0
  21. package/dist/agents/providers/index.d.ts +6 -0
  22. package/dist/agents/providers/index.d.ts.map +1 -0
  23. package/dist/agents/providers/index.js +35 -0
  24. package/dist/agents/providers/index.js.map +1 -0
  25. package/dist/agents/providers/registry.d.ts +20 -0
  26. package/dist/agents/providers/registry.d.ts.map +1 -0
  27. package/dist/agents/providers/registry.js +91 -0
  28. package/dist/agents/providers/registry.js.map +1 -0
  29. package/dist/agents/providers/types.d.ts +42 -0
  30. package/dist/agents/providers/types.d.ts.map +1 -0
  31. package/dist/agents/providers/types.js +61 -0
  32. package/dist/agents/providers/types.js.map +1 -0
  33. package/dist/agents/runner.d.ts +6 -0
  34. package/dist/agents/runner.d.ts.map +1 -0
  35. package/dist/agents/runner.js +159 -0
  36. package/dist/agents/runner.js.map +1 -0
  37. package/dist/agents/silpi.d.ts +3 -0
  38. package/dist/agents/silpi.d.ts.map +1 -0
  39. package/dist/agents/silpi.js +101 -0
  40. package/dist/agents/silpi.js.map +1 -0
  41. package/dist/agents/viharapala.d.ts +5 -0
  42. package/dist/agents/viharapala.d.ts.map +1 -0
  43. package/dist/agents/viharapala.js +128 -0
  44. package/dist/agents/viharapala.js.map +1 -0
  45. package/dist/cli/agents.d.ts +14 -0
  46. package/dist/cli/agents.d.ts.map +1 -0
  47. package/dist/cli/agents.js +47 -0
  48. package/dist/cli/agents.js.map +1 -0
  49. package/dist/cli/detect-toolchain.d.ts +10 -0
  50. package/dist/cli/detect-toolchain.d.ts.map +1 -0
  51. package/dist/cli/detect-toolchain.js +77 -0
  52. package/dist/cli/detect-toolchain.js.map +1 -0
  53. package/dist/cli/index.d.ts +3 -0
  54. package/dist/cli/index.d.ts.map +1 -0
  55. package/dist/cli/index.js +342 -0
  56. package/dist/cli/index.js.map +1 -0
  57. package/dist/cli/init-kshetra.d.ts +59 -0
  58. package/dist/cli/init-kshetra.d.ts.map +1 -0
  59. package/dist/cli/init-kshetra.js +531 -0
  60. package/dist/cli/init-kshetra.js.map +1 -0
  61. package/dist/cli/list.d.ts +11 -0
  62. package/dist/cli/list.d.ts.map +1 -0
  63. package/dist/cli/list.js +45 -0
  64. package/dist/cli/list.js.map +1 -0
  65. package/dist/cli/logs.d.ts +20 -0
  66. package/dist/cli/logs.d.ts.map +1 -0
  67. package/dist/cli/logs.js +144 -0
  68. package/dist/cli/logs.js.map +1 -0
  69. package/dist/cli/migrate.d.ts +8 -0
  70. package/dist/cli/migrate.d.ts.map +1 -0
  71. package/dist/cli/migrate.js +116 -0
  72. package/dist/cli/migrate.js.map +1 -0
  73. package/dist/cli/pause.d.ts +24 -0
  74. package/dist/cli/pause.d.ts.map +1 -0
  75. package/dist/cli/pause.js +41 -0
  76. package/dist/cli/pause.js.map +1 -0
  77. package/dist/cli/phalaka-autostart.d.ts +11 -0
  78. package/dist/cli/phalaka-autostart.d.ts.map +1 -0
  79. package/dist/cli/phalaka-autostart.js +28 -0
  80. package/dist/cli/phalaka-autostart.js.map +1 -0
  81. package/dist/cli/phalaka-server.d.ts +2 -0
  82. package/dist/cli/phalaka-server.d.ts.map +1 -0
  83. package/dist/cli/phalaka-server.js +20 -0
  84. package/dist/cli/phalaka-server.js.map +1 -0
  85. package/dist/cli/phalaka.d.ts +30 -0
  86. package/dist/cli/phalaka.d.ts.map +1 -0
  87. package/dist/cli/phalaka.js +60 -0
  88. package/dist/cli/phalaka.js.map +1 -0
  89. package/dist/cli/pid.d.ts +9 -0
  90. package/dist/cli/pid.d.ts.map +1 -0
  91. package/dist/cli/pid.js +66 -0
  92. package/dist/cli/pid.js.map +1 -0
  93. package/dist/cli/provider-preflight.d.ts +11 -0
  94. package/dist/cli/provider-preflight.d.ts.map +1 -0
  95. package/dist/cli/provider-preflight.js +70 -0
  96. package/dist/cli/provider-preflight.js.map +1 -0
  97. package/dist/cli/register.d.ts +8 -0
  98. package/dist/cli/register.d.ts.map +1 -0
  99. package/dist/cli/register.js +34 -0
  100. package/dist/cli/register.js.map +1 -0
  101. package/dist/cli/run.d.ts +3 -0
  102. package/dist/cli/run.d.ts.map +1 -0
  103. package/dist/cli/run.js +40 -0
  104. package/dist/cli/run.js.map +1 -0
  105. package/dist/cli/start.d.ts +11 -0
  106. package/dist/cli/start.d.ts.map +1 -0
  107. package/dist/cli/start.js +26 -0
  108. package/dist/cli/start.js.map +1 -0
  109. package/dist/cli/status.d.ts +39 -0
  110. package/dist/cli/status.d.ts.map +1 -0
  111. package/dist/cli/status.js +207 -0
  112. package/dist/cli/status.js.map +1 -0
  113. package/dist/cli/stop.d.ts +13 -0
  114. package/dist/cli/stop.d.ts.map +1 -0
  115. package/dist/cli/stop.js +18 -0
  116. package/dist/cli/stop.js.map +1 -0
  117. package/dist/cli/sync.d.ts +6 -0
  118. package/dist/cli/sync.d.ts.map +1 -0
  119. package/dist/cli/sync.js +31 -0
  120. package/dist/cli/sync.js.map +1 -0
  121. package/dist/cli/tail.d.ts +6 -0
  122. package/dist/cli/tail.d.ts.map +1 -0
  123. package/dist/cli/tail.js +170 -0
  124. package/dist/cli/tail.js.map +1 -0
  125. package/dist/cli/telemetry.d.ts +2 -0
  126. package/dist/cli/telemetry.d.ts.map +1 -0
  127. package/dist/cli/telemetry.js +42 -0
  128. package/dist/cli/telemetry.js.map +1 -0
  129. package/dist/cli/verify-hooks.d.ts +12 -0
  130. package/dist/cli/verify-hooks.d.ts.map +1 -0
  131. package/dist/cli/verify-hooks.js +38 -0
  132. package/dist/cli/verify-hooks.js.map +1 -0
  133. package/dist/cli/worker.d.ts +2 -0
  134. package/dist/cli/worker.d.ts.map +1 -0
  135. package/dist/cli/worker.js +211 -0
  136. package/dist/cli/worker.js.map +1 -0
  137. package/dist/kshetra/config.d.ts +64 -0
  138. package/dist/kshetra/config.d.ts.map +1 -0
  139. package/dist/kshetra/config.js +173 -0
  140. package/dist/kshetra/config.js.map +1 -0
  141. package/dist/kshetra/registry.d.ts +5 -0
  142. package/dist/kshetra/registry.d.ts.map +1 -0
  143. package/dist/kshetra/registry.js +69 -0
  144. package/dist/kshetra/registry.js.map +1 -0
  145. package/dist/kshetra/state.d.ts +57 -0
  146. package/dist/kshetra/state.d.ts.map +1 -0
  147. package/dist/kshetra/state.js +195 -0
  148. package/dist/kshetra/state.js.map +1 -0
  149. package/dist/kshetra/toolchain.d.ts +20 -0
  150. package/dist/kshetra/toolchain.d.ts.map +1 -0
  151. package/dist/kshetra/toolchain.js +146 -0
  152. package/dist/kshetra/toolchain.js.map +1 -0
  153. package/dist/phalaka/api.d.ts +123 -0
  154. package/dist/phalaka/api.d.ts.map +1 -0
  155. package/dist/phalaka/api.js +196 -0
  156. package/dist/phalaka/api.js.map +1 -0
  157. package/dist/phalaka/beads-read.d.ts +49 -0
  158. package/dist/phalaka/beads-read.d.ts.map +1 -0
  159. package/dist/phalaka/beads-read.js +174 -0
  160. package/dist/phalaka/beads-read.js.map +1 -0
  161. package/dist/phalaka/pid.d.ts +6 -0
  162. package/dist/phalaka/pid.d.ts.map +1 -0
  163. package/dist/phalaka/pid.js +48 -0
  164. package/dist/phalaka/pid.js.map +1 -0
  165. package/dist/phalaka/server.d.ts +10 -0
  166. package/dist/phalaka/server.d.ts.map +1 -0
  167. package/dist/phalaka/server.js +30 -0
  168. package/dist/phalaka/server.js.map +1 -0
  169. package/dist/phalaka/token.d.ts +5 -0
  170. package/dist/phalaka/token.d.ts.map +1 -0
  171. package/dist/phalaka/token.js +40 -0
  172. package/dist/phalaka/token.js.map +1 -0
  173. package/dist/phalaka/ui.d.ts +15 -0
  174. package/dist/phalaka/ui.d.ts.map +1 -0
  175. package/dist/phalaka/ui.js +233 -0
  176. package/dist/phalaka/ui.js.map +1 -0
  177. package/dist/sthapathi/activity-log.d.ts +68 -0
  178. package/dist/sthapathi/activity-log.d.ts.map +1 -0
  179. package/dist/sthapathi/activity-log.js +57 -0
  180. package/dist/sthapathi/activity-log.js.map +1 -0
  181. package/dist/sthapathi/beads.d.ts +27 -0
  182. package/dist/sthapathi/beads.d.ts.map +1 -0
  183. package/dist/sthapathi/beads.js +153 -0
  184. package/dist/sthapathi/beads.js.map +1 -0
  185. package/dist/sthapathi/branch.d.ts +5 -0
  186. package/dist/sthapathi/branch.d.ts.map +1 -0
  187. package/dist/sthapathi/branch.js +20 -0
  188. package/dist/sthapathi/branch.js.map +1 -0
  189. package/dist/sthapathi/dispatch.d.ts +14 -0
  190. package/dist/sthapathi/dispatch.d.ts.map +1 -0
  191. package/dist/sthapathi/dispatch.js +326 -0
  192. package/dist/sthapathi/dispatch.js.map +1 -0
  193. package/dist/sthapathi/errors.d.ts +27 -0
  194. package/dist/sthapathi/errors.d.ts.map +1 -0
  195. package/dist/sthapathi/errors.js +174 -0
  196. package/dist/sthapathi/errors.js.map +1 -0
  197. package/dist/sthapathi/gh.d.ts +19 -0
  198. package/dist/sthapathi/gh.d.ts.map +1 -0
  199. package/dist/sthapathi/gh.js +69 -0
  200. package/dist/sthapathi/gh.js.map +1 -0
  201. package/dist/sthapathi/git.d.ts +41 -0
  202. package/dist/sthapathi/git.d.ts.map +1 -0
  203. package/dist/sthapathi/git.js +199 -0
  204. package/dist/sthapathi/git.js.map +1 -0
  205. package/dist/sthapathi/guard.d.ts +24 -0
  206. package/dist/sthapathi/guard.d.ts.map +1 -0
  207. package/dist/sthapathi/guard.js +64 -0
  208. package/dist/sthapathi/guard.js.map +1 -0
  209. package/dist/sthapathi/health.d.ts +23 -0
  210. package/dist/sthapathi/health.d.ts.map +1 -0
  211. package/dist/sthapathi/health.js +142 -0
  212. package/dist/sthapathi/health.js.map +1 -0
  213. package/dist/sthapathi/index.d.ts +21 -0
  214. package/dist/sthapathi/index.d.ts.map +1 -0
  215. package/dist/sthapathi/index.js +88 -0
  216. package/dist/sthapathi/index.js.map +1 -0
  217. package/dist/sthapathi/lifecycle.d.ts +7 -0
  218. package/dist/sthapathi/lifecycle.d.ts.map +1 -0
  219. package/dist/sthapathi/lifecycle.js +43 -0
  220. package/dist/sthapathi/lifecycle.js.map +1 -0
  221. package/dist/sthapathi/lint.d.ts +8 -0
  222. package/dist/sthapathi/lint.d.ts.map +1 -0
  223. package/dist/sthapathi/lint.js +33 -0
  224. package/dist/sthapathi/lint.js.map +1 -0
  225. package/dist/sthapathi/merge.d.ts +18 -0
  226. package/dist/sthapathi/merge.d.ts.map +1 -0
  227. package/dist/sthapathi/merge.js +259 -0
  228. package/dist/sthapathi/merge.js.map +1 -0
  229. package/dist/sthapathi/notifications.d.ts +14 -0
  230. package/dist/sthapathi/notifications.d.ts.map +1 -0
  231. package/dist/sthapathi/notifications.js +57 -0
  232. package/dist/sthapathi/notifications.js.map +1 -0
  233. package/dist/sthapathi/parikshaka-dispatch.d.ts +12 -0
  234. package/dist/sthapathi/parikshaka-dispatch.d.ts.map +1 -0
  235. package/dist/sthapathi/parikshaka-dispatch.js +0 -0
  236. package/dist/sthapathi/parikshaka-dispatch.js.map +1 -0
  237. package/dist/sthapathi/pickup.d.ts +13 -0
  238. package/dist/sthapathi/pickup.d.ts.map +1 -0
  239. package/dist/sthapathi/pickup.js +144 -0
  240. package/dist/sthapathi/pickup.js.map +1 -0
  241. package/dist/sthapathi/recover.d.ts +16 -0
  242. package/dist/sthapathi/recover.d.ts.map +1 -0
  243. package/dist/sthapathi/recover.js +149 -0
  244. package/dist/sthapathi/recover.js.map +1 -0
  245. package/dist/sthapathi/retry.d.ts +11 -0
  246. package/dist/sthapathi/retry.d.ts.map +1 -0
  247. package/dist/sthapathi/retry.js +42 -0
  248. package/dist/sthapathi/retry.js.map +1 -0
  249. package/dist/sthapathi/self-heal.d.ts +19 -0
  250. package/dist/sthapathi/self-heal.d.ts.map +1 -0
  251. package/dist/sthapathi/self-heal.js +46 -0
  252. package/dist/sthapathi/self-heal.js.map +1 -0
  253. package/dist/sthapathi/types.d.ts +56 -0
  254. package/dist/sthapathi/types.d.ts.map +1 -0
  255. package/dist/sthapathi/types.js +4 -0
  256. package/dist/sthapathi/types.js.map +1 -0
  257. package/dist/sthapathi/watchdog.d.ts +27 -0
  258. package/dist/sthapathi/watchdog.d.ts.map +1 -0
  259. package/dist/sthapathi/watchdog.js +145 -0
  260. package/dist/sthapathi/watchdog.js.map +1 -0
  261. package/dist/telemetry/telemetry.d.ts +42 -0
  262. package/dist/telemetry/telemetry.d.ts.map +1 -0
  263. package/dist/telemetry/telemetry.js +189 -0
  264. package/dist/telemetry/telemetry.js.map +1 -0
  265. package/dist/test-setup.d.ts +2 -0
  266. package/dist/test-setup.d.ts.map +1 -0
  267. package/dist/test-setup.js +16 -0
  268. package/dist/test-setup.js.map +1 -0
  269. package/package.json +71 -0
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_INTERVAL_MS = void 0;
4
+ exports.createScheduler = createScheduler;
5
+ const lifecycle_js_1 = require("./lifecycle.js");
6
+ exports.DEFAULT_INTERVAL_MS = 30_000;
7
+ function createScheduler(opts = {}) {
8
+ const active = new Map();
9
+ const phase = new Map();
10
+ function getPhase(kshetraId) {
11
+ return phase.get(kshetraId) ?? 'IDLE';
12
+ }
13
+ // Set the in-memory phase and notify the optional observer (the worker persists
14
+ // it to state.json so `shreni status` / Phalaka can show it cross-process).
15
+ // The transition is validated against the formalized phase machine
16
+ // (lifecycle.ts): an illegal jump is a logic bug — most importantly a
17
+ // write-only latch (a phase with no edge back to IDLE) — so warn loudly, but
18
+ // don't throw. runCycle already owns the hard structural invariant; this is a
19
+ // tripwire (yds.10), not a second gate that could wedge the loop.
20
+ function setPhase(kshetraId, p) {
21
+ const prev = getPhase(kshetraId);
22
+ if (!(0, lifecycle_js_1.canTransition)(prev, p)) {
23
+ console.warn(`[sthapathi] illegal phase transition for "${kshetraId}": ${prev} -> ${p}`);
24
+ }
25
+ phase.set(kshetraId, p);
26
+ opts.onPhase?.(kshetraId, p);
27
+ }
28
+ // One task at a time is a STRUCTURAL invariant, not an emergent property of
29
+ // several guards: a cycle runs only from IDLE, and the phase is advanced
30
+ // SYNCHRONOUSLY (before the first await) so an overlapping tick for the same
31
+ // Kshetra is an immediate no-op. Crucially, SELECT (read-only) is separated
32
+ // from PREPARE (the only work-tree mutation), so polling for work can never
33
+ // check out main under an in-flight agent — the cause of the off-branch aborts
34
+ //. See the Sthapathi workflow design §4.1–4.2.
35
+ async function runCycle(kshetra, hooks) {
36
+ if (getPhase(kshetra.id) !== 'IDLE')
37
+ return;
38
+ setPhase(kshetra.id, 'SELECTING');
39
+ try {
40
+ const selected = await hooks.selectNext(kshetra);
41
+ if (!selected)
42
+ return;
43
+ setPhase(kshetra.id, 'PREPARING');
44
+ const prepared = await hooks.prepareTask(selected, kshetra);
45
+ if (!prepared)
46
+ return;
47
+ setPhase(kshetra.id, 'WORKING');
48
+ active.set(kshetra.id, prepared);
49
+ await hooks.runTask(prepared, kshetra);
50
+ }
51
+ finally {
52
+ active.delete(kshetra.id);
53
+ setPhase(kshetra.id, 'IDLE');
54
+ }
55
+ }
56
+ function scheduleLoop(kshetra, hooks, intervalMs = exports.DEFAULT_INTERVAL_MS) {
57
+ // Single-flight: skip a tick while the previous cycle is still running.
58
+ // runCycle calls pickNext (= pickup → preFlightCheck → `git checkout main`)
59
+ // before its capacity check, so overlapping cycles would check out main
60
+ // under an in-flight agent and knock it off its bead branch. Holding the
61
+ // tick until the active runTask resolves keeps pickup off the work repo
62
+ // while an agent is working (P0 preemption is deferred to idle).
63
+ let inFlight = false;
64
+ const tick = () => {
65
+ if (inFlight)
66
+ return;
67
+ inFlight = true;
68
+ runCycle(kshetra, hooks)
69
+ .catch((err) => {
70
+ console.error(`[sthapathi] cycle error for "${kshetra.id}":`, err);
71
+ })
72
+ .finally(() => {
73
+ inFlight = false;
74
+ });
75
+ };
76
+ const timer = setInterval(tick, intervalMs);
77
+ return () => clearInterval(timer);
78
+ }
79
+ function start(kshetras, hooks, intervalMs = exports.DEFAULT_INTERVAL_MS) {
80
+ const stops = kshetras.map(k => scheduleLoop(k, hooks, intervalMs));
81
+ return () => stops.forEach(s => s());
82
+ }
83
+ function getActive(kshetraId) {
84
+ return active.get(kshetraId);
85
+ }
86
+ return { runCycle, scheduleLoop, start, getActive, getPhase };
87
+ }
88
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sthapathi/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type Phase = 'IDLE' | 'SELECTING' | 'PREPARING' | 'WORKING';
2
+ export declare const PHASE_TRANSITIONS: Record<Phase, readonly Phase[]>;
3
+ export declare const PHASES: Phase[];
4
+ export declare const REST_PHASE: Phase;
5
+ export declare function canTransition(from: Phase, to: Phase): boolean;
6
+ export declare function nextPhases(from: Phase): readonly Phase[];
7
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/sthapathi/lifecycle.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;AAOnE,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,KAAK,EAAE,CAK7D,CAAC;AAEF,eAAO,MAAM,MAAM,EAAqC,KAAK,EAAE,CAAC;AAGhE,eAAO,MAAM,UAAU,EAAE,KAAc,CAAC;AAIxC,wBAAgB,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO,CAG7D;AAGD,wBAAgB,UAAU,CAAC,IAAI,EAAE,KAAK,GAAG,SAAS,KAAK,EAAE,CAExD"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ // Worker lifecycle phase machine — the typed transition table + guard (yds.10).
3
+ //
4
+ // The scheduler already enforces "one task at a time" structurally (runCycle
5
+ // only starts from IDLE and advances the phase synchronously). This module makes
6
+ // the *shape* of that machine explicit and checkable: every legal edge is listed
7
+ // once, so an illegal jump (a skipped phase) or a write-only latch (a phase with
8
+ // no way back to IDLE) is a test failure and a runtime tripwire rather than a
9
+ // silent bug — the class of defect the Watchdog ARD was written about.
10
+ //
11
+ // Deliberately NOT a state-machine library: no dependency, no durable snapshot
12
+ // (bd + git + state.json remain the sources of truth), no change to retry/guards.
13
+ // A heavier XState-style engine is explicitly deferred to post-launch.
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.REST_PHASE = exports.PHASES = exports.PHASE_TRANSITIONS = void 0;
16
+ exports.canTransition = canTransition;
17
+ exports.nextPhases = nextPhases;
18
+ // For each phase, the phases it may legally advance to. Reading it as a
19
+ // statechart:
20
+ // IDLE ──▶ SELECTING ──▶ PREPARING ──▶ WORKING ──▶ IDLE
21
+ // │ │
22
+ // └──▶ IDLE └──▶ IDLE (nothing selected / prepare rejected)
23
+ exports.PHASE_TRANSITIONS = {
24
+ IDLE: ['SELECTING'],
25
+ SELECTING: ['PREPARING', 'IDLE'],
26
+ PREPARING: ['WORKING', 'IDLE'],
27
+ WORKING: ['IDLE'],
28
+ };
29
+ exports.PHASES = Object.keys(exports.PHASE_TRANSITIONS);
30
+ // The phase every cycle returns to — the machine's home/rest state.
31
+ exports.REST_PHASE = 'IDLE';
32
+ // True when `to` is a legal successor of `from`. A no-op re-set (from === to) is
33
+ // treated as allowed so an idempotent write never trips the guard.
34
+ function canTransition(from, to) {
35
+ if (from === to)
36
+ return true;
37
+ return exports.PHASE_TRANSITIONS[from].includes(to);
38
+ }
39
+ // The legal successors of a phase (excluding the idempotent self-edge).
40
+ function nextPhases(from) {
41
+ return exports.PHASE_TRANSITIONS[from];
42
+ }
43
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/sthapathi/lifecycle.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,EAAE;AACF,6EAA6E;AAC7E,iFAAiF;AACjF,iFAAiF;AACjF,iFAAiF;AACjF,8EAA8E;AAC9E,uEAAuE;AACvE,EAAE;AACF,+EAA+E;AAC/E,kFAAkF;AAClF,uEAAuE;;;AAuBvE,sCAGC;AAGD,gCAEC;AA3BD,wEAAwE;AACxE,cAAc;AACd,0DAA0D;AAC1D,kCAAkC;AAClC,qFAAqF;AACxE,QAAA,iBAAiB,GAAoC;IAChE,IAAI,EAAE,CAAC,WAAW,CAAC;IACnB,SAAS,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC;IAChC,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC;IAC9B,OAAO,EAAE,CAAC,MAAM,CAAC;CAClB,CAAC;AAEW,QAAA,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,yBAAiB,CAAY,CAAC;AAEhE,oEAAoE;AACvD,QAAA,UAAU,GAAU,MAAM,CAAC;AAExC,iFAAiF;AACjF,mEAAmE;AACnE,SAAgB,aAAa,CAAC,IAAW,EAAE,EAAS;IAClD,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC7B,OAAO,yBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,wEAAwE;AACxE,SAAgB,UAAU,CAAC,IAAW;IACpC,OAAO,yBAAiB,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { KshetraConfig } from '../kshetra/config.js';
2
+ export interface LintResult {
3
+ passed: boolean;
4
+ skipped: boolean;
5
+ raw: string;
6
+ }
7
+ export declare function runLintGate(kshetra: KshetraConfig): Promise<LintResult>;
8
+ //# sourceMappingURL=lint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/sthapathi/lint.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAK1D,MAAM,WAAW,UAAU;IAGzB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb;AAQD,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CAiB7E"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runLintGate = runLintGate;
4
+ const child_process_1 = require("child_process");
5
+ const util_1 = require("util");
6
+ const toolchain_js_1 = require("../kshetra/toolchain.js");
7
+ const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
8
+ // Run the configured lint command as an independent gate (mirroring the
9
+ // build/test gates), replacing the old soft-trust of Silpi's self-reported
10
+ // lintPassed (the toolchain design §3.3). When stack.lintCommand is unset the language
11
+ // default applies; an empty resolved command means the Kshetra has no lint step,
12
+ // which is a visible, logged skip — never synthesised for a repo without a
13
+ // linter. Resolves (never rejects); a non-zero exit yields passed=false.
14
+ async function runLintGate(kshetra) {
15
+ const [cmd, ...args] = (0, toolchain_js_1.splitCommand)((0, toolchain_js_1.resolveLintCommand)(kshetra));
16
+ if (!cmd) {
17
+ console.warn(`[lint] ${kshetra.id}: no lint command configured — lint gate skipped`);
18
+ return { passed: true, skipped: true, raw: '(no lint command configured — lint gate skipped)' };
19
+ }
20
+ try {
21
+ const { stdout, stderr } = await execFileAsync(cmd, args, {
22
+ cwd: kshetra.repo.path,
23
+ maxBuffer: 32 * 1024 * 1024,
24
+ });
25
+ return { passed: true, skipped: false, raw: stdout + stderr };
26
+ }
27
+ catch (err) {
28
+ const e = err;
29
+ const raw = (e.stdout ?? '') + (e.stderr ?? '') + (e.message ?? '');
30
+ return { passed: false, skipped: false, raw };
31
+ }
32
+ }
33
+ //# sourceMappingURL=lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/sthapathi/lint.ts"],"names":[],"mappings":";;AAqBA,kCAiBC;AAtCD,iDAAyC;AACzC,+BAAiC;AAEjC,0DAA2E;AAE3E,MAAM,aAAa,GAAG,IAAA,gBAAS,EAAC,wBAAQ,CAAC,CAAC;AAU1C,wEAAwE;AACxE,2EAA2E;AAC3E,uFAAuF;AACvF,iFAAiF;AACjF,2EAA2E;AAC3E,yEAAyE;AAClE,KAAK,UAAU,WAAW,CAAC,OAAsB;IACtD,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAA,2BAAY,EAAC,IAAA,iCAAkB,EAAC,OAAO,CAAC,CAAC,CAAC;IACjE,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,EAAE,kDAAkD,CAAC,CAAC;QACrF,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,kDAAkD,EAAE,CAAC;IAClG,CAAC;IACD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE;YACxD,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI;YACtB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;SAC5B,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAChE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAA6D,CAAC;QACxE,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACpE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IAChD,CAAC;AACH,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { KshetraConfig } from '../kshetra/config.js';
2
+ import type { Task, SilpiOutput } from './types.js';
3
+ export declare const AWAITING_MERGE_LABEL = "awaiting-merge";
4
+ export declare function resolveMergePolicy(kshetra: KshetraConfig): 'push' | 'pr';
5
+ export declare function safePush(kshetra: KshetraConfig, task: Task): Promise<void>;
6
+ export declare function handleMergeConflict(kshetra: KshetraConfig, task: Task, _branch: string, conflictedFiles: string[]): Promise<void>;
7
+ export declare function safeMerge(kshetra: KshetraConfig, task: Task, branch: string): Promise<void>;
8
+ export declare function squashMergeAndClose(task: Task, kshetra: KshetraConfig, output: SilpiOutput): Promise<void>;
9
+ export declare function openPrAndDefer(task: Task, kshetra: KshetraConfig, output: SilpiOutput): Promise<void>;
10
+ interface AwaitingMergeBead {
11
+ id: string;
12
+ slug: string;
13
+ title: string;
14
+ }
15
+ export declare function parseAwaitingMerge(raw: string): AwaitingMergeBead[];
16
+ export declare function reconcilePullRequests(kshetra: KshetraConfig): Promise<void>;
17
+ export {};
18
+ //# sourceMappingURL=merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/sthapathi/merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAepD,eAAO,MAAM,oBAAoB,mBAAmB,CAAC;AAKrD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAIxE;AAqCD,wBAAsB,QAAQ,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBhF;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC,CAuCf;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAQD,wBAAsB,cAAc,CAClC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED,UAAU,iBAAiB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAMD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAcnE;AASD,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAgDjF"}
@@ -0,0 +1,259 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AWAITING_MERGE_LABEL = void 0;
4
+ exports.resolveMergePolicy = resolveMergePolicy;
5
+ exports.safePush = safePush;
6
+ exports.handleMergeConflict = handleMergeConflict;
7
+ exports.safeMerge = safeMerge;
8
+ exports.squashMergeAndClose = squashMergeAndClose;
9
+ exports.openPrAndDefer = openPrAndDefer;
10
+ exports.parseAwaitingMerge = parseAwaitingMerge;
11
+ exports.reconcilePullRequests = reconcilePullRequests;
12
+ const beads_js_1 = require("./beads.js");
13
+ const git_js_1 = require("./git.js");
14
+ const gh_js_1 = require("./gh.js");
15
+ const branch_js_1 = require("./branch.js");
16
+ const pickup_js_1 = require("./pickup.js");
17
+ const state_js_1 = require("../kshetra/state.js");
18
+ const errors_js_1 = require("./errors.js");
19
+ const parikshaka_dispatch_js_1 = require("./parikshaka-dispatch.js");
20
+ const telemetry_js_1 = require("../telemetry/telemetry.js");
21
+ // Label marking a bead whose approved work is on a PR awaiting a human merge
22
+ // (mergePolicy 'pr'). The bead stays open + in_progress so bd dependents stay
23
+ // blocked; reconcilePullRequests keys on this label, and RECOVER excludes it so
24
+ // a deferred bead is never reopened and re-worked on restart.
25
+ exports.AWAITING_MERGE_LABEL = 'awaiting-merge';
26
+ // Resolve the effective merge policy: SHRENI_MERGE_POLICY overrides the config
27
+ // (the "+CLI override" from yds.9/3r2 — set it in the environment `shreni start`
28
+ // runs in), then the Kshetra's repo.mergePolicy, defaulting to 'push'.
29
+ function resolveMergePolicy(kshetra) {
30
+ const env = process.env.SHRENI_MERGE_POLICY;
31
+ if (env === 'pr' || env === 'push')
32
+ return env;
33
+ return kshetra.repo.mergePolicy ?? 'push';
34
+ }
35
+ function buildCommitMessage(task, output) {
36
+ const lines = [
37
+ `${task.title} (${task.id})`,
38
+ '',
39
+ output.summary,
40
+ '',
41
+ `Confidence: ${output.confidenceScore}%`,
42
+ `Files changed: ${output.filesChanged.length}`,
43
+ ];
44
+ if (output.questionsForReviewer.length) {
45
+ lines.push('', 'Questions for reviewer:', ...output.questionsForReviewer.map(q => `- ${q}`));
46
+ }
47
+ return lines.join('\n');
48
+ }
49
+ async function rebaseBranchOnMain(kshetra, task, branch) {
50
+ const g = (0, git_js_1.git)(kshetra);
51
+ const main = kshetra.repo.mainBranch;
52
+ await (0, beads_js_1.bd)(kshetra).addNote(task.id, 'main has new commits — attempting rebase before merge');
53
+ try {
54
+ await g.checkout(branch);
55
+ await g.rebase(`origin/${main}`);
56
+ await g.checkout(main);
57
+ await (0, beads_js_1.bd)(kshetra).addNote(task.id, 'rebase onto main succeeded');
58
+ }
59
+ catch (err) {
60
+ await g.rebase('--abort');
61
+ await g.checkout(main);
62
+ throw new git_js_1.GitError('REBASE_FAILED', err.message, err);
63
+ }
64
+ }
65
+ async function safePush(kshetra, task) {
66
+ const g = (0, git_js_1.git)(kshetra);
67
+ const main = kshetra.repo.mainBranch;
68
+ try {
69
+ await g.push('origin', main);
70
+ }
71
+ catch (pushErr) {
72
+ const msg = pushErr.message ?? '';
73
+ if (!msg.includes('non-fast-forward'))
74
+ throw pushErr;
75
+ await (0, beads_js_1.bd)(kshetra).addNote(task.id, 'push rejected (non-fast-forward) — pull-rebase and retrying');
76
+ try {
77
+ await g.pull('--rebase', 'origin', main);
78
+ await g.push('origin', main);
79
+ }
80
+ catch (retryErr) {
81
+ throw new git_js_1.GitError('PUSH_FAILED', `Push failed after rebase retry: ${retryErr.message}`, retryErr);
82
+ }
83
+ }
84
+ }
85
+ async function handleMergeConflict(kshetra, task, _branch, conflictedFiles) {
86
+ const taskFiles = task.context?.relatedFiles ?? [];
87
+ const outOfScope = conflictedFiles.filter(f => !taskFiles.includes(f));
88
+ const bdClient = (0, beads_js_1.bd)(kshetra);
89
+ if (outOfScope.length > 0) {
90
+ await bdClient.flag(task.id, `Merge conflict in files outside task scope: ${outOfScope.join(', ')}. ` +
91
+ `Silpi may have drifted. Branch kept for inspection.`);
92
+ (0, state_js_1.pauseKshetra)(kshetra, {
93
+ reason: 'git_failed',
94
+ manual: true,
95
+ message: `Out-of-scope conflict: ${outOfScope.join(', ')}`,
96
+ });
97
+ await (0, errors_js_1.notifyOperator)(kshetra, task, 'merge_conflict_out_of_scope');
98
+ return;
99
+ }
100
+ if ((task.round ?? 0) < kshetra.agents.maxRoundsPerBead) {
101
+ await bdClient.addNote(task.id, `Merge conflict in task files — re-dispatching Silpi with conflict context. ` +
102
+ `Conflicted: ${conflictedFiles.join(', ')}`);
103
+ // Phase 5: scheduleResumeWithConflictContext(kshetra, task, conflictedFiles)
104
+ }
105
+ else {
106
+ await bdClient.flag(task.id, `Merge conflict after max rounds: ${conflictedFiles.join(', ')}`);
107
+ (0, state_js_1.pauseKshetra)(kshetra, {
108
+ reason: 'git_failed',
109
+ manual: true,
110
+ message: `Unresolved merge conflict: ${conflictedFiles.join(', ')}`,
111
+ });
112
+ await (0, errors_js_1.notifyOperator)(kshetra, task, 'merge_conflict');
113
+ }
114
+ }
115
+ async function safeMerge(kshetra, task, branch) {
116
+ const g = (0, git_js_1.git)(kshetra);
117
+ const main = kshetra.repo.mainBranch;
118
+ await g.fetch('origin', main);
119
+ const mainAhead = await g.revsBetween(branch, `origin/${main}`);
120
+ if (mainAhead.length > 0) {
121
+ await rebaseBranchOnMain(kshetra, task, branch);
122
+ }
123
+ const conflicts = await g.mergeTree(branch, main);
124
+ if (conflicts.length > 0) {
125
+ await handleMergeConflict(kshetra, task, branch, conflicts);
126
+ return;
127
+ }
128
+ await g.checkout(main);
129
+ await g.merge('--squash', branch);
130
+ await g.commit(`bead-${task.id}: ${task.title}`);
131
+ await safePush(kshetra, task);
132
+ }
133
+ async function squashMergeAndClose(task, kshetra, output) {
134
+ const g = (0, git_js_1.git)(kshetra);
135
+ const main = kshetra.repo.mainBranch;
136
+ const branch = (0, branch_js_1.branchName)(task);
137
+ await g.checkout(main);
138
+ await g.merge('--squash', branch);
139
+ await g.commit(buildCommitMessage(task, output));
140
+ await g.push('origin', main);
141
+ // Fire Parikshaka after merge commit — non-blocking, does not stall the main loop
142
+ (0, parikshaka_dispatch_js_1.dispatchParikshakaAsync)(kshetra, task, output);
143
+ const note = `Merged: confidence=${output.confidenceScore} ` +
144
+ `files=${output.filesChanged.length} — ${output.summary.slice(0, 120)}`;
145
+ await (0, beads_js_1.bd)(kshetra).close(task.id, note);
146
+ // Activation signal (yds.5) — opt-in + anonymous, a no-op unless enabled.
147
+ (0, telemetry_js_1.emit)('task_merged', { policy: 'push' });
148
+ // The bead succeeded — clear any recovery attempt count it accumulated.
149
+ (0, state_js_1.clearBeadAttempts)(kshetra, task.id);
150
+ await (0, beads_js_1.syncBeads)(kshetra);
151
+ // Force-delete: after `git merge --squash` the bead branch's commits are not
152
+ // reachable as merge parents on main, so git treats it as "not fully merged"
153
+ // and a plain `-d` always refuses. The work is already squashed onto main and
154
+ // pushed, so the local branch is safe to drop.
155
+ await g.deleteBranch(branch, { force: true });
156
+ }
157
+ // PR merge policy (3r2). On APPROVE, instead of squash-merging to main, push the
158
+ // bead branch and open a PR, then DEFER: mark the bead awaiting-merge but leave
159
+ // it open (in_progress) so bd dependents stay blocked until the code is on main.
160
+ // The bead is closed later — only when its PR actually merges — by
161
+ // reconcilePullRequests. Decouples "where code lands" from "when the next bead
162
+ // starts" (the next READY bead branches from the unchanged main immediately).
163
+ async function openPrAndDefer(task, kshetra, output) {
164
+ const g = (0, git_js_1.git)(kshetra);
165
+ const main = kshetra.repo.mainBranch;
166
+ const branch = (0, branch_js_1.branchName)(task);
167
+ const bdClient = (0, beads_js_1.bd)(kshetra);
168
+ // Publish the bead branch so the PR has a head to compare against main.
169
+ await g.push('origin', branch);
170
+ const url = await (0, gh_js_1.gh)(kshetra.repo.path).prCreate({
171
+ base: main,
172
+ head: branch,
173
+ title: `${task.title} (${task.id})`,
174
+ body: buildCommitMessage(task, output),
175
+ });
176
+ await bdClient.addNote(task.id, `PR opened (awaiting merge): ${url}`);
177
+ await bdClient.addLabel(task.id, exports.AWAITING_MERGE_LABEL);
178
+ await (0, beads_js_1.syncBeads)(kshetra);
179
+ // The bead branch is deliberately NOT deleted — the open PR needs it. It is
180
+ // dropped when the PR merges (reconcilePullRequests). Parikshaka is likewise
181
+ // deferred: it runs post-merge, so it fires from the reconcile path, not here.
182
+ }
183
+ // Parse `bd list --json` (awaiting-merge filter) into the id + reconstructed
184
+ // slug needed to name each bead's branch. bd carries no slug field, so the slug
185
+ // is rebuilt deterministically from the title via the same toSlug used to name
186
+ // the branch at creation.
187
+ function parseAwaitingMerge(raw) {
188
+ let parsed;
189
+ try {
190
+ parsed = JSON.parse(raw);
191
+ }
192
+ catch {
193
+ return [];
194
+ }
195
+ if (!Array.isArray(parsed))
196
+ return [];
197
+ const beads = [];
198
+ for (const item of parsed) {
199
+ if (typeof item.id !== 'string' || typeof item.title !== 'string')
200
+ continue;
201
+ beads.push({ id: item.id, title: item.title, slug: (0, pickup_js_1.toSlug)(item.title) });
202
+ }
203
+ return beads;
204
+ }
205
+ // Reconcile deferred PR beads (mergePolicy 'pr'). For each bead labelled
206
+ // awaiting-merge, check its PR: MERGED → close the bead and drop the branch;
207
+ // CLOSED-without-merge → block for a human and clear the marker; OPEN (or gh
208
+ // unavailable) → leave it for a later pass. Read-mostly and gh-tolerant: any gh
209
+ // failure degrades to "nothing to reconcile" rather than throwing. Intended to
210
+ // run only when the worker is IDLE, so its branch deletes never race an
211
+ // in-flight agent's work tree.
212
+ async function reconcilePullRequests(kshetra) {
213
+ const bdClient = (0, beads_js_1.bd)(kshetra);
214
+ let raw;
215
+ try {
216
+ raw = await bdClient.list({ status: 'in_progress', label: exports.AWAITING_MERGE_LABEL });
217
+ }
218
+ catch (err) {
219
+ console.warn(`[shreni reconcile:${kshetra.id}] could not list awaiting-merge beads: ${err.message}`);
220
+ return;
221
+ }
222
+ const beads = parseAwaitingMerge(raw);
223
+ if (beads.length === 0)
224
+ return;
225
+ const client = (0, gh_js_1.gh)(kshetra.repo.path);
226
+ const g = (0, git_js_1.git)(kshetra);
227
+ for (const bead of beads) {
228
+ const branch = (0, branch_js_1.branchName)(bead);
229
+ const pr = await client.prView(branch);
230
+ if (!pr || pr.state === 'OPEN')
231
+ continue;
232
+ if (pr.state === 'MERGED') {
233
+ await bdClient.close(bead.id, `Merged via PR: ${pr.url}`);
234
+ (0, telemetry_js_1.emit)('task_merged', { policy: 'pr' });
235
+ (0, state_js_1.clearBeadAttempts)(kshetra, bead.id);
236
+ // Drop the merged branch locally and (best-effort) on the remote — GitHub
237
+ // may already have auto-deleted the head branch, so ignore failures.
238
+ try {
239
+ await g.deleteBranch(branch, { force: true });
240
+ }
241
+ catch { /* local branch already gone */ }
242
+ try {
243
+ await g.push('origin', '--delete', branch);
244
+ }
245
+ catch { /* remote branch already gone (auto-delete) */ }
246
+ await (0, beads_js_1.syncBeads)(kshetra);
247
+ console.log(`[shreni reconcile:${kshetra.id}] ${bead.id} merged via PR — closed`);
248
+ }
249
+ else {
250
+ // CLOSED without merging: a human declined the PR. Clear the marker so it
251
+ // is not reconciled again, and block for review — the change did not land.
252
+ await bdClient.removeLabel(bead.id, exports.AWAITING_MERGE_LABEL);
253
+ await bdClient.flag(bead.id, `PR closed without merging: ${pr.url}. The change did not land on ${kshetra.repo.mainBranch} — investigate manually.`);
254
+ await (0, beads_js_1.syncBeads)(kshetra);
255
+ console.log(`[shreni reconcile:${kshetra.id}] ${bead.id} PR closed unmerged — blocked`);
256
+ }
257
+ }
258
+ }
259
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/sthapathi/merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface Notification {
2
+ ts: string;
3
+ event: string;
4
+ beadId?: string;
5
+ reason?: string;
6
+ remediation?: string;
7
+ message: string;
8
+ }
9
+ export declare function appendNotification(kshetraId: string, entry: Notification): void;
10
+ export declare function readNotifications(kshetraId: string, opts?: {
11
+ sinceTs?: string;
12
+ limit?: number;
13
+ }): Notification[];
14
+ //# sourceMappingURL=notifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/sthapathi/notifications.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAO/E;AAOD,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC9C,YAAY,EAAE,CA4BhB"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.appendNotification = appendNotification;
4
+ exports.readNotifications = readNotifications;
5
+ const fs_1 = require("fs");
6
+ const path_1 = require("path");
7
+ const activity_log_js_1 = require("./activity-log.js");
8
+ // Append an alert to the per-Kshetra notification feed. Never throws — a failed
9
+ // notification must not crash the worker.
10
+ function appendNotification(kshetraId, entry) {
11
+ try {
12
+ (0, fs_1.mkdirSync)((0, path_1.dirname)((0, activity_log_js_1.notificationsPath)(kshetraId)), { recursive: true });
13
+ (0, fs_1.appendFileSync)((0, activity_log_js_1.notificationsPath)(kshetraId), JSON.stringify(entry) + '\n', 'utf8');
14
+ }
15
+ catch {
16
+ // Never let a notification failure crash the worker.
17
+ }
18
+ }
19
+ // Read the per-Kshetra notification feed. `sinceTs`, when provided, returns only
20
+ // entries strictly newer than it — ISO-8601 timestamps sort chronologically, so
21
+ // a poller passes the last ts it delivered to avoid replaying the whole file.
22
+ // `limit`, when provided, keeps only the most recent N entries (applied after
23
+ // the sinceTs filter). A missing or corrupt feed yields [] — never throws.
24
+ function readNotifications(kshetraId, opts = {}) {
25
+ let raw;
26
+ try {
27
+ raw = (0, fs_1.readFileSync)((0, activity_log_js_1.notificationsPath)(kshetraId), 'utf8');
28
+ }
29
+ catch (err) {
30
+ if (err.code === 'ENOENT')
31
+ return [];
32
+ throw err;
33
+ }
34
+ const out = [];
35
+ for (const line of raw.split('\n')) {
36
+ const trimmed = line.trim();
37
+ if (!trimmed)
38
+ continue;
39
+ let parsed;
40
+ try {
41
+ parsed = JSON.parse(trimmed);
42
+ }
43
+ catch {
44
+ continue; // skip a corrupt line rather than fail the whole read
45
+ }
46
+ if (!parsed.ts)
47
+ continue;
48
+ if (opts.sinceTs && parsed.ts <= opts.sinceTs)
49
+ continue;
50
+ out.push(parsed);
51
+ }
52
+ if (opts.limit !== undefined && out.length > opts.limit) {
53
+ return out.slice(out.length - opts.limit);
54
+ }
55
+ return out;
56
+ }
57
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/sthapathi/notifications.ts"],"names":[],"mappings":";;AAiBA,gDAOC;AAOD,8CA+BC;AA9DD,2BAA6D;AAC7D,+BAA+B;AAC/B,uDAAsD;AAatD,gFAAgF;AAChF,0CAA0C;AAC1C,SAAgB,kBAAkB,CAAC,SAAiB,EAAE,KAAmB;IACvE,IAAI,CAAC;QACH,IAAA,cAAS,EAAC,IAAA,cAAO,EAAC,IAAA,mCAAiB,EAAC,SAAS,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtE,IAAA,mBAAc,EAAC,IAAA,mCAAiB,EAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IACrF,CAAC;IAAC,MAAM,CAAC;QACP,qDAAqD;IACvD,CAAC;AACH,CAAC;AAED,iFAAiF;AACjF,gFAAgF;AAChF,8EAA8E;AAC9E,8EAA8E;AAC9E,4EAA4E;AAC5E,SAAgB,iBAAiB,CAC/B,SAAiB,EACjB,OAA6C,EAAE;IAE/C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,IAAA,iBAAY,EAAC,IAAA,mCAAiB,EAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QAChE,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,IAAI,MAAoB,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAiB,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,CAAC,sDAAsD;QAClE,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,SAAS;QACzB,IAAI,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,EAAE,IAAI,IAAI,CAAC,OAAO;YAAE,SAAS;QACxD,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACxD,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { KshetraConfig } from '../kshetra/config.js';
2
+ import type { Task, SilpiOutput, ParikshakaOutput } from './types.js';
3
+ export declare function gapKey(gap: {
4
+ feature: string;
5
+ description: string;
6
+ }): string;
7
+ export declare function collectTestFiles(repoPath: string, globs?: string[], vendorDirs?: string[]): Promise<string[]>;
8
+ export declare function buildMergedDiff(output: SilpiOutput): string;
9
+ export declare function fileCoverageGaps(kshetra: KshetraConfig, parikshakaOutput: ParikshakaOutput): Promise<void>;
10
+ export declare function runParikshakaDispatch(kshetra: KshetraConfig, task: Task, silpiOutput: SilpiOutput): Promise<void>;
11
+ export declare function dispatchParikshakaAsync(kshetra: KshetraConfig, task: Task, silpiOutput: SilpiOutput): void;
12
+ //# sourceMappingURL=parikshaka-dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parikshaka-dispatch.d.ts","sourceRoot":"","sources":["../../src/sthapathi/parikshaka-dispatch.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAQtE,wBAAgB,MAAM,CAAC,GAAG,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAE5E;AAuBD,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,KAAK,GAAE,MAAM,EAAqD,EAClE,UAAU,GAAE,MAAM,EAA6B,GAC9C,OAAO,CAAC,MAAM,EAAE,CAAC,CAyBnB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAI3D;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,aAAa,EACtB,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,IAAI,CAAC,CAqBf;AAGD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,WAAW,GACvB,IAAI,CAIN"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parikshaka-dispatch.js","sourceRoot":"","sources":["../../src/sthapathi/parikshaka-dispatch.ts"],"names":[],"mappings":"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"}