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
package/dist/cli/logs.js
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseNotesToBeadLog = parseNotesToBeadLog;
|
|
4
|
+
exports.formatBeadLog = formatBeadLog;
|
|
5
|
+
exports.runLogs = runLogs;
|
|
6
|
+
const zod_1 = require("zod");
|
|
7
|
+
const registry_1 = require("../kshetra/registry");
|
|
8
|
+
const beads_1 = require("../sthapathi/beads");
|
|
9
|
+
function parseNotesToBeadLog(beadId, title, status, notes) {
|
|
10
|
+
const roundMap = new Map();
|
|
11
|
+
const extra = [];
|
|
12
|
+
for (const raw of (notes ?? '').split('\n')) {
|
|
13
|
+
const line = raw.trim();
|
|
14
|
+
if (!line)
|
|
15
|
+
continue;
|
|
16
|
+
const m = line.match(/^Round\s+(\d+):\s+(.+)$/i);
|
|
17
|
+
if (m) {
|
|
18
|
+
const n = parseInt(m[1], 10);
|
|
19
|
+
const event = m[2] ?? '';
|
|
20
|
+
if (!roundMap.has(n))
|
|
21
|
+
roundMap.set(n, []);
|
|
22
|
+
roundMap.get(n).push(event);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
extra.push(line);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const rounds = Array.from(roundMap.entries())
|
|
29
|
+
.sort(([a], [b]) => a - b)
|
|
30
|
+
.map(([round, events]) => ({ round, events }));
|
|
31
|
+
return { beadId, title, status, rounds, extra };
|
|
32
|
+
}
|
|
33
|
+
function formatBeadLog(log) {
|
|
34
|
+
const lines = [];
|
|
35
|
+
lines.push(`[${log.status}] ${log.beadId} · ${log.title}`);
|
|
36
|
+
for (const { round, events } of log.rounds) {
|
|
37
|
+
lines.push(` Round ${round}:`);
|
|
38
|
+
for (const ev of events)
|
|
39
|
+
lines.push(` ${ev}`);
|
|
40
|
+
}
|
|
41
|
+
for (const ev of log.extra)
|
|
42
|
+
lines.push(` ${ev}`);
|
|
43
|
+
return lines.join('\n');
|
|
44
|
+
}
|
|
45
|
+
// ── Beads queries ─────────────────────────────────────────────────────────────
|
|
46
|
+
const BeadsItemSchema = zod_1.z.object({
|
|
47
|
+
id: zod_1.z.string(),
|
|
48
|
+
title: zod_1.z.string(),
|
|
49
|
+
status: zod_1.z.string().optional(),
|
|
50
|
+
notes: zod_1.z.string().optional(),
|
|
51
|
+
});
|
|
52
|
+
function parseItems(raw) {
|
|
53
|
+
try {
|
|
54
|
+
const parsed = JSON.parse(raw);
|
|
55
|
+
if (!Array.isArray(parsed))
|
|
56
|
+
return [];
|
|
57
|
+
return parsed.flatMap(item => {
|
|
58
|
+
const r = BeadsItemSchema.safeParse(item);
|
|
59
|
+
return r.success ? [r.data] : [];
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function getBeadLogsForKshetra(kshetra) {
|
|
67
|
+
const bdClient = (0, beads_1.bd)(kshetra);
|
|
68
|
+
const [inProgressRaw, closedRaw] = await Promise.all([
|
|
69
|
+
bdClient.list({ status: 'in_progress' }).catch(() => '[]'),
|
|
70
|
+
bdClient.list({ status: 'closed' }).catch(() => '[]'),
|
|
71
|
+
]);
|
|
72
|
+
const items = [
|
|
73
|
+
...parseItems(inProgressRaw),
|
|
74
|
+
...parseItems(closedRaw),
|
|
75
|
+
];
|
|
76
|
+
return items.map(item => parseNotesToBeadLog(item.id, item.title, item.status ?? 'unknown', item.notes));
|
|
77
|
+
}
|
|
78
|
+
async function findBeadLog(beadId, kshetras) {
|
|
79
|
+
for (const k of kshetras) {
|
|
80
|
+
const bdClient = (0, beads_1.bd)(k);
|
|
81
|
+
try {
|
|
82
|
+
const raw = await bdClient.show(beadId);
|
|
83
|
+
const parsed = JSON.parse(raw);
|
|
84
|
+
const item = BeadsItemSchema.safeParse(parsed);
|
|
85
|
+
if (item.success) {
|
|
86
|
+
return {
|
|
87
|
+
log: parseNotesToBeadLog(item.data.id, item.data.title, item.data.status ?? 'unknown', item.data.notes),
|
|
88
|
+
kshetra: k,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// bead not in this kshetra
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
async function runLogs(opts) {
|
|
99
|
+
const kshetras = (0, registry_1.loadRegistry)();
|
|
100
|
+
if (kshetras.length === 0) {
|
|
101
|
+
console.log('No kshetras registered.');
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (opts.beadId) {
|
|
105
|
+
const found = await findBeadLog(opts.beadId, kshetras);
|
|
106
|
+
if (!found) {
|
|
107
|
+
console.error(`Bead not found: ${opts.beadId}`);
|
|
108
|
+
process.exit(1);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
console.log(formatBeadLog(found.log));
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const targets = opts.all
|
|
115
|
+
? kshetras
|
|
116
|
+
: opts.kshetraId
|
|
117
|
+
? kshetras.filter(k => k.id === opts.kshetraId)
|
|
118
|
+
: [];
|
|
119
|
+
if (targets.length === 0) {
|
|
120
|
+
if (opts.kshetraId) {
|
|
121
|
+
console.error(`Kshetra not found: ${opts.kshetraId}`);
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
console.error('Usage: shreni logs --kshetra <id> | --bead <id> | --all');
|
|
126
|
+
process.exit(1);
|
|
127
|
+
}
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
for (const k of targets) {
|
|
131
|
+
console.log(`Kshetra: ${k.name} (${k.id})`);
|
|
132
|
+
console.log('─'.repeat(50));
|
|
133
|
+
const logs = await getBeadLogsForKshetra(k);
|
|
134
|
+
if (logs.length === 0) {
|
|
135
|
+
console.log(' No bead history.');
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
for (const log of logs)
|
|
139
|
+
console.log(formatBeadLog(log));
|
|
140
|
+
}
|
|
141
|
+
console.log();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/cli/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type MigrateStatus = 'migrated' | 'already_canonical' | 'nothing_to_migrate';
|
|
2
|
+
export interface MigrateResult {
|
|
3
|
+
status: MigrateStatus;
|
|
4
|
+
id?: string;
|
|
5
|
+
configPath: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function runMigrate(kshetraPath: string): MigrateResult;
|
|
8
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/cli/migrate.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,mBAAmB,GAAG,oBAAoB,CAAC;AAEpF,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,aAAa,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB;AAgBD,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CA6D7D"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.runMigrate = runMigrate;
|
|
37
|
+
const fs_1 = require("fs");
|
|
38
|
+
const path_1 = require("path");
|
|
39
|
+
const os_1 = require("os");
|
|
40
|
+
const yaml = __importStar(require("js-yaml"));
|
|
41
|
+
const config_js_1 = require("../kshetra/config.js");
|
|
42
|
+
const registry_js_1 = require("../kshetra/registry.js");
|
|
43
|
+
// Absolutize a config path field. Expands a leading `~` to the home directory
|
|
44
|
+
// and resolves a relative path against the Kshetra directory. The loader uses
|
|
45
|
+
// repo.path / beads.path verbatim as the git/exec cwd and does NOT expand `~`
|
|
46
|
+
// (config.ts), so migration is where those paths are made absolute.
|
|
47
|
+
function absolutizePath(p, baseDir) {
|
|
48
|
+
if (p === '~')
|
|
49
|
+
return (0, os_1.homedir)();
|
|
50
|
+
if (p.startsWith('~/'))
|
|
51
|
+
return (0, path_1.join)((0, os_1.homedir)(), p.slice(2));
|
|
52
|
+
return (0, path_1.resolve)(baseDir, p);
|
|
53
|
+
}
|
|
54
|
+
// Move a legacy root `<dir>/kshetra.yaml` to the canonical
|
|
55
|
+
// `<dir>/.shreni/kshetra.yaml`, absolutize its repo/beads paths, re-register the
|
|
56
|
+
// Kshetra to point at the new location, and delete the root file. Idempotent:
|
|
57
|
+
// re-running once the canonical file exists (and the root is gone) is a no-op.
|
|
58
|
+
function runMigrate(kshetraPath) {
|
|
59
|
+
const dir = (0, path_1.resolve)(kshetraPath);
|
|
60
|
+
const rootPath = (0, path_1.join)(dir, 'kshetra.yaml');
|
|
61
|
+
const canonicalPath = (0, path_1.join)(dir, '.shreni', 'kshetra.yaml');
|
|
62
|
+
const rootExists = (0, fs_1.existsSync)(rootPath);
|
|
63
|
+
const canonicalExists = (0, fs_1.existsSync)(canonicalPath);
|
|
64
|
+
// Already migrated (or a fresh init wrote canonical directly): nothing to do.
|
|
65
|
+
// If a stale root file lingers next to the canonical one, remove it so there
|
|
66
|
+
// is exactly one source of truth.
|
|
67
|
+
if (canonicalExists) {
|
|
68
|
+
if (rootExists)
|
|
69
|
+
(0, fs_1.rmSync)(rootPath);
|
|
70
|
+
return { status: rootExists ? 'migrated' : 'already_canonical', configPath: canonicalPath };
|
|
71
|
+
}
|
|
72
|
+
if (!rootExists) {
|
|
73
|
+
return { status: 'nothing_to_migrate', configPath: canonicalPath };
|
|
74
|
+
}
|
|
75
|
+
// Parse the legacy YAML, absolutize the path fields, and write the canonical
|
|
76
|
+
// file. We mutate the parsed object (not the raw text) so the paths are fixed;
|
|
77
|
+
// formatting/comments are not preserved by design (this is a one-time move).
|
|
78
|
+
let raw;
|
|
79
|
+
try {
|
|
80
|
+
raw = (0, fs_1.readFileSync)(rootPath, 'utf8');
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
throw new config_js_1.KshetraConfigError(rootPath, `Cannot read file: ${err.message}`, err);
|
|
84
|
+
}
|
|
85
|
+
let parsed;
|
|
86
|
+
try {
|
|
87
|
+
parsed = (yaml.load(raw) ?? {});
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
throw new config_js_1.KshetraConfigError(rootPath, `Invalid YAML: ${err.message}`, err);
|
|
91
|
+
}
|
|
92
|
+
const repo = parsed['repo'];
|
|
93
|
+
if (repo?.path)
|
|
94
|
+
repo.path = absolutizePath(repo.path, dir);
|
|
95
|
+
const beads = parsed['beads'];
|
|
96
|
+
if (beads?.path)
|
|
97
|
+
beads.path = absolutizePath(beads.path, dir);
|
|
98
|
+
(0, fs_1.mkdirSync)((0, path_1.dirname)(canonicalPath), { recursive: true });
|
|
99
|
+
(0, fs_1.writeFileSync)(canonicalPath, yaml.dump(parsed), 'utf8');
|
|
100
|
+
// Validate the migrated config and re-register it to the canonical path. If
|
|
101
|
+
// validation fails, remove the partial canonical file (so a retry doesn't see
|
|
102
|
+
// an invalid file as "already migrated") and leave the root untouched.
|
|
103
|
+
let config;
|
|
104
|
+
try {
|
|
105
|
+
config = (0, config_js_1.loadKshetraConfig)(canonicalPath);
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
(0, fs_1.rmSync)(canonicalPath, { force: true });
|
|
109
|
+
throw err;
|
|
110
|
+
}
|
|
111
|
+
(0, registry_js_1.registerKshetra)(config.id, canonicalPath);
|
|
112
|
+
// Only remove the legacy file once the canonical one is written and valid.
|
|
113
|
+
(0, fs_1.rmSync)(rootPath);
|
|
114
|
+
return { status: 'migrated', id: config.id, configPath: canonicalPath };
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/cli/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type PauseResult = {
|
|
2
|
+
status: 'paused';
|
|
3
|
+
id: string;
|
|
4
|
+
} | {
|
|
5
|
+
status: 'not_found';
|
|
6
|
+
id: string;
|
|
7
|
+
};
|
|
8
|
+
export type ResumeResult = {
|
|
9
|
+
status: 'resumed';
|
|
10
|
+
id: string;
|
|
11
|
+
} | {
|
|
12
|
+
status: 'resumed_self_heal';
|
|
13
|
+
id: string;
|
|
14
|
+
} | {
|
|
15
|
+
status: 'resumed_needs_start';
|
|
16
|
+
id: string;
|
|
17
|
+
hint: string;
|
|
18
|
+
} | {
|
|
19
|
+
status: 'not_found';
|
|
20
|
+
id: string;
|
|
21
|
+
};
|
|
22
|
+
export declare function pauseKshetraById(id: string): PauseResult;
|
|
23
|
+
export declare function resumeKshetraById(id: string): ResumeResult;
|
|
24
|
+
//# sourceMappingURL=pause.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pause.d.ts","sourceRoot":"","sources":["../../src/cli/pause.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GACnB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,MAAM,MAAM,YAAY,GAEpB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAGjC;IAAE,MAAM,EAAE,mBAAmB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAI3C;IAAE,MAAM,EAAE,qBAAqB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,CAUxD;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,CAsB1D"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pauseKshetraById = pauseKshetraById;
|
|
4
|
+
exports.resumeKshetraById = resumeKshetraById;
|
|
5
|
+
const registry_1 = require("../kshetra/registry");
|
|
6
|
+
const state_1 = require("../kshetra/state");
|
|
7
|
+
const pid_1 = require("./pid");
|
|
8
|
+
function pauseKshetraById(id) {
|
|
9
|
+
const kshetra = (0, registry_1.loadRegistry)().find(k => k.id === id);
|
|
10
|
+
if (!kshetra)
|
|
11
|
+
return { status: 'not_found', id };
|
|
12
|
+
(0, state_1.pauseKshetra)(kshetra, {
|
|
13
|
+
manual: true,
|
|
14
|
+
reason: 'manual',
|
|
15
|
+
message: 'Paused via CLI',
|
|
16
|
+
});
|
|
17
|
+
return { status: 'paused', id };
|
|
18
|
+
}
|
|
19
|
+
function resumeKshetraById(id) {
|
|
20
|
+
const kshetra = (0, registry_1.loadRegistry)().find(k => k.id === id);
|
|
21
|
+
if (!kshetra)
|
|
22
|
+
return { status: 'not_found', id };
|
|
23
|
+
// A reason:'stuck' pause means a live worker's watchdog tripped on a hung
|
|
24
|
+
// agent. Clearing the pause is now MEANINGFUL: the running worker watches for
|
|
25
|
+
// this transition and self-heals in-process — aborts the hung agent, RECOVERs,
|
|
26
|
+
// and re-arms. We still clear the pause the same way; the only branch is the
|
|
27
|
+
// message we hand back, keyed on whether a worker is actually alive to do the heal.
|
|
28
|
+
const wasStuck = (0, state_1.loadState)().kshetras[id]?.reason === 'stuck';
|
|
29
|
+
(0, state_1.resumeKshetra)(kshetra);
|
|
30
|
+
if (wasStuck) {
|
|
31
|
+
const pid = (0, pid_1.readPid)(id);
|
|
32
|
+
const workerAlive = pid !== null && (0, pid_1.isAlive)(pid);
|
|
33
|
+
if (workerAlive)
|
|
34
|
+
return { status: 'resumed_self_heal', id };
|
|
35
|
+
// No worker to observe the resume — the pause is cleared, but the bead only
|
|
36
|
+
// gets reconciled when a worker next starts.
|
|
37
|
+
return { status: 'resumed_needs_start', id, hint: `shreni start --kshetra ${id}` };
|
|
38
|
+
}
|
|
39
|
+
return { status: 'resumed', id };
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=pause.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pause.js","sourceRoot":"","sources":["../../src/cli/pause.ts"],"names":[],"mappings":";;AAoBA,4CAUC;AAED,8CAsBC;AAtDD,kDAAmD;AACnD,4CAA0E;AAC1E,+BAAyC;AAkBzC,SAAgB,gBAAgB,CAAC,EAAU;IACzC,MAAM,OAAO,GAAG,IAAA,uBAAY,GAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACtD,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAEjD,IAAA,oBAAY,EAAC,OAAO,EAAE;QACpB,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,gBAAgB;KAC1B,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AAClC,CAAC;AAED,SAAgB,iBAAiB,CAAC,EAAU;IAC1C,MAAM,OAAO,GAAG,IAAA,uBAAY,GAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACtD,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAEjD,0EAA0E;IAC1E,8EAA8E;IAC9E,+EAA+E;IAC/E,6EAA6E;IAC7E,oFAAoF;IACpF,MAAM,QAAQ,GAAG,IAAA,iBAAS,GAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9D,IAAA,qBAAa,EAAC,OAAO,CAAC,CAAC;IAEvB,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,IAAA,aAAO,EAAC,EAAE,CAAC,CAAC;QACxB,MAAM,WAAW,GAAG,GAAG,KAAK,IAAI,IAAI,IAAA,aAAO,EAAC,GAAG,CAAC,CAAC;QACjD,IAAI,WAAW;YAAE,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,EAAE,EAAE,CAAC;QAC5D,4EAA4E;QAC5E,6CAA6C;QAC7C,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE,EAAE,EAAE,CAAC;IACrF,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type PhalakaStartResult, type PhalakaStopResult } from './phalaka';
|
|
2
|
+
export declare function isDashboardDisabled(argv: string[], env?: NodeJS.ProcessEnv): boolean;
|
|
3
|
+
export type AutoStartResult = PhalakaStartResult | {
|
|
4
|
+
status: 'disabled';
|
|
5
|
+
};
|
|
6
|
+
export declare function autoStartPhalaka(argv: string[], env?: NodeJS.ProcessEnv): AutoStartResult;
|
|
7
|
+
export type AutoStopResult = PhalakaStopResult | {
|
|
8
|
+
status: 'skipped';
|
|
9
|
+
};
|
|
10
|
+
export declare function autoStopPhalaka(argv: string[]): AutoStopResult;
|
|
11
|
+
//# sourceMappingURL=phalaka-autostart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phalaka-autostart.d.ts","sourceRoot":"","sources":["../../src/cli/phalaka-autostart.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,WAAW,CAAC;AAOnB,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAEjG;AAED,MAAM,MAAM,eAAe,GAAG,kBAAkB,GAAG;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,CAAC;AAI1E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,eAAe,CAGtG;AAED,MAAM,MAAM,cAAc,GAAG,iBAAiB,GAAG;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CAAC;AAIvE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,cAAc,CAG9D"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isDashboardDisabled = isDashboardDisabled;
|
|
4
|
+
exports.autoStartPhalaka = autoStartPhalaka;
|
|
5
|
+
exports.autoStopPhalaka = autoStopPhalaka;
|
|
6
|
+
const phalaka_1 = require("./phalaka");
|
|
7
|
+
// Auto-start/stop wiring for the Phalaka dashboard, factored out of cli/index.ts
|
|
8
|
+
// so the opt-out logic is unit-testable with a mocked spawn.
|
|
9
|
+
// The dashboard is on by default; opt out per-invocation with --no-dashboard or
|
|
10
|
+
// globally (headless/CI) with PHALAKA_DISABLE=1.
|
|
11
|
+
function isDashboardDisabled(argv, env = process.env) {
|
|
12
|
+
return argv.includes('--no-dashboard') || env['PHALAKA_DISABLE'] === '1';
|
|
13
|
+
}
|
|
14
|
+
// Called after `shreni start` launches Kshetra workers. Idempotent: startPhalaka
|
|
15
|
+
// returns already_running if a live PID exists.
|
|
16
|
+
function autoStartPhalaka(argv, env = process.env) {
|
|
17
|
+
if (isDashboardDisabled(argv, env))
|
|
18
|
+
return { status: 'disabled' };
|
|
19
|
+
return (0, phalaka_1.startPhalaka)();
|
|
20
|
+
}
|
|
21
|
+
// Only a full `shreni stop` (no --kshetra) tears down the global dashboard;
|
|
22
|
+
// stopping a single Kshetra leaves the board running.
|
|
23
|
+
function autoStopPhalaka(argv) {
|
|
24
|
+
if (argv.includes('--kshetra'))
|
|
25
|
+
return { status: 'skipped' };
|
|
26
|
+
return (0, phalaka_1.stopPhalaka)();
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=phalaka-autostart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phalaka-autostart.js","sourceRoot":"","sources":["../../src/cli/phalaka-autostart.ts"],"names":[],"mappings":";;AAYA,kDAEC;AAMD,4CAGC;AAMD,0CAGC;AAhCD,uCAKmB;AAEnB,iFAAiF;AACjF,6DAA6D;AAE7D,gFAAgF;AAChF,iDAAiD;AACjD,SAAgB,mBAAmB,CAAC,IAAc,EAAE,MAAyB,OAAO,CAAC,GAAG;IACtF,OAAO,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,iBAAiB,CAAC,KAAK,GAAG,CAAC;AAC3E,CAAC;AAID,iFAAiF;AACjF,gDAAgD;AAChD,SAAgB,gBAAgB,CAAC,IAAc,EAAE,MAAyB,OAAO,CAAC,GAAG;IACnF,IAAI,mBAAmB,CAAC,IAAI,EAAE,GAAG,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAClE,OAAO,IAAA,sBAAY,GAAE,CAAC;AACxB,CAAC;AAID,4EAA4E;AAC5E,sDAAsD;AACtD,SAAgB,eAAe,CAAC,IAAc;IAC5C,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC7D,OAAO,IAAA,qBAAW,GAAE,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phalaka-server.d.ts","sourceRoot":"","sources":["../../src/cli/phalaka-server.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const server_1 = require("../phalaka/server");
|
|
4
|
+
const pid_1 = require("../phalaka/pid");
|
|
5
|
+
const token_1 = require("../phalaka/token");
|
|
6
|
+
const port = process.env['PHALAKA_PORT'] ? parseInt(process.env['PHALAKA_PORT'], 10) : server_1.DEFAULT_PORT;
|
|
7
|
+
(0, pid_1.writePhalakaPid)(process.pid);
|
|
8
|
+
// Ensures the local dashboard token (~/.shreni/shreni.token) exists — shared secret.
|
|
9
|
+
(0, token_1.ensureToken)();
|
|
10
|
+
(0, server_1.startPhalakaServer)(port)
|
|
11
|
+
.then(() => {
|
|
12
|
+
console.log(`[phalaka] listening on http://127.0.0.1:${port}`);
|
|
13
|
+
})
|
|
14
|
+
.catch((err) => {
|
|
15
|
+
console.error('[phalaka] failed to start:', err.message);
|
|
16
|
+
process.exit(1);
|
|
17
|
+
});
|
|
18
|
+
process.on('SIGTERM', () => process.exit(0));
|
|
19
|
+
process.on('SIGINT', () => process.exit(0));
|
|
20
|
+
//# sourceMappingURL=phalaka-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phalaka-server.js","sourceRoot":"","sources":["../../src/cli/phalaka-server.ts"],"names":[],"mappings":";;AAAA,8CAAqE;AACrE,wCAAiD;AACjD,4CAA+C;AAE/C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,qBAAY,CAAC;AAEpG,IAAA,qBAAe,EAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC7B,qFAAqF;AACrF,IAAA,mBAAW,GAAE,CAAC;AAEd,IAAA,2BAAkB,EAAC,IAAI,CAAC;KACrB,IAAI,CAAC,GAAG,EAAE;IACT,OAAO,CAAC,GAAG,CAAC,2CAA2C,IAAI,EAAE,CAAC,CAAC;AACjE,CAAC,CAAC;KACD,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;IACpB,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export declare const PHALAKA_LOG_PATH: string;
|
|
2
|
+
export type PhalakaStartResult = {
|
|
3
|
+
status: 'started';
|
|
4
|
+
pid: number;
|
|
5
|
+
port: number;
|
|
6
|
+
url: string;
|
|
7
|
+
} | {
|
|
8
|
+
status: 'already_running';
|
|
9
|
+
pid: number;
|
|
10
|
+
port: number;
|
|
11
|
+
url: string;
|
|
12
|
+
};
|
|
13
|
+
export type PhalakaStopResult = {
|
|
14
|
+
status: 'stopped';
|
|
15
|
+
pid: number;
|
|
16
|
+
} | {
|
|
17
|
+
status: 'not_running';
|
|
18
|
+
} | {
|
|
19
|
+
status: 'stale_pid_cleared';
|
|
20
|
+
};
|
|
21
|
+
export interface PhalakaStatusResult {
|
|
22
|
+
running: boolean;
|
|
23
|
+
pid: number | null;
|
|
24
|
+
url: string | null;
|
|
25
|
+
token: string | null;
|
|
26
|
+
}
|
|
27
|
+
export declare function startPhalaka(port?: number, script?: string): PhalakaStartResult;
|
|
28
|
+
export declare function stopPhalaka(): PhalakaStopResult;
|
|
29
|
+
export declare function statusPhalaka(port?: number): PhalakaStatusResult;
|
|
30
|
+
//# sourceMappingURL=phalaka.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phalaka.d.ts","sourceRoot":"","sources":["../../src/cli/phalaka.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,gBAAgB,QAA+C,CAAC;AAE7E,MAAM,MAAM,kBAAkB,GAC1B;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1E,MAAM,MAAM,iBAAiB,GACzB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,MAAM,EAAE,aAAa,CAAA;CAAE,GACzB;IAAE,MAAM,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAEpC,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAUD,wBAAgB,YAAY,CAAC,IAAI,SAAe,EAAE,MAAM,SAAiB,GAAG,kBAAkB,CAwB7F;AAED,wBAAgB,WAAW,IAAI,iBAAiB,CAa/C;AAED,wBAAgB,aAAa,CAAC,IAAI,SAAe,GAAG,mBAAmB,CAMtE"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PHALAKA_LOG_PATH = void 0;
|
|
4
|
+
exports.startPhalaka = startPhalaka;
|
|
5
|
+
exports.stopPhalaka = stopPhalaka;
|
|
6
|
+
exports.statusPhalaka = statusPhalaka;
|
|
7
|
+
const child_process_1 = require("child_process");
|
|
8
|
+
const path_1 = require("path");
|
|
9
|
+
const fs_1 = require("fs");
|
|
10
|
+
const os_1 = require("os");
|
|
11
|
+
const pid_1 = require("../phalaka/pid");
|
|
12
|
+
const token_1 = require("../phalaka/token");
|
|
13
|
+
const server_1 = require("../phalaka/server");
|
|
14
|
+
exports.PHALAKA_LOG_PATH = (0, path_1.resolve)((0, os_1.homedir)(), '.shreni', 'phalaka.log');
|
|
15
|
+
function serverScript() {
|
|
16
|
+
return (0, path_1.resolve)(__dirname, 'phalaka-server.js');
|
|
17
|
+
}
|
|
18
|
+
function dashboardUrl(port, token) {
|
|
19
|
+
return `http://127.0.0.1:${port}/?token=${token}`;
|
|
20
|
+
}
|
|
21
|
+
function startPhalaka(port = server_1.DEFAULT_PORT, script = serverScript()) {
|
|
22
|
+
const existing = (0, pid_1.readPhalakaPid)();
|
|
23
|
+
if (existing !== null && (0, pid_1.isAlive)(existing)) {
|
|
24
|
+
const token = (0, token_1.ensureToken)();
|
|
25
|
+
return { status: 'already_running', pid: existing, port, url: dashboardUrl(port, token) };
|
|
26
|
+
}
|
|
27
|
+
(0, fs_1.mkdirSync)((0, path_1.resolve)((0, os_1.homedir)(), '.shreni'), { recursive: true });
|
|
28
|
+
const logFd = (0, fs_1.openSync)(exports.PHALAKA_LOG_PATH, 'a');
|
|
29
|
+
const child = (0, child_process_1.spawn)(process.execPath, [script], {
|
|
30
|
+
detached: true,
|
|
31
|
+
stdio: ['ignore', logFd, logFd],
|
|
32
|
+
env: { ...process.env, PHALAKA_PORT: String(port) },
|
|
33
|
+
});
|
|
34
|
+
if (child.pid === undefined) {
|
|
35
|
+
throw new Error('Failed to spawn phalaka-server process');
|
|
36
|
+
}
|
|
37
|
+
child.unref();
|
|
38
|
+
const token = (0, token_1.ensureToken)();
|
|
39
|
+
return { status: 'started', pid: child.pid, port, url: dashboardUrl(port, token) };
|
|
40
|
+
}
|
|
41
|
+
function stopPhalaka() {
|
|
42
|
+
const pid = (0, pid_1.readPhalakaPid)();
|
|
43
|
+
if (pid === null)
|
|
44
|
+
return { status: 'not_running' };
|
|
45
|
+
if (!(0, pid_1.isAlive)(pid)) {
|
|
46
|
+
(0, pid_1.clearPhalakaPid)();
|
|
47
|
+
return { status: 'stale_pid_cleared' };
|
|
48
|
+
}
|
|
49
|
+
process.kill(pid, 'SIGTERM');
|
|
50
|
+
(0, pid_1.clearPhalakaPid)();
|
|
51
|
+
return { status: 'stopped', pid };
|
|
52
|
+
}
|
|
53
|
+
function statusPhalaka(port = server_1.DEFAULT_PORT) {
|
|
54
|
+
const pid = (0, pid_1.readPhalakaPid)();
|
|
55
|
+
const running = pid !== null && (0, pid_1.isAlive)(pid);
|
|
56
|
+
const token = (0, token_1.readToken)();
|
|
57
|
+
const url = running && token ? dashboardUrl(port, token) : null;
|
|
58
|
+
return { running, pid: running ? pid : null, url, token };
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=phalaka.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phalaka.js","sourceRoot":"","sources":["../../src/cli/phalaka.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function shreniDir(): string;
|
|
2
|
+
export declare function kshetraDir(kshetraId: string): string;
|
|
3
|
+
export declare function workerPidPath(kshetraId: string): string;
|
|
4
|
+
export declare function workerLogPath(kshetraId: string): string;
|
|
5
|
+
export declare function writePid(kshetraId: string, pid: number): void;
|
|
6
|
+
export declare function readPid(kshetraId: string): number | null;
|
|
7
|
+
export declare function clearPid(kshetraId: string): void;
|
|
8
|
+
export declare function isAlive(pid: number): boolean;
|
|
9
|
+
//# sourceMappingURL=pid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pid.d.ts","sourceRoot":"","sources":["../../src/cli/pid.ts"],"names":[],"mappings":"AASA,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAG7D;AAED,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUxD;AAED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAOhD;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAO5C"}
|
package/dist/cli/pid.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.shreniDir = shreniDir;
|
|
4
|
+
exports.kshetraDir = kshetraDir;
|
|
5
|
+
exports.workerPidPath = workerPidPath;
|
|
6
|
+
exports.workerLogPath = workerLogPath;
|
|
7
|
+
exports.writePid = writePid;
|
|
8
|
+
exports.readPid = readPid;
|
|
9
|
+
exports.clearPid = clearPid;
|
|
10
|
+
exports.isAlive = isAlive;
|
|
11
|
+
const fs_1 = require("fs");
|
|
12
|
+
const path_1 = require("path");
|
|
13
|
+
const os_1 = require("os");
|
|
14
|
+
// Per-kshetra layout under ~/.shreni/kshetra/<id>/:
|
|
15
|
+
// worker.pid — detached worker process id
|
|
16
|
+
// activity.jsonl — structured event log (see activity-log.ts)
|
|
17
|
+
// worker.log — worker stdout/stderr
|
|
18
|
+
function shreniDir() {
|
|
19
|
+
return (0, path_1.join)((0, os_1.homedir)(), '.shreni');
|
|
20
|
+
}
|
|
21
|
+
function kshetraDir(kshetraId) {
|
|
22
|
+
return (0, path_1.join)(shreniDir(), 'kshetra', kshetraId);
|
|
23
|
+
}
|
|
24
|
+
function workerPidPath(kshetraId) {
|
|
25
|
+
return (0, path_1.join)(kshetraDir(kshetraId), 'worker.pid');
|
|
26
|
+
}
|
|
27
|
+
function workerLogPath(kshetraId) {
|
|
28
|
+
return (0, path_1.join)(kshetraDir(kshetraId), 'worker.log');
|
|
29
|
+
}
|
|
30
|
+
function writePid(kshetraId, pid) {
|
|
31
|
+
(0, fs_1.mkdirSync)(kshetraDir(kshetraId), { recursive: true });
|
|
32
|
+
(0, fs_1.writeFileSync)(workerPidPath(kshetraId), String(pid), 'utf8');
|
|
33
|
+
}
|
|
34
|
+
function readPid(kshetraId) {
|
|
35
|
+
try {
|
|
36
|
+
const raw = (0, fs_1.readFileSync)(workerPidPath(kshetraId), 'utf8').trim();
|
|
37
|
+
const pid = parseInt(raw, 10);
|
|
38
|
+
return isNaN(pid) ? null : pid;
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
const e = err;
|
|
42
|
+
if (e.code === 'ENOENT')
|
|
43
|
+
return null;
|
|
44
|
+
throw err;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function clearPid(kshetraId) {
|
|
48
|
+
try {
|
|
49
|
+
(0, fs_1.unlinkSync)(workerPidPath(kshetraId));
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
const e = err;
|
|
53
|
+
if (e.code !== 'ENOENT')
|
|
54
|
+
throw err;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function isAlive(pid) {
|
|
58
|
+
try {
|
|
59
|
+
process.kill(pid, 0);
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=pid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pid.js","sourceRoot":"","sources":["../../src/cli/pid.ts"],"names":[],"mappings":";;AASA,8BAEC;AAED,gCAEC;AAED,sCAEC;AAED,sCAEC;AAED,4BAGC;AAED,0BAUC;AAED,4BAOC;AAED,0BAOC;AA1DD,2BAAwE;AACxE,+BAA4B;AAC5B,2BAA6B;AAE7B,oDAAoD;AACpD,kDAAkD;AAClD,kEAAkE;AAClE,4CAA4C;AAE5C,SAAgB,SAAS;IACvB,OAAO,IAAA,WAAI,EAAC,IAAA,YAAO,GAAE,EAAE,SAAS,CAAC,CAAC;AACpC,CAAC;AAED,SAAgB,UAAU,CAAC,SAAiB;IAC1C,OAAO,IAAA,WAAI,EAAC,SAAS,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AACjD,CAAC;AAED,SAAgB,aAAa,CAAC,SAAiB;IAC7C,OAAO,IAAA,WAAI,EAAC,UAAU,CAAC,SAAS,CAAC,EAAE,YAAY,CAAC,CAAC;AACnD,CAAC;AAED,SAAgB,aAAa,CAAC,SAAiB;IAC7C,OAAO,IAAA,WAAI,EAAC,UAAU,CAAC,SAAS,CAAC,EAAE,YAAY,CAAC,CAAC;AACnD,CAAC;AAED,SAAgB,QAAQ,CAAC,SAAiB,EAAE,GAAW;IACrD,IAAA,cAAS,EAAC,UAAU,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,IAAA,kBAAa,EAAC,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;AAC/D,CAAC;AAED,SAAgB,OAAO,CAAC,SAAiB;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAA,iBAAY,EAAC,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAClE,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC9B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAA4B,CAAC;QACvC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACrC,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAgB,QAAQ,CAAC,SAAiB;IACxC,IAAI,CAAC;QACH,IAAA,eAAU,EAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAA4B,CAAC;QACvC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,GAAG,CAAC;IACrC,CAAC;AACH,CAAC;AAED,SAAgB,OAAO,CAAC,GAAW;IACjC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|