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,174 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BeadsReadError = exports.LIST_CACHE_TTL_MS = void 0;
4
+ exports.isValidBeadId = isValidBeadId;
5
+ exports.clearBeadsReadCache = clearBeadsReadCache;
6
+ exports.beadsRead = beadsRead;
7
+ exports.readKshetraTasks = readKshetraTasks;
8
+ exports.readAllKshetraTasks = readAllKshetraTasks;
9
+ const child_process_1 = require("child_process");
10
+ const util_1 = require("util");
11
+ const zod_1 = require("zod");
12
+ const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
13
+ // Read-only `bd` accessor for Phalaka.
14
+ //
15
+ // Deliberately exposes ONLY non-mutating commands (`list --json`, `show --json`).
16
+ // The internal write wrapper lives in src/sthapathi/beads.ts and is the sole
17
+ // owner of the `bd` write lifecycle (claim/close/create/...). Keeping a separate
18
+ // reader makes the "Sthapathi owns writes" invariant enforceable by construction:
19
+ // there is simply no mutation method on this surface.
20
+ exports.LIST_CACHE_TTL_MS = 5_000;
21
+ class BeadsReadError extends Error {
22
+ cause;
23
+ constructor(message, cause) {
24
+ super(message);
25
+ this.cause = cause;
26
+ this.name = 'BeadsReadError';
27
+ }
28
+ }
29
+ exports.BeadsReadError = BeadsReadError;
30
+ // Bead ids are like `myapp-beads-9g3` or `myapp-beads-9sk.6`. Validate before
31
+ // passing to `bd show` so a path/arg-injection attempt can't reach the subprocess.
32
+ const BEAD_ID_RE = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
33
+ function isValidBeadId(id) {
34
+ return BEAD_ID_RE.test(id) && id.length <= 128;
35
+ }
36
+ // ── Raw `bd --json` parsing (snake_case, lenient) ───────────────────────────
37
+ const RawDependencySchema = zod_1.z
38
+ .object({
39
+ // `bd list --json` dependency rows use issue_id/depends_on_id; `bd show`
40
+ // nests full bead objects with id/title. Accept either.
41
+ id: zod_1.z.string().optional(),
42
+ issue_id: zod_1.z.string().optional(),
43
+ depends_on_id: zod_1.z.string().optional(),
44
+ title: zod_1.z.string().optional(),
45
+ type: zod_1.z.string().optional(),
46
+ })
47
+ .passthrough();
48
+ const RawBeadSchema = zod_1.z
49
+ .object({
50
+ id: zod_1.z.string(),
51
+ title: zod_1.z.string().optional(),
52
+ status: zod_1.z.string().optional(),
53
+ priority: zod_1.z.number().optional(),
54
+ issue_type: zod_1.z.string().optional(),
55
+ owner: zod_1.z.string().optional(),
56
+ assignee: zod_1.z.string().optional(),
57
+ description: zod_1.z.string().optional(),
58
+ notes: zod_1.z.string().optional(),
59
+ design: zod_1.z.string().optional(),
60
+ acceptance_criteria: zod_1.z.string().optional(),
61
+ created_at: zod_1.z.string().optional(),
62
+ updated_at: zod_1.z.string().optional(),
63
+ dependencies: zod_1.z.array(RawDependencySchema).optional(),
64
+ parent: zod_1.z.string().optional(),
65
+ })
66
+ .passthrough();
67
+ function toSummary(raw) {
68
+ return {
69
+ id: raw.id,
70
+ title: raw.title ?? '',
71
+ status: raw.status ?? 'unknown',
72
+ priority: raw.priority ?? 4,
73
+ type: raw.issue_type ?? 'task',
74
+ assignee: raw.assignee ?? raw.owner,
75
+ updatedAt: raw.updated_at ?? raw.created_at ?? '',
76
+ };
77
+ }
78
+ function toDetail(raw) {
79
+ // In `bd show`, the bead's own row carries `depends_on_id` links; the nested
80
+ // dependency objects describe the parent/blockers. Surface both shapes.
81
+ const deps = (raw.dependencies ?? [])
82
+ .map(d => ({ id: d.id ?? d.depends_on_id ?? d.issue_id ?? '', title: d.title, type: d.type }))
83
+ .filter(d => d.id !== '');
84
+ const blockedBy = deps.filter(d => d.type !== 'parent-child').map(d => d.id);
85
+ return {
86
+ ...toSummary(raw),
87
+ description: raw.description,
88
+ notes: raw.notes,
89
+ design: raw.design,
90
+ acceptance: raw.acceptance_criteria,
91
+ createdAt: raw.created_at ?? '',
92
+ dependencies: deps,
93
+ blockedBy,
94
+ parent: raw.parent,
95
+ };
96
+ }
97
+ function parseRawArray(stdout) {
98
+ let parsed;
99
+ try {
100
+ parsed = JSON.parse(stdout || '[]');
101
+ }
102
+ catch (err) {
103
+ throw new BeadsReadError(`bd returned non-JSON output: ${err.message}`, err);
104
+ }
105
+ const arr = Array.isArray(parsed) ? parsed : [parsed];
106
+ const out = [];
107
+ for (const item of arr) {
108
+ const result = RawBeadSchema.safeParse(item);
109
+ if (result.success)
110
+ out.push(result.data);
111
+ }
112
+ return out;
113
+ }
114
+ const cache = new Map();
115
+ // Exposed for test isolation; not used in production paths.
116
+ function clearBeadsReadCache() {
117
+ cache.clear();
118
+ }
119
+ async function cached(key, ttl, produce) {
120
+ const hit = cache.get(key);
121
+ if (hit && hit.expires > Date.now()) {
122
+ return hit.value;
123
+ }
124
+ const value = await produce();
125
+ cache.set(key, { expires: Date.now() + ttl, value });
126
+ return value;
127
+ }
128
+ async function exec(args, env) {
129
+ try {
130
+ const { stdout } = await execFileAsync('bd', args, { env, maxBuffer: 8 * 1024 * 1024 });
131
+ return stdout.trim();
132
+ }
133
+ catch (err) {
134
+ const e = err;
135
+ throw new BeadsReadError(`bd ${args[0]} failed: ${e.stderr ?? e.message ?? String(err)}`, err);
136
+ }
137
+ }
138
+ function beadsRead(kshetra) {
139
+ const beadsPath = kshetra.beads.path;
140
+ const env = { ...process.env, BEADS_DIR: beadsPath };
141
+ return {
142
+ async list(filters = {}) {
143
+ const args = ['list', '--json'];
144
+ if (filters.status)
145
+ args.push('--status', filters.status);
146
+ const key = `${beadsPath}::list::${filters.status ?? 'default'}`;
147
+ return cached(key, exports.LIST_CACHE_TTL_MS, async () => parseRawArray(await exec(args, env)).map(toSummary));
148
+ },
149
+ async show(id) {
150
+ if (!isValidBeadId(id)) {
151
+ throw new BeadsReadError(`invalid bead id: ${JSON.stringify(id)}`);
152
+ }
153
+ const key = `${beadsPath}::show::${id}`;
154
+ return cached(key, exports.LIST_CACHE_TTL_MS, async () => {
155
+ const rows = parseRawArray(await exec(['show', id, '--json'], env));
156
+ const match = rows.find(r => r.id === id) ?? rows[0];
157
+ return match ? toDetail(match) : null;
158
+ });
159
+ },
160
+ };
161
+ }
162
+ async function readKshetraTasks(kshetra, filters = {}) {
163
+ try {
164
+ const tasks = await beadsRead(kshetra).list(filters);
165
+ return { kshetra, tasks };
166
+ }
167
+ catch (err) {
168
+ return { kshetra, error: err instanceof Error ? err.message : String(err) };
169
+ }
170
+ }
171
+ async function readAllKshetraTasks(kshetras, filters = {}) {
172
+ return Promise.all(kshetras.map(k => readKshetraTasks(k, filters)));
173
+ }
174
+ //# sourceMappingURL=beads-read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"beads-read.js","sourceRoot":"","sources":["../../src/phalaka/beads-read.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare const PHALAKA_PID_PATH: string;
2
+ export declare function writePhalakaPid(pid: number): void;
3
+ export declare function readPhalakaPid(): number | null;
4
+ export declare function clearPhalakaPid(): void;
5
+ export declare function isAlive(pid: number): boolean;
6
+ //# sourceMappingURL=pid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pid.d.ts","sourceRoot":"","sources":["../../src/phalaka/pid.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,gBAAgB,QAA+C,CAAC;AAE7E,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAGjD;AAED,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CAU9C;AAED,wBAAgB,eAAe,IAAI,IAAI,CAOtC;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAO5C"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PHALAKA_PID_PATH = void 0;
4
+ exports.writePhalakaPid = writePhalakaPid;
5
+ exports.readPhalakaPid = readPhalakaPid;
6
+ exports.clearPhalakaPid = clearPhalakaPid;
7
+ exports.isAlive = isAlive;
8
+ const fs_1 = require("fs");
9
+ const path_1 = require("path");
10
+ const os_1 = require("os");
11
+ exports.PHALAKA_PID_PATH = (0, path_1.resolve)((0, os_1.homedir)(), '.shreni', 'phalaka.pid');
12
+ function writePhalakaPid(pid) {
13
+ (0, fs_1.mkdirSync)((0, path_1.dirname)(exports.PHALAKA_PID_PATH), { recursive: true });
14
+ (0, fs_1.writeFileSync)(exports.PHALAKA_PID_PATH, String(pid), 'utf8');
15
+ }
16
+ function readPhalakaPid() {
17
+ try {
18
+ const raw = (0, fs_1.readFileSync)(exports.PHALAKA_PID_PATH, 'utf8').trim();
19
+ const pid = parseInt(raw, 10);
20
+ return isNaN(pid) ? null : pid;
21
+ }
22
+ catch (err) {
23
+ const e = err;
24
+ if (e.code === 'ENOENT')
25
+ return null;
26
+ throw err;
27
+ }
28
+ }
29
+ function clearPhalakaPid() {
30
+ try {
31
+ (0, fs_1.unlinkSync)(exports.PHALAKA_PID_PATH);
32
+ }
33
+ catch (err) {
34
+ const e = err;
35
+ if (e.code !== 'ENOENT')
36
+ throw err;
37
+ }
38
+ }
39
+ function isAlive(pid) {
40
+ try {
41
+ process.kill(pid, 0);
42
+ return true;
43
+ }
44
+ catch {
45
+ return false;
46
+ }
47
+ }
48
+ //# sourceMappingURL=pid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pid.js","sourceRoot":"","sources":["../../src/phalaka/pid.ts"],"names":[],"mappings":";;;AAMA,0CAGC;AAED,wCAUC;AAED,0CAOC;AAED,0BAOC;AAvCD,2BAAwE;AACxE,+BAAwC;AACxC,2BAA6B;AAEhB,QAAA,gBAAgB,GAAG,IAAA,cAAO,EAAC,IAAA,YAAO,GAAE,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;AAE7E,SAAgB,eAAe,CAAC,GAAW;IACzC,IAAA,cAAS,EAAC,IAAA,cAAO,EAAC,wBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,IAAA,kBAAa,EAAC,wBAAgB,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;AACvD,CAAC;AAED,SAAgB,cAAc;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAA,iBAAY,EAAC,wBAAgB,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1D,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,eAAe;IAC7B,IAAI,CAAC;QACH,IAAA,eAAU,EAAC,wBAAgB,CAAC,CAAC;IAC/B,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"}
@@ -0,0 +1,10 @@
1
+ export declare const DEFAULT_PORT = 7348;
2
+ export declare const HOST = "127.0.0.1";
3
+ export declare function createPhalakaServer(port?: number): Promise<{
4
+ fastify: import("fastify").FastifyInstance<import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>, import("node:http").IncomingMessage, import("node:http").ServerResponse<import("node:http").IncomingMessage>, import("fastify").FastifyBaseLogger, import("fastify").FastifyTypeProviderDefault> & PromiseLike<import("fastify").FastifyInstance<import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>, import("node:http").IncomingMessage, import("node:http").ServerResponse<import("node:http").IncomingMessage>, import("fastify").FastifyBaseLogger, import("fastify").FastifyTypeProviderDefault>> & {
5
+ __linterBrands: "SafePromiseLike";
6
+ };
7
+ port: number;
8
+ }>;
9
+ export declare function startPhalakaServer(port?: number): Promise<void>;
10
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/phalaka/server.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,YAAY,OAAO,CAAC;AAGjC,eAAO,MAAM,IAAI,cAAc,CAAC;AAEhC,wBAAsB,mBAAmB,CAAC,IAAI,SAAe;;;;;GAY5D;AAED,wBAAsB,kBAAkB,CAAC,IAAI,SAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3E"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.HOST = exports.DEFAULT_PORT = void 0;
7
+ exports.createPhalakaServer = createPhalakaServer;
8
+ exports.startPhalakaServer = startPhalakaServer;
9
+ const fastify_1 = __importDefault(require("fastify"));
10
+ const api_js_1 = require("./api.js");
11
+ const ui_js_1 = require("./ui.js");
12
+ exports.DEFAULT_PORT = 7348;
13
+ // Loopback only: the dashboard exposes task content across all Kshetras and has
14
+ // no per-request need for LAN access.
15
+ exports.HOST = '127.0.0.1';
16
+ async function createPhalakaServer(port = exports.DEFAULT_PORT) {
17
+ const fastify = (0, fastify_1.default)({ logger: false });
18
+ // The HTML shell carries no data; the page reads the token from its URL and
19
+ // attaches it to API calls. Served unauthenticated.
20
+ fastify.get('/', (_req, reply) => {
21
+ return reply.type('text/html').send(ui_js_1.INDEX_HTML);
22
+ });
23
+ (0, api_js_1.registerPhalakaApi)(fastify);
24
+ return { fastify, port };
25
+ }
26
+ async function startPhalakaServer(port = exports.DEFAULT_PORT) {
27
+ const { fastify } = await createPhalakaServer(port);
28
+ await fastify.listen({ port, host: exports.HOST });
29
+ }
30
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/phalaka/server.ts"],"names":[],"mappings":";;;;;;AASA,kDAYC;AAED,gDAGC;AA1BD,sDAA8B;AAC9B,qCAA8C;AAC9C,mCAAqC;AAExB,QAAA,YAAY,GAAG,IAAI,CAAC;AACjC,gFAAgF;AAChF,sCAAsC;AACzB,QAAA,IAAI,GAAG,WAAW,CAAC;AAEzB,KAAK,UAAU,mBAAmB,CAAC,IAAI,GAAG,oBAAY;IAC3D,MAAM,OAAO,GAAG,IAAA,iBAAO,EAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAE3C,4EAA4E;IAC5E,oDAAoD;IACpD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC/B,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,kBAAU,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,IAAA,2BAAkB,EAAC,OAAO,CAAC,CAAC;IAE5B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAEM,KAAK,UAAU,kBAAkB,CAAC,IAAI,GAAG,oBAAY;IAC1D,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,YAAI,EAAE,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const TOKEN_PATH: string;
2
+ export declare function generateToken(): string;
3
+ export declare function ensureToken(): string;
4
+ export declare function readToken(): string | null;
5
+ //# sourceMappingURL=token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/phalaka/token.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,UAAU,QAAgD,CAAC;AAExE,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAWpC;AAED,wBAAgB,SAAS,IAAI,MAAM,GAAG,IAAI,CAQzC"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TOKEN_PATH = void 0;
4
+ exports.generateToken = generateToken;
5
+ exports.ensureToken = ensureToken;
6
+ exports.readToken = readToken;
7
+ const fs_1 = require("fs");
8
+ const path_1 = require("path");
9
+ const os_1 = require("os");
10
+ const crypto_1 = require("crypto");
11
+ exports.TOKEN_PATH = (0, path_1.resolve)((0, os_1.homedir)(), '.shreni', 'shreni.token');
12
+ function generateToken() {
13
+ return (0, crypto_1.randomBytes)(32).toString('hex');
14
+ }
15
+ function ensureToken() {
16
+ try {
17
+ return (0, fs_1.readFileSync)(exports.TOKEN_PATH, 'utf8').trim();
18
+ }
19
+ catch (err) {
20
+ const e = err;
21
+ if (e.code !== 'ENOENT')
22
+ throw err;
23
+ }
24
+ const token = generateToken();
25
+ (0, fs_1.mkdirSync)((0, path_1.dirname)(exports.TOKEN_PATH), { recursive: true });
26
+ (0, fs_1.writeFileSync)(exports.TOKEN_PATH, token, 'utf8');
27
+ return token;
28
+ }
29
+ function readToken() {
30
+ try {
31
+ return (0, fs_1.readFileSync)(exports.TOKEN_PATH, 'utf8').trim();
32
+ }
33
+ catch (err) {
34
+ const e = err;
35
+ if (e.code === 'ENOENT')
36
+ return null;
37
+ throw err;
38
+ }
39
+ }
40
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/phalaka/token.ts"],"names":[],"mappings":";;;AAOA,sCAEC;AAED,kCAWC;AAED,8BAQC;AAhCD,2BAA4D;AAC5D,+BAAwC;AACxC,2BAA6B;AAC7B,mCAAqC;AAExB,QAAA,UAAU,GAAG,IAAA,cAAO,EAAC,IAAA,YAAO,GAAE,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;AAExE,SAAgB,aAAa;IAC3B,OAAO,IAAA,oBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC;AAED,SAAgB,WAAW;IACzB,IAAI,CAAC;QACH,OAAO,IAAA,iBAAY,EAAC,kBAAU,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,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;IACD,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;IAC9B,IAAA,cAAS,EAAC,IAAA,cAAO,EAAC,kBAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,IAAA,kBAAa,EAAC,kBAAU,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACzC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,SAAS;IACvB,IAAI,CAAC;QACH,OAAO,IAAA,iBAAY,EAAC,kBAAU,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,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"}
@@ -0,0 +1,15 @@
1
+ export declare function apiUrl(path: string, token: string): string;
2
+ export declare function isActiveStatus(status: string): boolean;
3
+ export declare function priorityLabel(priority: number): string;
4
+ export declare function statusBadgeClass(status: string): string;
5
+ export declare function escapeHtml(s: string): string;
6
+ export declare function renderTaskRow(task: {
7
+ id: string;
8
+ title: string;
9
+ status: string;
10
+ priority: number;
11
+ type: string;
12
+ assignee?: string;
13
+ }): string;
14
+ export declare const INDEX_HTML: string;
15
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/phalaka/ui.ts"],"names":[],"mappings":"AAQA,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG1D;AAGD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAevD;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAO5C;AAID,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,MAAM,CA2BT;AAkID,eAAO,MAAM,UAAU,QA2Bf,CAAC"}
@@ -0,0 +1,233 @@
1
+ "use strict";
2
+ // Single-file Phalaka dashboard frontend, inlined as a TS string (no bundler,
3
+ // no framework). Tailwind via CDN, vanilla JS.
4
+ //
5
+ // Pure helpers below are exported real functions so they can be unit-tested in
6
+ // node, then serialized into the page via `.toString()` (see HELPERS). The
7
+ // DOM/fetch bootstrap stays as a string at the bottom of the document.
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.INDEX_HTML = void 0;
10
+ exports.apiUrl = apiUrl;
11
+ exports.isActiveStatus = isActiveStatus;
12
+ exports.priorityLabel = priorityLabel;
13
+ exports.statusBadgeClass = statusBadgeClass;
14
+ exports.escapeHtml = escapeHtml;
15
+ exports.renderTaskRow = renderTaskRow;
16
+ // Attach the shared token to every API path (read from location.search by the page).
17
+ function apiUrl(path, token) {
18
+ const sep = path.includes('?') ? '&' : '?';
19
+ return path + sep + 'token=' + encodeURIComponent(token);
20
+ }
21
+ // Active states are shown by default; closed sits behind the filter toggle.
22
+ function isActiveStatus(status) {
23
+ return status === 'open' || status === 'in_progress' || status === 'blocked';
24
+ }
25
+ function priorityLabel(priority) {
26
+ return 'P' + String(priority);
27
+ }
28
+ function statusBadgeClass(status) {
29
+ switch (status) {
30
+ case 'open':
31
+ return 'bg-sky-700 text-sky-100';
32
+ case 'in_progress':
33
+ return 'bg-amber-700 text-amber-100';
34
+ case 'blocked':
35
+ return 'bg-red-800 text-red-100';
36
+ case 'closed':
37
+ return 'bg-slate-600 text-slate-200';
38
+ case 'deferred':
39
+ return 'bg-slate-700 text-slate-400';
40
+ default:
41
+ return 'bg-slate-700 text-slate-300';
42
+ }
43
+ }
44
+ function escapeHtml(s) {
45
+ return String(s)
46
+ .replace(/&/g, '&amp;')
47
+ .replace(/</g, '&lt;')
48
+ .replace(/>/g, '&gt;')
49
+ .replace(/"/g, '&quot;')
50
+ .replace(/'/g, '&#39;');
51
+ }
52
+ // Render one collapsed task row. Carries data-* hooks the bootstrap uses to
53
+ // lazy-load detail on click. Returns an HTML string.
54
+ function renderTaskRow(task) {
55
+ const badge = '<span class="px-2 py-0.5 rounded text-xs font-medium ' +
56
+ statusBadgeClass(task.status) +
57
+ '">' +
58
+ escapeHtml(task.status) +
59
+ '</span>';
60
+ const prio = '<span class="text-xs text-slate-400">' + escapeHtml(priorityLabel(task.priority)) + '</span>';
61
+ const who = task.assignee ? '<span class="text-xs text-slate-500">' + escapeHtml(task.assignee) + '</span>' : '';
62
+ return ('<div class="task-row border-b border-slate-800" data-bead-id="' +
63
+ escapeHtml(task.id) +
64
+ '">' +
65
+ '<div class="task-head flex items-center gap-3 px-3 py-2 cursor-pointer hover:bg-slate-800">' +
66
+ badge +
67
+ prio +
68
+ '<span class="flex-1 text-sm text-slate-200">' +
69
+ escapeHtml(task.title) +
70
+ '</span>' +
71
+ '<span class="text-xs text-slate-600 font-mono">' +
72
+ escapeHtml(task.id) +
73
+ '</span>' +
74
+ who +
75
+ '</div>' +
76
+ '<div class="task-detail hidden px-4 py-3 bg-slate-900 text-sm text-slate-300"></div>' +
77
+ '</div>');
78
+ }
79
+ const HELPERS = [apiUrl, isActiveStatus, priorityLabel, statusBadgeClass, escapeHtml, renderTaskRow]
80
+ .map(f => f.toString())
81
+ .join('\n\n');
82
+ // Bootstrap script — runs in the browser. Written with string concatenation
83
+ // (no template literals) so its source survives this outer template literal.
84
+ const BOOTSTRAP = `
85
+ var TOKEN = new URLSearchParams(location.search).get('token') || '';
86
+ var POLL_MS = 10000;
87
+ var showClosed = false;
88
+ var expanded = null; // currently expanded bead id
89
+
90
+ function api(path) {
91
+ return fetch(apiUrl(path, TOKEN)).then(function (r) {
92
+ if (!r.ok) throw new Error('HTTP ' + r.status);
93
+ return r.json();
94
+ });
95
+ }
96
+
97
+ function renderDetail(el, d) {
98
+ var rows = [];
99
+ function row(label, val) {
100
+ if (val === undefined || val === null || val === '') return;
101
+ rows.push('<div class="mb-2"><div class="text-xs uppercase text-slate-500">' + escapeHtml(label) +
102
+ '</div><div class="whitespace-pre-wrap">' + escapeHtml(String(val)) + '</div></div>');
103
+ }
104
+ row('Description', d.description);
105
+ row('Acceptance', d.acceptance);
106
+ row('Design', d.design);
107
+ row('Notes', d.notes);
108
+ row('Assignee', d.assignee);
109
+ row('Parent', d.parent);
110
+ if (d.blockedBy && d.blockedBy.length) row('Blocked by', d.blockedBy.join(', '));
111
+ row('Created', d.createdAt);
112
+ row('Updated', d.updatedAt);
113
+ el.innerHTML = rows.join('') || '<span class="text-slate-500">No details.</span>';
114
+ }
115
+
116
+ function toggleRow(kshetraId, row) {
117
+ var beadId = row.getAttribute('data-bead-id');
118
+ var detail = row.querySelector('.task-detail');
119
+ var isOpen = !detail.classList.contains('hidden');
120
+ // collapse any other open row (one at a time)
121
+ var openRows = document.querySelectorAll('.task-detail:not(.hidden)');
122
+ for (var i = 0; i < openRows.length; i++) openRows[i].classList.add('hidden');
123
+ if (isOpen) { expanded = null; return; }
124
+ expanded = beadId;
125
+ detail.classList.remove('hidden');
126
+ if (!detail.getAttribute('data-loaded')) {
127
+ detail.innerHTML = '<span class="text-slate-500">Loading…</span>';
128
+ api('/api/kshetras/' + encodeURIComponent(kshetraId) + '/tasks/' + encodeURIComponent(beadId))
129
+ .then(function (d) { renderDetail(detail, d); detail.setAttribute('data-loaded', '1'); })
130
+ .catch(function (e) { detail.innerHTML = '<span class="text-red-400">' + escapeHtml(e.message) + '</span>'; });
131
+ }
132
+ }
133
+
134
+ function loadTasks(kshetraId, container) {
135
+ var calls = [api('/api/kshetras/' + encodeURIComponent(kshetraId) + '/tasks')];
136
+ if (showClosed) calls.push(api('/api/kshetras/' + encodeURIComponent(kshetraId) + '/tasks?status=closed'));
137
+ Promise.all(calls).then(function (results) {
138
+ var tasks = [];
139
+ for (var i = 0; i < results.length; i++) {
140
+ if (results[i].tasks) tasks = tasks.concat(results[i].tasks);
141
+ }
142
+ if (results[0].error) {
143
+ container.innerHTML = '<div class="px-3 py-2 text-sm text-red-400">' + escapeHtml(results[0].error) + '</div>';
144
+ return;
145
+ }
146
+ container.innerHTML = tasks.map(renderTaskRow).join('') ||
147
+ '<div class="px-3 py-2 text-sm text-slate-500">No tasks.</div>';
148
+ var rows = container.querySelectorAll('.task-row');
149
+ for (var j = 0; j < rows.length; j++) {
150
+ (function (row) {
151
+ row.querySelector('.task-head').addEventListener('click', function () { toggleRow(kshetraId, row); });
152
+ })(rows[j]);
153
+ }
154
+ }).catch(function (e) {
155
+ container.innerHTML = '<div class="px-3 py-2 text-sm text-red-400">' + escapeHtml(e.message) + '</div>';
156
+ });
157
+ }
158
+
159
+ function countsLine(c) {
160
+ if (!c) return '';
161
+ return '<span class="text-xs text-slate-400">' +
162
+ c.open + ' open · ' + c.in_progress + ' active · ' + c.blocked + ' blocked · ' + c.closed + ' closed</span>';
163
+ }
164
+
165
+ function loadBoard() {
166
+ api('/api/kshetras').then(function (kshetras) {
167
+ var board = document.getElementById('board');
168
+ board.innerHTML = '';
169
+ kshetras.forEach(function (k) {
170
+ var section = document.createElement('section');
171
+ section.className = 'mb-6 rounded border border-slate-800 overflow-hidden';
172
+ var statusChip = k.paused
173
+ ? '<span class="text-xs px-1.5 py-0.5 rounded bg-amber-900 text-amber-300">paused</span>'
174
+ : (k.phase ? '<span class="text-xs px-1.5 py-0.5 rounded bg-slate-700 text-slate-300 font-mono">' + escapeHtml(k.phase) + '</span>' : '');
175
+ var head = '<div class="flex items-center gap-3 px-3 py-2 bg-slate-800">' +
176
+ '<h2 class="text-sm font-semibold text-slate-100">' + escapeHtml(k.name) + '</h2>' +
177
+ '<span class="text-xs text-slate-600 font-mono">' + escapeHtml(k.id) + '</span>' +
178
+ statusChip +
179
+ (k.error ? '<span class="text-xs text-red-400">' + escapeHtml(k.error) + '</span>' : countsLine(k.counts)) +
180
+ '</div>';
181
+ var stuckBanner = k.stuck
182
+ ? '<div class="px-3 py-2 bg-red-950 border-t border-red-800 text-xs text-red-200">' +
183
+ '<div class="font-semibold">⚠️ STUCK — ' + escapeHtml(k.stuck.reason) + '</div>' +
184
+ '<pre class="mt-1 whitespace-pre-wrap text-red-300/80">Try:\\n' + escapeHtml(k.stuck.remediation) + '</pre>' +
185
+ '</div>'
186
+ : '';
187
+ section.innerHTML = head + stuckBanner + '<div class="tasks" data-kshetra="' + escapeHtml(k.id) + '"></div>';
188
+ board.appendChild(section);
189
+ loadTasks(k.id, section.querySelector('.tasks'));
190
+ });
191
+ }).catch(function (e) {
192
+ document.getElementById('board').innerHTML =
193
+ '<div class="text-red-400 text-sm">' + escapeHtml(e.message) + '</div>';
194
+ });
195
+ }
196
+
197
+ document.getElementById('closed-toggle').addEventListener('change', function (e) {
198
+ showClosed = e.target.checked;
199
+ loadBoard();
200
+ });
201
+
202
+ loadBoard();
203
+ setInterval(loadBoard, POLL_MS);
204
+ `;
205
+ exports.INDEX_HTML = `<!DOCTYPE html>
206
+ <html lang="en">
207
+ <head>
208
+ <meta charset="UTF-8" />
209
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
210
+ <title>Phalaka — Task Dashboard</title>
211
+ <script src="https://cdn.tailwindcss.com"></script>
212
+ <style>
213
+ body { background: #0f172a; color: #e2e8f0; font-family: system-ui, sans-serif; }
214
+ </style>
215
+ </head>
216
+ <body class="min-h-screen">
217
+ <header class="flex items-center gap-4 px-4 py-3 bg-slate-900 border-b border-slate-700">
218
+ <h1 class="text-lg font-semibold text-slate-100">Phalaka</h1>
219
+ <span class="text-xs text-slate-500">per-Kshetra task board</span>
220
+ <label class="ml-auto flex items-center gap-2 text-xs text-slate-400 cursor-pointer">
221
+ <input id="closed-toggle" type="checkbox" class="accent-slate-500" />
222
+ Show closed
223
+ </label>
224
+ </header>
225
+ <main id="board" class="px-4 py-4 max-w-4xl mx-auto"></main>
226
+ <script>
227
+ ${HELPERS}
228
+
229
+ ${BOOTSTRAP}
230
+ </script>
231
+ </body>
232
+ </html>`;
233
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/phalaka/ui.ts"],"names":[],"mappings":"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"}