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,170 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runTail = runTail;
4
+ const fs_1 = require("fs");
5
+ const registry_1 = require("../kshetra/registry");
6
+ const activity_log_1 = require("../sthapathi/activity-log");
7
+ const pickup_1 = require("../sthapathi/pickup");
8
+ const state_1 = require("../kshetra/state");
9
+ const pid_1 = require("./pid");
10
+ const POLL_MS = 500;
11
+ function fmt(ev) {
12
+ const time = new Date(ev.ts).toLocaleTimeString('en-GB', { hour12: false });
13
+ const tag = `[${time}] ${ev.kshetra.padEnd(12)}`;
14
+ switch (ev.type) {
15
+ case 'task_claimed':
16
+ return `${tag} TASK ${ev.beadId}: ${ev.title}`;
17
+ case 'round_start':
18
+ return `${tag} ${ev.agent === 'silpi' ? 'SILPI ' : 'VIHARAPALA'} R${ev.round} starting…`;
19
+ case 'silpi_done': {
20
+ const lint = ev.lintPassed ? '✓' : '✗';
21
+ const tests = ev.testsPassed ? '✓' : '✗';
22
+ const fileList = ev.files.length ? `\n${' '.repeat(27)}files: ${ev.files.join(', ')}` : '';
23
+ return (`${tag} SILPI R${ev.round} conf=${ev.confidence} lint=${lint} tests=${tests}\n` +
24
+ `${' '.repeat(27)}${ev.summary}${fileList}`);
25
+ }
26
+ case 'viharapala_done': {
27
+ const verdict = ev.verdict === 'APPROVE' ? '✓ APPROVE' : '✗ REJECT ';
28
+ const fixes = ev.mustFix.length
29
+ ? `\n${' '.repeat(27)}mustFix: ${ev.mustFix.join(' | ')}`
30
+ : '';
31
+ return `${tag} VIHARAPALA R${ev.round} ${verdict} score=${ev.score}${fixes}`;
32
+ }
33
+ case 'agent_text': {
34
+ const firstLine = (ev.text.split('\n').find(l => l.trim()) ?? ev.text).trim();
35
+ if (!firstLine)
36
+ return null;
37
+ const truncated = firstLine.length > 110 ? firstLine.slice(0, 107) + '…' : firstLine;
38
+ const aLabel = ev.agent === 'silpi' ? 'SILPI ' : ev.agent === 'viharapala' ? 'VIHARAPALA' : 'PARIKSHAKA';
39
+ return `${tag} ${aLabel} > ${truncated}`;
40
+ }
41
+ case 'agent_tool_call': {
42
+ const aLabel = ev.agent === 'silpi' ? 'SILPI ' : ev.agent === 'viharapala' ? 'VIHARAPALA' : 'PARIKSHAKA';
43
+ const detail = ev.detail ? ` ${ev.detail}` : '';
44
+ return `${tag} ${aLabel} ⚙ ${ev.tool}:${detail}`;
45
+ }
46
+ case 'task_done': {
47
+ const status = ev.approved ? '✓ APPROVED' : '✗ BLOCKED ';
48
+ return `${tag} DONE ${ev.beadId} ${status} (${ev.rounds} round${ev.rounds === 1 ? '' : 's'})`;
49
+ }
50
+ case 'beads_synced':
51
+ return `${tag} SYNC beads synced`;
52
+ case 'error':
53
+ return `${tag} ERROR ${ev.beadId ? ev.beadId + ': ' : ''}${ev.message}`;
54
+ default:
55
+ return null;
56
+ }
57
+ }
58
+ function watchFile(path, kshetraId) {
59
+ let fd = null;
60
+ let position = 0;
61
+ let lineBuffer = '';
62
+ let announced = false;
63
+ function openFd() {
64
+ if (fd !== null || !(0, fs_1.existsSync)(path))
65
+ return;
66
+ fd = (0, fs_1.openSync)(path, 'r');
67
+ }
68
+ function readNewLines() {
69
+ openFd();
70
+ if (fd === null)
71
+ return;
72
+ const chunk = Buffer.allocUnsafe(8192);
73
+ let bytesRead;
74
+ do {
75
+ bytesRead = (0, fs_1.readSync)(fd, chunk, 0, chunk.length, position);
76
+ if (bytesRead > 0) {
77
+ position += bytesRead;
78
+ lineBuffer += chunk.subarray(0, bytesRead).toString('utf8');
79
+ const lines = lineBuffer.split('\n');
80
+ lineBuffer = lines.pop() ?? '';
81
+ for (const line of lines) {
82
+ if (!line.trim())
83
+ continue;
84
+ try {
85
+ const ev = JSON.parse(line);
86
+ const formatted = fmt(ev);
87
+ if (formatted)
88
+ console.log(formatted);
89
+ }
90
+ catch { /* skip malformed lines */ }
91
+ }
92
+ }
93
+ } while (bytesRead > 0);
94
+ }
95
+ function tick() {
96
+ if (!announced && !(0, fs_1.existsSync)(path)) {
97
+ console.log(`[${kshetraId}] waiting for first activity…`);
98
+ announced = true;
99
+ }
100
+ readNewLines();
101
+ }
102
+ tick();
103
+ const timer = setInterval(tick, POLL_MS);
104
+ return () => {
105
+ clearInterval(timer);
106
+ if (fd !== null)
107
+ (0, fs_1.closeSync)(fd);
108
+ };
109
+ }
110
+ // Print "no tasks in queue" for each idle Kshetra whose ready queue is empty, so
111
+ // an idle worker is distinguishable from a hung one at a glance. A Kshetra with a
112
+ // bead in flight (WORKING/PREPARING) is streaming activity, so it is left alone;
113
+ // a bd failure is swallowed (a tail command must never crash on a read probe).
114
+ async function reportQueueState(targets) {
115
+ const state = (0, state_1.loadState)();
116
+ await Promise.all(targets.map(async (k) => {
117
+ const phase = state.kshetras[k.id]?.phase;
118
+ if (phase === 'WORKING' || phase === 'PREPARING')
119
+ return;
120
+ try {
121
+ if ((await (0, pickup_1.selectNext)(k)) === null)
122
+ console.log(` [${k.id}] no tasks in queue`);
123
+ }
124
+ catch {
125
+ /* bd unavailable — skip the probe rather than crash the tail */
126
+ }
127
+ }));
128
+ }
129
+ function runTail(opts) {
130
+ const kshetras = (0, registry_1.loadRegistry)();
131
+ if (kshetras.length === 0) {
132
+ console.error('No kshetras registered.');
133
+ process.exit(1);
134
+ }
135
+ const targets = opts.all
136
+ ? kshetras
137
+ : kshetras.filter(k => k.id === opts.kshetraId);
138
+ if (targets.length === 0) {
139
+ console.error(opts.kshetraId
140
+ ? `Kshetra not found: ${opts.kshetraId}`
141
+ : 'Usage: shreni tail --kshetra <id> | --all');
142
+ process.exit(1);
143
+ }
144
+ console.log(`Tailing activity for: ${targets.map(k => k.id).join(', ')} (Ctrl+C to stop)`);
145
+ for (const k of targets) {
146
+ const pid = (0, pid_1.readPid)(k.id);
147
+ const state = pid !== null && (0, pid_1.isAlive)(pid) ? `pid ${pid} (running)` : 'stopped';
148
+ console.log(` [${k.id}] worker ${state}`);
149
+ }
150
+ console.log();
151
+ // Best-effort ready-queue snapshot: an idle worker with an empty queue produces
152
+ // no activity, so tailing an empty log looks the same as a hang. Surface the
153
+ // real reason — "no tasks in queue" — so idleness reads as idle, not stuck
154
+ //. Skipped while a bead is in flight (its activity streams
155
+ // below anyway). Fire-and-forget so streaming starts immediately.
156
+ void reportQueueState(targets);
157
+ // Prefer the new per-kshetra activity log; fall back to the pre-Feature-2 path.
158
+ const stops = targets.map(k => {
159
+ const current = (0, activity_log_1.logPath)(k.id);
160
+ const path = (0, fs_1.existsSync)(current) ? current : (0, fs_1.existsSync)((0, activity_log_1.legacyLogPath)(k.id)) ? (0, activity_log_1.legacyLogPath)(k.id) : current;
161
+ return watchFile(path, k.id);
162
+ });
163
+ function shutdown() {
164
+ stops.forEach(s => s());
165
+ process.exit(0);
166
+ }
167
+ process.on('SIGINT', shutdown);
168
+ process.on('SIGTERM', shutdown);
169
+ }
170
+ //# sourceMappingURL=tail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tail.js","sourceRoot":"","sources":["../../src/cli/tail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runTelemetry(sub: string | undefined): void;
2
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/cli/telemetry.ts"],"names":[],"mappings":"AAQA,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAoC1D"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runTelemetry = runTelemetry;
4
+ const telemetry_js_1 = require("../telemetry/telemetry.js");
5
+ // `shreni telemetry <status|enable|disable>` — the disclosed opt-in control.
6
+ function runTelemetry(sub) {
7
+ switch (sub) {
8
+ case 'enable': {
9
+ console.log(telemetry_js_1.CONSENT_NOTICE);
10
+ console.log('');
11
+ const cfg = (0, telemetry_js_1.enableTelemetry)();
12
+ console.log('Telemetry enabled. Thank you — this is anonymous and opt-out any time.');
13
+ console.log(` anonymous id: ${cfg.anonymousId}`);
14
+ const status = (0, telemetry_js_1.telemetryStatus)();
15
+ if (!status.endpoint) {
16
+ console.log(` no collector endpoint is configured, so events are written locally only:\n` +
17
+ ` ${status.localSink}`);
18
+ }
19
+ break;
20
+ }
21
+ case 'disable': {
22
+ (0, telemetry_js_1.disableTelemetry)();
23
+ console.log('Telemetry disabled. No events will be sent.');
24
+ break;
25
+ }
26
+ case 'status':
27
+ case undefined: {
28
+ const s = (0, telemetry_js_1.telemetryStatus)();
29
+ console.log(`Telemetry: ${s.enabled ? 'ENABLED' : 'disabled'}${s.hardOptOut ? ' (hard opt-out via env)' : ''}`);
30
+ console.log(` anonymous id: ${s.anonymousId ?? '(none — not yet enabled)'}`);
31
+ console.log(` endpoint: ${s.endpoint ?? '(none — local sink only)'}`);
32
+ if (!s.enabled)
33
+ console.log(' enable with: shreni telemetry enable');
34
+ break;
35
+ }
36
+ default:
37
+ console.error(`Unknown telemetry subcommand: ${sub}`);
38
+ console.error('Usage: shreni telemetry <status|enable|disable>');
39
+ process.exit(1);
40
+ }
41
+ }
42
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/cli/telemetry.ts"],"names":[],"mappings":";;AAQA,oCAoCC;AA5CD,4DAKmC;AAEnC,6EAA6E;AAC7E,SAAgB,YAAY,CAAC,GAAuB;IAClD,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,6BAAc,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,MAAM,GAAG,GAAG,IAAA,8BAAe,GAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAC;YACtF,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,IAAA,8BAAe,GAAE,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CACT,8EAA8E;oBAC5E,OAAO,MAAM,CAAC,SAAS,EAAE,CAC5B,CAAC;YACJ,CAAC;YACD,MAAM;QACR,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,IAAA,+BAAgB,GAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC3D,MAAM;QACR,CAAC;QACD,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,CAAC,GAAG,IAAA,8BAAe,GAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAChH,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,WAAW,IAAI,0BAA0B,EAAE,CAAC,CAAC;YAC9E,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,QAAQ,IAAI,0BAA0B,EAAE,CAAC,CAAC;YAC3E,IAAI,CAAC,CAAC,CAAC,OAAO;gBAAE,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;YACvE,MAAM;QACR,CAAC;QACD;YACE,OAAO,CAAC,KAAK,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAC;YACtD,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;YACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ export declare const SETTINGS_PATH: string;
2
+ export declare const REQUIRED_COMMAND = "bd prime";
3
+ export interface HookCheckResult {
4
+ present: boolean;
5
+ }
6
+ export interface HooksVerificationResult {
7
+ sessionStart: HookCheckResult;
8
+ preCompact: HookCheckResult;
9
+ allPresent: boolean;
10
+ }
11
+ export declare function verifyHooks(settingsPath?: string): HooksVerificationResult;
12
+ //# sourceMappingURL=verify-hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-hooks.d.ts","sourceRoot":"","sources":["../../src/cli/verify-hooks.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,aAAa,QAA8C,CAAC;AACzE,eAAO,MAAM,gBAAgB,aAAa,CAAC;AAoB3C,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,eAAe,CAAC;IAC9B,UAAU,EAAE,eAAe,CAAC;IAC5B,UAAU,EAAE,OAAO,CAAC;CACrB;AASD,wBAAgB,WAAW,CAAC,YAAY,SAAgB,GAAG,uBAAuB,CAsBjF"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.REQUIRED_COMMAND = exports.SETTINGS_PATH = void 0;
4
+ exports.verifyHooks = verifyHooks;
5
+ const fs_1 = require("fs");
6
+ const path_1 = require("path");
7
+ const os_1 = require("os");
8
+ exports.SETTINGS_PATH = (0, path_1.join)((0, os_1.homedir)(), '.claude', 'settings.json');
9
+ exports.REQUIRED_COMMAND = 'bd prime';
10
+ function hasHook(matchers, command) {
11
+ if (!Array.isArray(matchers))
12
+ return false;
13
+ return matchers.some(m => Array.isArray(m?.hooks) && m.hooks.some(h => h.command === command));
14
+ }
15
+ function verifyHooks(settingsPath = exports.SETTINGS_PATH) {
16
+ let settings = {};
17
+ try {
18
+ const raw = (0, fs_1.readFileSync)((0, path_1.resolve)(settingsPath), 'utf8');
19
+ settings = JSON.parse(raw);
20
+ }
21
+ catch (err) {
22
+ const e = err;
23
+ if (e.code !== 'ENOENT')
24
+ throw new Error(`Cannot read settings at ${settingsPath}: ${e.message}`);
25
+ }
26
+ const sessionStart = {
27
+ present: hasHook(settings.hooks?.SessionStart, exports.REQUIRED_COMMAND),
28
+ };
29
+ const preCompact = {
30
+ present: hasHook(settings.hooks?.PreCompact, exports.REQUIRED_COMMAND),
31
+ };
32
+ return {
33
+ sessionStart,
34
+ preCompact,
35
+ allPresent: sessionStart.present && preCompact.present,
36
+ };
37
+ }
38
+ //# sourceMappingURL=verify-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-hooks.js","sourceRoot":"","sources":["../../src/cli/verify-hooks.ts"],"names":[],"mappings":";;;AA0CA,kCAsBC;AAhED,2BAAkC;AAClC,+BAAqC;AACrC,2BAA6B;AAEhB,QAAA,aAAa,GAAG,IAAA,WAAI,EAAC,IAAA,YAAO,GAAE,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;AAC5D,QAAA,gBAAgB,GAAG,UAAU,CAAC;AA8B3C,SAAS,OAAO,CAAC,QAAmC,EAAE,OAAe;IACnE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,OAAO,QAAQ,CAAC,IAAI,CAClB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CACzE,CAAC;AACJ,CAAC;AAED,SAAgB,WAAW,CAAC,YAAY,GAAG,qBAAa;IACtD,IAAI,QAAQ,GAAmB,EAAE,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAA,iBAAY,EAAC,IAAA,cAAO,EAAC,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;QACxD,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAA4B,CAAC;QACvC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,YAAY,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACpG,CAAC;IAED,MAAM,YAAY,GAAoB;QACpC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,wBAAgB,CAAC;KACjE,CAAC;IACF,MAAM,UAAU,GAAoB;QAClC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,wBAAgB,CAAC;KAC/D,CAAC;IAEF,OAAO;QACL,YAAY;QACZ,UAAU;QACV,UAAU,EAAE,YAAY,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO;KACvD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/cli/worker.ts"],"names":[],"mappings":""}
@@ -0,0 +1,211 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const registry_1 = require("../kshetra/registry");
4
+ const index_1 = require("../sthapathi/index");
5
+ const pickup_1 = require("../sthapathi/pickup");
6
+ const dispatch_1 = require("../sthapathi/dispatch");
7
+ const errors_1 = require("../sthapathi/errors");
8
+ const recover_1 = require("../sthapathi/recover");
9
+ const watchdog_1 = require("../sthapathi/watchdog");
10
+ const branch_1 = require("../sthapathi/branch");
11
+ const activity_log_1 = require("../sthapathi/activity-log");
12
+ const self_heal_1 = require("../sthapathi/self-heal");
13
+ const state_1 = require("../kshetra/state");
14
+ const beads_1 = require("../sthapathi/beads");
15
+ const merge_1 = require("../sthapathi/merge");
16
+ // A worker process drives exactly one kshetra. Its id is passed as argv[2] by
17
+ // `shreni start`. Each worker has its own PID + logs under ~/.shreni/kshetra/<id>/,
18
+ // so one kshetra crashing never takes the others down.
19
+ const kshetraId = process.argv[2];
20
+ if (!kshetraId) {
21
+ console.error('[shreni worker] missing kshetra id argument');
22
+ process.exit(1);
23
+ }
24
+ const kshetra = (0, registry_1.loadRegistry)().find(k => k.id === kshetraId);
25
+ if (!kshetra) {
26
+ console.error(`[shreni worker] kshetra not registered: ${kshetraId}`);
27
+ process.exit(1);
28
+ }
29
+ // Persist the phase so `shreni status` / Phalaka can show it cross-process. Entering
30
+ // a non-IDLE phase also refreshes the heartbeat immediately, so the watchdog's
31
+ // liveness window starts fresh at the moment work begins (rather than up to one
32
+ // heartbeat tick stale). See the watchdog design §3.1.
33
+ const scheduler = (0, index_1.createScheduler)({
34
+ onPhase: (_id, phase) => {
35
+ (0, state_1.setPhase)(kshetra, phase);
36
+ if (phase !== 'IDLE')
37
+ (0, activity_log_1.touchHeartbeat)(kshetra.id);
38
+ },
39
+ });
40
+ // Run one task through the Silpi↔Viharapala loop, funnelling any throw into the
41
+ // error handler. Shared by the scheduler's WORK phase and by resume (same loop,
42
+ // same error policy — resume just skips SELECT/PREPARE).
43
+ async function runTaskSafely(k, task, branch, signal) {
44
+ try {
45
+ return await (0, dispatch_1.runSilpiViharapalaLoop)(k, task, branch, signal);
46
+ }
47
+ catch (err) {
48
+ // A self-heal abort is a SANCTIONED cancellation, not a cycle failure — the
49
+ // resume watcher deliberately aborted this run and will RECOVER the bead in
50
+ // recoverKshetra. Routing it through handleCycleError would flag the bead and
51
+ // clean the branch out from under the recovery. Swallow it quietly.
52
+ if (err instanceof errors_1.AgentAbortedError)
53
+ return { approved: false, note: 'aborted for self-heal' };
54
+ await (0, errors_1.handleCycleError)(k, task, err);
55
+ return { approved: false, note: 'cycle error (handled)' };
56
+ }
57
+ }
58
+ // The single in-flight run's cancellation handle + a promise that resolves once
59
+ // it has fully unwound, plus a gate the self-heal holds while RECOVER runs so no
60
+ // poll cycle mutates the work tree underneath it.
61
+ let activeRun;
62
+ let healing = false;
63
+ const hooks = {
64
+ async selectNext(k) {
65
+ // While a self-heal is in flight, no cycle may proceed to PREPARE (which
66
+ // checks out main / mutates the tree) and race recoverKshetra. selectNext is
67
+ // read-only and runs first in the cycle, so returning null here idles the
68
+ // cycle before any mutation.
69
+ if (healing)
70
+ return null;
71
+ if ((0, state_1.isKshetraManuallyPaused)(k))
72
+ return null;
73
+ return (0, pickup_1.selectNext)(k);
74
+ },
75
+ prepareTask: pickup_1.prepareTask,
76
+ async runTask(task, k) {
77
+ // Publish a cancellation handle so the resume watcher can abort a hung run
78
+ // and RECOVER in-process. `done` resolves in the finally, after the loop has
79
+ // unwound and (via runCycle's own finally) phase has returned to IDLE.
80
+ const controller = new AbortController();
81
+ let resolveDone;
82
+ const done = new Promise(resolve => { resolveDone = resolve; });
83
+ activeRun = { controller, task, done };
84
+ try {
85
+ await runTaskSafely(k, task, (0, branch_1.branchName)(task), controller.signal);
86
+ }
87
+ finally {
88
+ activeRun = undefined;
89
+ resolveDone();
90
+ }
91
+ },
92
+ };
93
+ // Assigned once startup recovery has finished and the poll loop is armed.
94
+ let stop;
95
+ const BEADS_SYNC_INTERVAL_MS = 5 * 60 * 1000;
96
+ async function sync() {
97
+ try {
98
+ await (0, beads_1.syncBeads)(kshetra);
99
+ console.log(`[shreni worker:${kshetraId}] beads synced`);
100
+ }
101
+ catch (err) {
102
+ console.error(`[shreni worker:${kshetraId}] beads sync failed:`, err);
103
+ }
104
+ }
105
+ // Reconcile deferred PR beads (mergePolicy 'pr', 3r2): close any whose PR has
106
+ // merged, block any whose PR was closed unmerged. Gated on IDLE + not-healing so
107
+ // its branch deletes never race an in-flight agent's work tree, mirroring the
108
+ // scheduler's "mutations only when nothing is in flight" invariant.
109
+ async function reconcile() {
110
+ if (scheduler.getPhase(kshetra.id) !== 'IDLE' || healing)
111
+ return;
112
+ try {
113
+ await (0, merge_1.reconcilePullRequests)(kshetra);
114
+ }
115
+ catch (err) {
116
+ console.error(`[shreni worker:${kshetraId}] PR reconcile failed:`, err);
117
+ }
118
+ }
119
+ // Startup: (1) sync the local DB, (2) RECONCILE any drift left by a crash/restart
120
+ // (dirty tree, stale bead-* branches, orphaned in_progress beads) back to a clean
121
+ // IDLE, (3) RESUME any reopened WIP through the work loop — bypassing the pickup
122
+ // health gate — and only THEN (4) arm the poll loop. Resuming before the loop is
123
+ // armed is what keeps resume (which runs WORKING outside the scheduler's phase
124
+ // machine) from racing a poll tick that would check out main under it. See
125
+ // recover.ts / the Sthapathi workflow design §4.2–4.3.
126
+ async function startup() {
127
+ await sync();
128
+ const resumable = await (0, recover_1.recoverKshetra)(kshetra);
129
+ // RECOVER has just reconciled the drift a stuck pause escalated over, so a
130
+ // leftover auto-escalated stuck pause is now stale — clear it, or the fresh
131
+ // worker comes up paused and idle, flying the old banner.
132
+ // A deliberate user pause is left intact.
133
+ if ((0, state_1.clearStuckPauseOnRecover)(kshetra)) {
134
+ console.log(`[shreni worker:${kshetraId}] cleared stale stuck pause after recovery`);
135
+ }
136
+ console.log(`[shreni worker:${kshetraId}] recovery complete (${resumable.length} to resume)`);
137
+ for (const task of resumable) {
138
+ console.log(`[shreni worker:${kshetraId}] resuming WIP bead ${task.id} (bypassing health gate)`);
139
+ await (0, recover_1.scheduleResume)(kshetra, task, runTaskSafely);
140
+ }
141
+ // Reconcile any PRs that merged/closed while this worker was down, before the
142
+ // poll loop starts picking up new work.
143
+ await reconcile();
144
+ stop = scheduler.scheduleLoop(kshetra, hooks);
145
+ }
146
+ startup().catch(err => {
147
+ console.error(`[shreni worker:${kshetraId}] startup failed:`, err);
148
+ // Arm the poll loop anyway so a recovery/resume hiccup doesn't leave the worker
149
+ // permanently idle — the normal gated pickup path is the safe fallback.
150
+ stop ??= scheduler.scheduleLoop(kshetra, hooks);
151
+ });
152
+ const syncTimer = setInterval(() => sync().catch(err => console.error(`[shreni worker:${kshetraId}] beads sync failed:`, err)), BEADS_SYNC_INTERVAL_MS);
153
+ // Poll open PRs for deferred (mergePolicy 'pr') beads and close/block them as
154
+ // their PRs land. Same cadence as the beads sync — merges are human-paced, so a
155
+ // tight loop buys nothing, and reconcile() self-gates to IDLE anyway.
156
+ const reconcileTimer = setInterval(() => reconcile().catch(err => console.error(`[shreni worker:${kshetraId}] PR reconcile failed:`, err)), BEADS_SYNC_INTERVAL_MS);
157
+ // Watchdog: detect a stuck worker (hung agent or a repeating stall loop) and
158
+ // escalate — pause for manual resume + push an operator notification with
159
+ // remediation. Runs every minute; thresholds in watchdog.ts.
160
+ const WATCHDOG_INTERVAL_MS = 60 * 1000;
161
+ const watchdogTimer = setInterval(() => {
162
+ // hasReadyWork: probe the RAW ready queue (pickup's selectNext, not the
163
+ // pause-gated hook) so the watchdog can tell "idle, nothing to do" from "hung"
164
+ // and never escalate an empty-queue Kshetra to Phalaka.
165
+ (0, watchdog_1.runWatchdogOnce)(kshetra, () => scheduler.getPhase(kshetra.id), Date.now(), {
166
+ hasReadyWork: async () => (await (0, pickup_1.selectNext)(kshetra)) !== null,
167
+ }).catch((err) => console.error(`[shreni worker:${kshetraId}] watchdog failed:`, err));
168
+ }, WATCHDOG_INTERVAL_MS);
169
+ // Worker-liveness heartbeat (the watchdog design §3.1, fixes RC1): while a phase
170
+ // is active, stamp the heartbeat on a fixed cadence regardless of whether the agent
171
+ // has emitted anything. This is what makes a long SILENT tool call (build, test run,
172
+ // slow bd op) stop reading as a hung agent. Faster than the 20m stuck threshold so a
173
+ // real worker-event-loop wedge still goes stale and trips.
174
+ const HEARTBEAT_INTERVAL_MS = 30 * 1000;
175
+ const heartbeatTimer = setInterval(() => {
176
+ if (scheduler.getPhase(kshetra.id) !== 'IDLE')
177
+ (0, activity_log_1.touchHeartbeat)(kshetra.id);
178
+ }, HEARTBEAT_INTERVAL_MS);
179
+ // Resume watcher: `shreni resume` runs in a SEPARATE process
180
+ // and can only flip state.json — it cannot reach into this worker to cancel the
181
+ // hung agent. So we poll for the stuck-paused -> resumed transition and, when we
182
+ // see it with a run still in flight, self-heal in-process: abort the hung agent,
183
+ // RECOVER, and re-arm. Faster than the 60s watchdog so recovery lands promptly,
184
+ // and it holds the `healing` gate so RECOVER never races a poll cycle.
185
+ const RESUME_WATCH_INTERVAL_MS = 5 * 1000;
186
+ let prevPause;
187
+ const resumeWatchTimer = setInterval(() => {
188
+ const curr = (0, state_1.loadState)().kshetras[kshetra.id];
189
+ if ((0, self_heal_1.shouldSelfHeal)(prevPause, curr, activeRun !== undefined, healing)) {
190
+ const run = activeRun;
191
+ healing = true;
192
+ console.log(`[shreni worker:${kshetraId}] stuck resume detected — self-healing bead ${run.task.id}`);
193
+ (0, self_heal_1.selfHeal)(kshetra, run)
194
+ .then(() => console.log(`[shreni worker:${kshetraId}] self-heal complete — back to IDLE`))
195
+ .catch((err) => console.error(`[shreni worker:${kshetraId}] self-heal failed:`, err))
196
+ .finally(() => { healing = false; });
197
+ }
198
+ prevPause = curr;
199
+ }, RESUME_WATCH_INTERVAL_MS);
200
+ function shutdown() {
201
+ stop?.();
202
+ clearInterval(syncTimer);
203
+ clearInterval(reconcileTimer);
204
+ clearInterval(watchdogTimer);
205
+ clearInterval(heartbeatTimer);
206
+ clearInterval(resumeWatchTimer);
207
+ process.exit(0);
208
+ }
209
+ process.on('SIGTERM', shutdown);
210
+ process.on('SIGINT', shutdown);
211
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/cli/worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import { z } from 'zod';
2
+ export declare const KshetraConfigSchema: z.ZodObject<{
3
+ id: z.ZodString;
4
+ name: z.ZodString;
5
+ description: z.ZodOptional<z.ZodString>;
6
+ repo: z.ZodObject<{
7
+ path: z.ZodString;
8
+ remote: z.ZodString;
9
+ mainBranch: z.ZodDefault<z.ZodString>;
10
+ branchPattern: z.ZodDefault<z.ZodString>;
11
+ mergePolicy: z.ZodOptional<z.ZodEnum<{
12
+ push: "push";
13
+ pr: "pr";
14
+ }>>;
15
+ }, z.core.$strip>;
16
+ beads: z.ZodObject<{
17
+ path: z.ZodString;
18
+ remote: z.ZodString;
19
+ mode: z.ZodDefault<z.ZodLiteral<"embedded">>;
20
+ }, z.core.$strip>;
21
+ stack: z.ZodObject<{
22
+ language: z.ZodString;
23
+ framework: z.ZodOptional<z.ZodString>;
24
+ packageManager: z.ZodOptional<z.ZodString>;
25
+ testRunner: z.ZodOptional<z.ZodString>;
26
+ linter: z.ZodOptional<z.ZodString>;
27
+ buildCommand: z.ZodOptional<z.ZodString>;
28
+ lintCommand: z.ZodOptional<z.ZodString>;
29
+ testFileGlobs: z.ZodOptional<z.ZodArray<z.ZodString>>;
30
+ vendorDirs: z.ZodOptional<z.ZodArray<z.ZodString>>;
31
+ failCountPattern: z.ZodOptional<z.ZodString>;
32
+ }, z.core.$strip>;
33
+ conventions: z.ZodDefault<z.ZodObject<{
34
+ styleGuide: z.ZodOptional<z.ZodString>;
35
+ architecture: z.ZodOptional<z.ZodString>;
36
+ reviewGuide: z.ZodOptional<z.ZodString>;
37
+ }, z.core.$strip>>;
38
+ agents: z.ZodDefault<z.ZodObject<{
39
+ provider: z.ZodDefault<z.ZodEnum<{
40
+ anthropic: "anthropic";
41
+ gemini: "gemini";
42
+ openai: "openai";
43
+ }>>;
44
+ model: z.ZodDefault<z.ZodString>;
45
+ maxRoundsPerBead: z.ZodDefault<z.ZodNumber>;
46
+ }, z.core.$strip>>;
47
+ priority: z.ZodDefault<z.ZodObject<{
48
+ p0AutoAssign: z.ZodDefault<z.ZodBoolean>;
49
+ maxConcurrentBeads: z.ZodDefault<z.ZodNumber>;
50
+ }, z.core.$strip>>;
51
+ watchdog: z.ZodOptional<z.ZodObject<{
52
+ stuckThresholdMs: z.ZodOptional<z.ZodNumber>;
53
+ maxOutcomeRepeat: z.ZodOptional<z.ZodNumber>;
54
+ maxRecoverAttempts: z.ZodOptional<z.ZodNumber>;
55
+ }, z.core.$strip>>;
56
+ }, z.core.$strip>;
57
+ export type KshetraConfig = z.infer<typeof KshetraConfigSchema>;
58
+ export declare class KshetraConfigError extends Error {
59
+ readonly configPath: string;
60
+ readonly cause?: unknown | undefined;
61
+ constructor(configPath: string, message: string, cause?: unknown | undefined);
62
+ }
63
+ export declare function loadKshetraConfig(configPath: string): KshetraConfig;
64
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/kshetra/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAgGxB,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAW9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,qBAAa,kBAAmB,SAAQ,KAAK;aAEzB,UAAU,EAAE,MAAM;aAElB,KAAK,CAAC,EAAE,OAAO;gBAFf,UAAU,EAAE,MAAM,EAClC,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,OAAO,YAAA;CAKlC;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,CA0BnE"}