ghostrail 0.13.0 → 0.15.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 (120) hide show
  1. package/README.md +2 -2
  2. package/dist/board/index.d.ts +1 -1
  3. package/dist/board/index.d.ts.map +1 -1
  4. package/dist/board/index.js.map +1 -1
  5. package/dist/board/page.d.ts +1 -1
  6. package/dist/board/page.d.ts.map +1 -1
  7. package/dist/board/page.js +169 -11
  8. package/dist/board/page.js.map +1 -1
  9. package/dist/board/server.d.ts +19 -2
  10. package/dist/board/server.d.ts.map +1 -1
  11. package/dist/board/server.js +38 -3
  12. package/dist/board/server.js.map +1 -1
  13. package/dist/cli/commands.d.ts +1 -1
  14. package/dist/cli/commands.d.ts.map +1 -1
  15. package/dist/cli/commands.js +164 -14
  16. package/dist/cli/commands.js.map +1 -1
  17. package/dist/commands/help.js +3 -3
  18. package/dist/commands/help.js.map +1 -1
  19. package/dist/config/load.d.ts.map +1 -1
  20. package/dist/config/load.js +7 -5
  21. package/dist/config/load.js.map +1 -1
  22. package/dist/config/schema.d.ts +15 -0
  23. package/dist/config/schema.d.ts.map +1 -1
  24. package/dist/config/schema.js +5 -0
  25. package/dist/config/schema.js.map +1 -1
  26. package/dist/dashboard/server.d.ts +2 -2
  27. package/dist/dashboard/server.d.ts.map +1 -1
  28. package/dist/dashboard/server.js +8 -4
  29. package/dist/dashboard/server.js.map +1 -1
  30. package/dist/factory/build.d.ts +22 -2
  31. package/dist/factory/build.d.ts.map +1 -1
  32. package/dist/factory/build.js +11 -6
  33. package/dist/factory/build.js.map +1 -1
  34. package/dist/factory/checkout.d.ts +41 -0
  35. package/dist/factory/checkout.d.ts.map +1 -0
  36. package/dist/factory/checkout.js +90 -0
  37. package/dist/factory/checkout.js.map +1 -0
  38. package/dist/factory/state.d.ts +85 -0
  39. package/dist/factory/state.d.ts.map +1 -0
  40. package/dist/factory/state.js +157 -0
  41. package/dist/factory/state.js.map +1 -0
  42. package/dist/global/index.d.ts +3 -1
  43. package/dist/global/index.d.ts.map +1 -1
  44. package/dist/global/index.js +3 -1
  45. package/dist/global/index.js.map +1 -1
  46. package/dist/global/registry.d.ts +38 -5
  47. package/dist/global/registry.d.ts.map +1 -1
  48. package/dist/global/registry.js +40 -14
  49. package/dist/global/registry.js.map +1 -1
  50. package/dist/global/repo-id.d.ts +50 -0
  51. package/dist/global/repo-id.d.ts.map +1 -0
  52. package/dist/global/repo-id.js +149 -0
  53. package/dist/global/repo-id.js.map +1 -0
  54. package/dist/global/state-dir.d.ts +32 -0
  55. package/dist/global/state-dir.d.ts.map +1 -0
  56. package/dist/global/state-dir.js +43 -0
  57. package/dist/global/state-dir.js.map +1 -0
  58. package/dist/global/store.d.ts +2 -0
  59. package/dist/global/store.d.ts.map +1 -1
  60. package/dist/global/store.js.map +1 -1
  61. package/dist/loop/advice.d.ts +11 -0
  62. package/dist/loop/advice.d.ts.map +1 -0
  63. package/dist/loop/advice.js +48 -0
  64. package/dist/loop/advice.js.map +1 -0
  65. package/dist/loop/control.d.ts +15 -1
  66. package/dist/loop/control.d.ts.map +1 -1
  67. package/dist/loop/control.js +8 -1
  68. package/dist/loop/control.js.map +1 -1
  69. package/dist/loop/engine.d.ts.map +1 -1
  70. package/dist/loop/engine.js +1 -0
  71. package/dist/loop/engine.js.map +1 -1
  72. package/dist/loop/index.d.ts +1 -0
  73. package/dist/loop/index.d.ts.map +1 -1
  74. package/dist/loop/index.js +1 -0
  75. package/dist/loop/index.js.map +1 -1
  76. package/dist/publish/gh.d.ts +4 -1
  77. package/dist/publish/gh.d.ts.map +1 -1
  78. package/dist/publish/gh.js +58 -0
  79. package/dist/publish/gh.js.map +1 -1
  80. package/dist/publish/githost.d.ts +19 -0
  81. package/dist/publish/githost.d.ts.map +1 -1
  82. package/dist/publish/githost.js.map +1 -1
  83. package/dist/publish/index.d.ts +2 -2
  84. package/dist/publish/index.d.ts.map +1 -1
  85. package/dist/publish/index.js +1 -1
  86. package/dist/publish/index.js.map +1 -1
  87. package/dist/service/manager.d.ts +2 -0
  88. package/dist/service/manager.d.ts.map +1 -1
  89. package/dist/service/manager.js +2 -1
  90. package/dist/service/manager.js.map +1 -1
  91. package/dist/service/unit.d.ts +16 -7
  92. package/dist/service/unit.d.ts.map +1 -1
  93. package/dist/service/unit.js +11 -7
  94. package/dist/service/unit.js.map +1 -1
  95. package/dist/store/events.d.ts +3 -0
  96. package/dist/store/events.d.ts.map +1 -1
  97. package/dist/store/events.js +2 -0
  98. package/dist/store/events.js.map +1 -1
  99. package/dist/store/file-store.d.ts +5 -18
  100. package/dist/store/file-store.d.ts.map +1 -1
  101. package/dist/store/file-store.js +1 -1
  102. package/dist/store/file-store.js.map +1 -1
  103. package/dist/store/index.d.ts +2 -1
  104. package/dist/store/index.d.ts.map +1 -1
  105. package/dist/store/index.js.map +1 -1
  106. package/dist/store/port.d.ts +53 -0
  107. package/dist/store/port.d.ts.map +1 -0
  108. package/dist/store/port.js +2 -0
  109. package/dist/store/port.js.map +1 -0
  110. package/package.json +1 -1
  111. package/skill/ghostrail/SKILL.md +2 -2
  112. package/templates/{code-local → code}/README.md +2 -2
  113. package/templates/{code-local → code}/ghostrail.toml +2 -2
  114. package/templates/{content-loop → content}/README.md +2 -2
  115. package/templates/{content-loop → content}/ghostrail.toml +1 -1
  116. /package/templates/{code-local → code}/prompts/resolve-issue.md +0 -0
  117. /package/templates/{code-local → code}/prompts/respond.md +0 -0
  118. /package/templates/{code-local → code}/prompts/triage.md +0 -0
  119. /package/templates/{content-loop → content}/prompts/draft.md +0 -0
  120. /package/templates/{content-loop → content}/prompts/respond.md +0 -0
package/README.md CHANGED
@@ -20,7 +20,7 @@ A software factory is thin glue over three primitive layers: where work comes fr
20
20
 
21
21
  ```bash
22
22
  npx ghostrail install # CLI + skill, then offers to set up your credentials
23
- ghostrail init code-local # or: content-loop
23
+ ghostrail init code # or: content
24
24
  ghostrail run # one tick: claim, isolate, run, gate, open PRs
25
25
  ghostrail respond # fold new human PR comments back into branches
26
26
  ghostrail board # watch runs at http://127.0.0.1:5050/
@@ -211,7 +211,7 @@ later release can tell a file *you* edited apart from one the *template* changed
211
211
  Commit that file with the repo.
212
212
 
213
213
  ```bash
214
- ghostrail init code-local --diff # read-only: how do my files differ?
214
+ ghostrail init code --diff # read-only: how do my files differ?
215
215
  ```
216
216
 
217
217
  Each scaffolded file reports as up to date, locally customized, safe to take
@@ -1,4 +1,4 @@
1
- export { type BoardOptions, createBoardServer, isLoopback, normalizeToken, parseRoute, type Route, } from "./server.js";
1
+ export { type BoardOptions, createBoardServer, isLoopback, normalizeToken, parseRoute, type PrStatusReader, type Route, } from "./server.js";
2
2
  export { PAGE_HTML } from "./page.js";
3
3
  export { computeStats, type Stats } from "./stats.js";
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/board/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,UAAU,EACV,KAAK,KAAK,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/board/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,UAAU,EACV,KAAK,cAAc,EACnB,KAAK,KAAK,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/board/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,UAAU,GAEX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/board/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,UAAU,GAGX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC"}
@@ -1,3 +1,3 @@
1
1
  /** The self-contained board page: polls the read API and renders runs + stats. */
2
- export declare const PAGE_HTML = "<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n<title>ghostrail board</title>\n<style>\n :root { color-scheme: light dark; }\n body { font: 14px/1.5 system-ui, sans-serif; margin: 0; padding: 1.5rem; }\n h1 { font-size: 1.1rem; margin: 0 0 1rem; }\n .stats { display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem; }\n .stat { border: 1px solid #8884; border-radius: 8px; padding: .5rem .75rem; }\n .stat b { display: block; font-size: 1.3rem; }\n table { border-collapse: collapse; width: 100%; }\n th, td { text-align: left; padding: .4rem .6rem; border-bottom: 1px solid #8883; }\n .state { font-weight: 600; }\n .done { color: #2a9d3a; } .failed { color: #d33; } .blocked { color: #d90; }\n .noop, .skipped { opacity: .6; } .muted { opacity: .6; }\n a { color: inherit; }\n .toggle { font-size: .8rem; font-weight: normal; margin-left: .75rem; }\n</style>\n</head>\n<body>\n<h1>ghostrail board <label class=\"toggle\"><input type=\"checkbox\" id=\"running\" /> running</label></h1>\n<div class=\"stats\" id=\"stats\"></div>\n<table><thead><tr><th>Run</th><th>Item</th><th>State</th><th>Backend</th><th>Gate</th><th>PR</th><th>When</th></tr></thead>\n<tbody id=\"rows\"></tbody></table>\n<script>\nconst esc = (s) => String(s ?? \"\").replace(/[&<>]/g, (c) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\" }[c]));\nconst runningBox = document.getElementById(\"running\");\nlet toggling = false;\nrunningBox.addEventListener(\"change\", async () => {\n const wanted = runningBox.checked;\n toggling = true;\n runningBox.disabled = true;\n try {\n const res = await fetch(\"api/control\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ enabled: wanted }),\n });\n if (!res.ok) throw new Error(\"toggle failed\");\n const state = await res.json();\n runningBox.checked = state.enabled;\n } catch {\n runningBox.checked = !wanted;\n } finally {\n runningBox.disabled = false;\n toggling = false;\n }\n});\nasync function refresh() {\n const [runs, stats, control] = await Promise.all([\n fetch(\"api/runs\").then((r) => r.json()),\n fetch(\"api/stats\").then((r) => r.json()),\n fetch(\"api/control\").then((r) => r.json()),\n ]);\n if (!toggling) runningBox.checked = control.enabled;\n document.getElementById(\"stats\").innerHTML = [\n [\"runs\", stats.total],\n [\"success\", (stats.successRate * 100).toFixed(0) + \"%\"],\n [\"PRs\", stats.prCount],\n ].map(([k, v]) => '<div class=\"stat\"><b>' + esc(v) + \"</b>\" + esc(k) + \"</div>\").join(\"\");\n document.getElementById(\"rows\").innerHTML = runs.map((r) => {\n const gate = (r.gate || []).map((s) => (s.exitCode === 0 ? \"\u2713\" : \"\u2717\")).join(\"\");\n const pr = r.prUrl ? '<a href=\"' + esc(r.prUrl) + '\">#' + esc(r.prNumber) + \"</a>\" : \"\";\n const when = r.startedAt ? new Date(r.startedAt).toLocaleString() : \"\";\n const state = esc(r.state || \"in-progress\");\n return \"<tr><td class=muted>\" + esc(r.runId.slice(0, 8)) + \"</td><td>\" + esc(r.title || r.itemId || \"\") +\n '</td><td class=\"state ' + state + '\">' + state + \"</td><td>\" + esc(r.backend || \"\") +\n \"</td><td>\" + gate + \"</td><td>\" + pr + \"</td><td class=muted>\" + esc(when) + \"</td></tr>\";\n }).join(\"\");\n}\nrefresh();\nsetInterval(refresh, 5000);\n</script>\n</body>\n</html>";
2
+ export declare const PAGE_HTML = "<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n<title>ghostrail board</title>\n<style>\n :root { color-scheme: light dark; }\n body { font: 14px/1.5 system-ui, sans-serif; margin: 0; padding: 1.5rem; }\n h1 { font-size: 1.1rem; margin: 0 0 1rem; }\n .stats { display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem; }\n .stat { border: 1px solid #8884; border-radius: 8px; padding: .5rem .75rem; }\n .stat b { display: block; font-size: 1.3rem; }\n table { border-collapse: collapse; width: 100%; }\n th, td { text-align: left; padding: .4rem .6rem; border-bottom: 1px solid #8883; }\n .state { font-weight: 600; }\n .done { color: #2a9d3a; } .failed { color: #d33; } .blocked { color: #d90; }\n .noop, .skipped { opacity: .6; } .muted { opacity: .6; }\n a { color: inherit; }\n .twirl {\n background: none; border: none; cursor: pointer; font: inherit; padding: 0 .3rem;\n display: inline-block; transition: transform .15s ease;\n }\n .twirl.open { transform: rotate(90deg); }\n .detail-cell { padding: .75rem 1.5rem; background: #8881; }\n .detail-cell > div { margin-bottom: .5rem; }\n .detail-cell pre { white-space: pre-wrap; word-break: break-word; margin: .25rem 0 0; font: inherit; }\n .subtable { border-collapse: collapse; margin-top: .25rem; }\n .subtable td { padding: .15rem .5rem .15rem 0; border-bottom: none; }\n .detail-cell ul { margin: .25rem 0 0; padding-left: 1.2rem; }\n .toggle { font-size: .8rem; font-weight: normal; margin-left: .75rem; }\n</style>\n</head>\n<body>\n<h1>ghostrail board <label class=\"toggle\"><input type=\"checkbox\" id=\"running\" /> running</label></h1>\n<div class=\"stats\" id=\"stats\"></div>\n<table><thead><tr><th></th><th>Run</th><th>Item</th><th>State</th><th>Backend</th><th>Gate</th><th>PR</th><th>When</th></tr></thead>\n<tbody id=\"rows\"></tbody></table>\n<script>\nconst esc = (s) => String(s ?? \"\").replace(/[&<>\"]/g, (c) => (\n { \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\" }[c]\n));\nconst expanded = new Set();\nconst detailHtml = new Map();\nconst prStatusCache = new Map();\n\nfunction fmtWhen(ts) {\n return ts ? new Date(ts).toLocaleString() : \"\";\n}\n\nfunction gateStepsHtml(gate) {\n if (!gate || gate.length === 0) return \"<div class=muted>no gate steps</div>\";\n const rows = gate.map((s) =>\n \"<tr><td>\" + esc(s.name) + \"</td><td class='\" + (s.exitCode === 0 ? \"done\" : \"failed\") + \"'>\" +\n (s.exitCode === 0 ? \"passed\" : \"failed (exit \" + esc(s.exitCode) + \")\") + \"</td><td class=muted>\" +\n esc(s.durationMs) + \"ms</td></tr>\"\n ).join(\"\");\n return \"<table class=subtable>\" + rows + \"</table>\";\n}\n\nfunction artifactsHtml(artifacts) {\n if (!artifacts || artifacts.length === 0) return \"\";\n const items = artifacts.map((a) =>\n '<li><a href=\"api/artifacts/' + esc(a.hash) + '\">' + esc(a.name) + \"</a></li>\"\n ).join(\"\");\n return \"<div><b>Artifacts</b><ul>\" + items + \"</ul></div>\";\n}\n\nfunction checkLineHtml(c) {\n const label = c.conclusion || c.status;\n const cls = c.conclusion === \"success\" ? \"done\" : c.conclusion ? \"failed\" : \"muted\";\n const name = c.url ? '<a href=\"' + esc(c.url) + '\">' + esc(c.name) + \"</a>\" : esc(c.name);\n return \"<li>\" + name + \": <span class='\" + cls + \"'>\" + esc(label) + \"</span></li>\";\n}\n\nfunction prStatusHtml(status) {\n if (!status) return \"<div class=muted>loading CI status\u2026</div>\";\n if (!status.available) {\n return \"<div class=muted>PR status unknown\" + (status.error ? \": \" + esc(status.error) : \"\") + \"</div>\";\n }\n const merged = status.state === \"merged\";\n const parts = [\n \"<div><b>PR state:</b> \" + esc(status.state) +\n (merged && status.mergedAt ? \" at \" + esc(new Date(status.mergedAt).toLocaleString()) : \"\") + \"</div>\",\n ];\n if (status.checks && status.checks.length > 0) {\n parts.push(\"<div><b>CI checks</b><ul>\" + status.checks.map(checkLineHtml).join(\"\") + \"</ul></div>\");\n } else {\n parts.push(\"<div class=muted>no CI checks reported</div>\");\n }\n return parts.join(\"\");\n}\n\nfunction detailBodyHtml(row) {\n const parts = [];\n parts.push(\"<div><b>Item</b> \" + esc(row.itemId || \"\") + (row.kind ? \" (\" + esc(row.kind) + \")\" : \"\") + \"</div>\");\n if (row.branch) parts.push(\"<div><b>Branch</b> \" + esc(row.branch) + \"</div>\");\n if (row.costUsd !== undefined) {\n parts.push(\"<div><b>Cost</b> $\" + esc(Number(row.costUsd).toFixed(4)) + \"</div>\");\n }\n if (row.tokensIn !== undefined || row.tokensOut !== undefined) {\n parts.push(\"<div><b>Tokens</b> in \" + esc(row.tokensIn ?? 0) + \" / out \" + esc(row.tokensOut ?? 0) + \"</div>\");\n }\n parts.push(\"<div><b>Gate</b>\" + gateStepsHtml(row.gate) + \"</div>\");\n if (row.error) parts.push(\"<div><b>Error</b><pre class=failed>\" + esc(row.error) + \"</pre></div>\");\n if (row.summary) parts.push(\"<div><b>Comment</b><pre>\" + esc(row.summary) + \"</pre></div>\");\n if (row.prUrl) {\n parts.push('<div><b>PR</b> <a href=\"' + esc(row.prUrl) + '\">' + esc(row.prUrl) + \"</a></div>\");\n }\n parts.push(artifactsHtml(row.artifacts));\n parts.push(\n \"<div class=muted>started \" + esc(fmtWhen(row.startedAt)) +\n \", finished \" + esc(fmtWhen(row.finishedAt)) + \"</div>\",\n );\n return parts.join(\"\");\n}\n\nasync function loadDetail(runId) {\n let row;\n try {\n const res = await fetch(\"api/runs/\" + encodeURIComponent(runId));\n if (!res.ok) return;\n row = (await res.json()).row;\n } catch {\n return;\n }\n let html = detailBodyHtml(row);\n if (row.prNumber !== undefined) {\n html += '<div class=\"pr-status\" data-run-id=\"' + esc(runId) + '\">' +\n prStatusHtml(prStatusCache.get(runId)) + \"</div>\";\n }\n detailHtml.set(runId, html);\n paintDetail(runId);\n if (row.prNumber !== undefined) await loadPrStatus(runId);\n}\n\nasync function loadPrStatus(runId) {\n let status;\n try {\n status = await (await fetch(\"api/runs/\" + encodeURIComponent(runId) + \"/pr-status\")).json();\n } catch {\n return;\n }\n prStatusCache.set(runId, status);\n const el = document.querySelector('.pr-status[data-run-id=\"' + runId + '\"]');\n if (el) el.innerHTML = prStatusHtml(status);\n}\n\nfunction paintDetail(runId) {\n const cell = document.getElementById(\"detail-\" + runId);\n if (cell) cell.innerHTML = detailHtml.get(runId) || \"<div class=muted>loading\u2026</div>\";\n}\n\nfunction toggle(runId) {\n if (expanded.has(runId)) {\n expanded.delete(runId);\n } else {\n expanded.add(runId);\n if (!detailHtml.has(runId)) loadDetail(runId);\n }\n const btn = document.querySelector('.twirl[data-run-id=\"' + runId + '\"]');\n if (btn) btn.classList.toggle(\"open\", expanded.has(runId));\n const detailRow = document.getElementById(\"detail-row-\" + runId);\n if (detailRow) detailRow.style.display = expanded.has(runId) ? \"table-row\" : \"none\";\n if (expanded.has(runId)) paintDetail(runId);\n}\n\nfunction rowHtml(r) {\n const isOpen = expanded.has(r.runId);\n const gate = (r.gate || []).map((s) => (s.exitCode === 0 ? \"\u2713\" : \"\u2717\")).join(\"\");\n const pr = r.prUrl ? '<a href=\"' + esc(r.prUrl) + '\">#' + esc(r.prNumber) + \"</a>\" : \"\";\n const when = fmtWhen(r.startedAt);\n const state = esc(r.state || \"in-progress\");\n const main = \"<tr class=run-row>\" +\n \"<td><button class='twirl\" + (isOpen ? \" open\" : \"\") + \"' data-run-id='\" + esc(r.runId) + \"'>\u25B6</button></td>\" +\n \"<td class=muted>\" + esc(r.runId.slice(0, 8)) + \"</td>\" +\n \"<td>\" + esc(r.title || r.itemId || \"\") + \"</td>\" +\n \"<td class='state \" + state + \"'>\" + state + \"</td>\" +\n \"<td>\" + esc(r.backend || \"\") + \"</td>\" +\n \"<td>\" + gate + \"</td>\" +\n \"<td>\" + pr + \"</td>\" +\n \"<td class=muted>\" + esc(when) + \"</td></tr>\";\n const cellContent = isOpen ? (detailHtml.get(r.runId) || \"<div class=muted>loading\u2026</div>\") : \"\";\n const detail = \"<tr class=detail-row id='detail-row-\" + esc(r.runId) + \"'\" +\n \" style='display:\" + (isOpen ? \"table-row\" : \"none\") + \"'>\" +\n \"<td colspan=8 class=detail-cell id='detail-\" + esc(r.runId) + \"'>\" + cellContent + \"</td></tr>\";\n return main + detail;\n}\n\ndocument.getElementById(\"rows\").addEventListener(\"click\", (e) => {\n const btn = e.target.closest(\".twirl\");\n if (btn) toggle(btn.dataset.runId);\n});\n\nconst runningBox = document.getElementById(\"running\");\nlet toggling = false;\nrunningBox.addEventListener(\"change\", async () => {\n const wanted = runningBox.checked;\n toggling = true;\n runningBox.disabled = true;\n try {\n const res = await fetch(\"api/control\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ enabled: wanted }),\n });\n if (!res.ok) throw new Error(\"toggle failed\");\n const state = await res.json();\n runningBox.checked = state.enabled;\n } catch {\n runningBox.checked = !wanted;\n } finally {\n runningBox.disabled = false;\n toggling = false;\n }\n});\nasync function refresh() {\n const [runs, stats, control] = await Promise.all([\n fetch(\"api/runs\").then((r) => r.json()),\n fetch(\"api/stats\").then((r) => r.json()),\n fetch(\"api/control\").then((r) => r.json()),\n ]);\n if (!toggling) runningBox.checked = control.enabled;\n document.getElementById(\"stats\").innerHTML = [\n [\"runs\", stats.total],\n [\"success\", (stats.successRate * 100).toFixed(0) + \"%\"],\n [\"PRs\", stats.prCount],\n ].map(([k, v]) => '<div class=\"stat\"><b>' + esc(v) + \"</b>\" + esc(k) + \"</div>\").join(\"\");\n document.getElementById(\"rows\").innerHTML = runs.map(rowHtml).join(\"\");\n for (const runId of expanded) loadDetail(runId);\n}\nrefresh();\nsetInterval(refresh, 5000);\n</script>\n</body>\n</html>";
3
3
  //# sourceMappingURL=page.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/board/page.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,eAAO,MAAM,SAAS,y8GA6Ed,CAAC"}
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/board/page.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,eAAO,MAAM,SAAS,w2TA2Od,CAAC"}
@@ -18,16 +18,181 @@ export const PAGE_HTML = `<!doctype html>
18
18
  .done { color: #2a9d3a; } .failed { color: #d33; } .blocked { color: #d90; }
19
19
  .noop, .skipped { opacity: .6; } .muted { opacity: .6; }
20
20
  a { color: inherit; }
21
+ .twirl {
22
+ background: none; border: none; cursor: pointer; font: inherit; padding: 0 .3rem;
23
+ display: inline-block; transition: transform .15s ease;
24
+ }
25
+ .twirl.open { transform: rotate(90deg); }
26
+ .detail-cell { padding: .75rem 1.5rem; background: #8881; }
27
+ .detail-cell > div { margin-bottom: .5rem; }
28
+ .detail-cell pre { white-space: pre-wrap; word-break: break-word; margin: .25rem 0 0; font: inherit; }
29
+ .subtable { border-collapse: collapse; margin-top: .25rem; }
30
+ .subtable td { padding: .15rem .5rem .15rem 0; border-bottom: none; }
31
+ .detail-cell ul { margin: .25rem 0 0; padding-left: 1.2rem; }
21
32
  .toggle { font-size: .8rem; font-weight: normal; margin-left: .75rem; }
22
33
  </style>
23
34
  </head>
24
35
  <body>
25
36
  <h1>ghostrail board <label class="toggle"><input type="checkbox" id="running" /> running</label></h1>
26
37
  <div class="stats" id="stats"></div>
27
- <table><thead><tr><th>Run</th><th>Item</th><th>State</th><th>Backend</th><th>Gate</th><th>PR</th><th>When</th></tr></thead>
38
+ <table><thead><tr><th></th><th>Run</th><th>Item</th><th>State</th><th>Backend</th><th>Gate</th><th>PR</th><th>When</th></tr></thead>
28
39
  <tbody id="rows"></tbody></table>
29
40
  <script>
30
- const esc = (s) => String(s ?? "").replace(/[&<>]/g, (c) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;" }[c]));
41
+ const esc = (s) => String(s ?? "").replace(/[&<>"]/g, (c) => (
42
+ { "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;" }[c]
43
+ ));
44
+ const expanded = new Set();
45
+ const detailHtml = new Map();
46
+ const prStatusCache = new Map();
47
+
48
+ function fmtWhen(ts) {
49
+ return ts ? new Date(ts).toLocaleString() : "";
50
+ }
51
+
52
+ function gateStepsHtml(gate) {
53
+ if (!gate || gate.length === 0) return "<div class=muted>no gate steps</div>";
54
+ const rows = gate.map((s) =>
55
+ "<tr><td>" + esc(s.name) + "</td><td class='" + (s.exitCode === 0 ? "done" : "failed") + "'>" +
56
+ (s.exitCode === 0 ? "passed" : "failed (exit " + esc(s.exitCode) + ")") + "</td><td class=muted>" +
57
+ esc(s.durationMs) + "ms</td></tr>"
58
+ ).join("");
59
+ return "<table class=subtable>" + rows + "</table>";
60
+ }
61
+
62
+ function artifactsHtml(artifacts) {
63
+ if (!artifacts || artifacts.length === 0) return "";
64
+ const items = artifacts.map((a) =>
65
+ '<li><a href="api/artifacts/' + esc(a.hash) + '">' + esc(a.name) + "</a></li>"
66
+ ).join("");
67
+ return "<div><b>Artifacts</b><ul>" + items + "</ul></div>";
68
+ }
69
+
70
+ function checkLineHtml(c) {
71
+ const label = c.conclusion || c.status;
72
+ const cls = c.conclusion === "success" ? "done" : c.conclusion ? "failed" : "muted";
73
+ const name = c.url ? '<a href="' + esc(c.url) + '">' + esc(c.name) + "</a>" : esc(c.name);
74
+ return "<li>" + name + ": <span class='" + cls + "'>" + esc(label) + "</span></li>";
75
+ }
76
+
77
+ function prStatusHtml(status) {
78
+ if (!status) return "<div class=muted>loading CI status…</div>";
79
+ if (!status.available) {
80
+ return "<div class=muted>PR status unknown" + (status.error ? ": " + esc(status.error) : "") + "</div>";
81
+ }
82
+ const merged = status.state === "merged";
83
+ const parts = [
84
+ "<div><b>PR state:</b> " + esc(status.state) +
85
+ (merged && status.mergedAt ? " at " + esc(new Date(status.mergedAt).toLocaleString()) : "") + "</div>",
86
+ ];
87
+ if (status.checks && status.checks.length > 0) {
88
+ parts.push("<div><b>CI checks</b><ul>" + status.checks.map(checkLineHtml).join("") + "</ul></div>");
89
+ } else {
90
+ parts.push("<div class=muted>no CI checks reported</div>");
91
+ }
92
+ return parts.join("");
93
+ }
94
+
95
+ function detailBodyHtml(row) {
96
+ const parts = [];
97
+ parts.push("<div><b>Item</b> " + esc(row.itemId || "") + (row.kind ? " (" + esc(row.kind) + ")" : "") + "</div>");
98
+ if (row.branch) parts.push("<div><b>Branch</b> " + esc(row.branch) + "</div>");
99
+ if (row.costUsd !== undefined) {
100
+ parts.push("<div><b>Cost</b> $" + esc(Number(row.costUsd).toFixed(4)) + "</div>");
101
+ }
102
+ if (row.tokensIn !== undefined || row.tokensOut !== undefined) {
103
+ parts.push("<div><b>Tokens</b> in " + esc(row.tokensIn ?? 0) + " / out " + esc(row.tokensOut ?? 0) + "</div>");
104
+ }
105
+ parts.push("<div><b>Gate</b>" + gateStepsHtml(row.gate) + "</div>");
106
+ if (row.error) parts.push("<div><b>Error</b><pre class=failed>" + esc(row.error) + "</pre></div>");
107
+ if (row.summary) parts.push("<div><b>Comment</b><pre>" + esc(row.summary) + "</pre></div>");
108
+ if (row.prUrl) {
109
+ parts.push('<div><b>PR</b> <a href="' + esc(row.prUrl) + '">' + esc(row.prUrl) + "</a></div>");
110
+ }
111
+ parts.push(artifactsHtml(row.artifacts));
112
+ parts.push(
113
+ "<div class=muted>started " + esc(fmtWhen(row.startedAt)) +
114
+ ", finished " + esc(fmtWhen(row.finishedAt)) + "</div>",
115
+ );
116
+ return parts.join("");
117
+ }
118
+
119
+ async function loadDetail(runId) {
120
+ let row;
121
+ try {
122
+ const res = await fetch("api/runs/" + encodeURIComponent(runId));
123
+ if (!res.ok) return;
124
+ row = (await res.json()).row;
125
+ } catch {
126
+ return;
127
+ }
128
+ let html = detailBodyHtml(row);
129
+ if (row.prNumber !== undefined) {
130
+ html += '<div class="pr-status" data-run-id="' + esc(runId) + '">' +
131
+ prStatusHtml(prStatusCache.get(runId)) + "</div>";
132
+ }
133
+ detailHtml.set(runId, html);
134
+ paintDetail(runId);
135
+ if (row.prNumber !== undefined) await loadPrStatus(runId);
136
+ }
137
+
138
+ async function loadPrStatus(runId) {
139
+ let status;
140
+ try {
141
+ status = await (await fetch("api/runs/" + encodeURIComponent(runId) + "/pr-status")).json();
142
+ } catch {
143
+ return;
144
+ }
145
+ prStatusCache.set(runId, status);
146
+ const el = document.querySelector('.pr-status[data-run-id="' + runId + '"]');
147
+ if (el) el.innerHTML = prStatusHtml(status);
148
+ }
149
+
150
+ function paintDetail(runId) {
151
+ const cell = document.getElementById("detail-" + runId);
152
+ if (cell) cell.innerHTML = detailHtml.get(runId) || "<div class=muted>loading…</div>";
153
+ }
154
+
155
+ function toggle(runId) {
156
+ if (expanded.has(runId)) {
157
+ expanded.delete(runId);
158
+ } else {
159
+ expanded.add(runId);
160
+ if (!detailHtml.has(runId)) loadDetail(runId);
161
+ }
162
+ const btn = document.querySelector('.twirl[data-run-id="' + runId + '"]');
163
+ if (btn) btn.classList.toggle("open", expanded.has(runId));
164
+ const detailRow = document.getElementById("detail-row-" + runId);
165
+ if (detailRow) detailRow.style.display = expanded.has(runId) ? "table-row" : "none";
166
+ if (expanded.has(runId)) paintDetail(runId);
167
+ }
168
+
169
+ function rowHtml(r) {
170
+ const isOpen = expanded.has(r.runId);
171
+ const gate = (r.gate || []).map((s) => (s.exitCode === 0 ? "✓" : "✗")).join("");
172
+ const pr = r.prUrl ? '<a href="' + esc(r.prUrl) + '">#' + esc(r.prNumber) + "</a>" : "";
173
+ const when = fmtWhen(r.startedAt);
174
+ const state = esc(r.state || "in-progress");
175
+ const main = "<tr class=run-row>" +
176
+ "<td><button class='twirl" + (isOpen ? " open" : "") + "' data-run-id='" + esc(r.runId) + "'>▶</button></td>" +
177
+ "<td class=muted>" + esc(r.runId.slice(0, 8)) + "</td>" +
178
+ "<td>" + esc(r.title || r.itemId || "") + "</td>" +
179
+ "<td class='state " + state + "'>" + state + "</td>" +
180
+ "<td>" + esc(r.backend || "") + "</td>" +
181
+ "<td>" + gate + "</td>" +
182
+ "<td>" + pr + "</td>" +
183
+ "<td class=muted>" + esc(when) + "</td></tr>";
184
+ const cellContent = isOpen ? (detailHtml.get(r.runId) || "<div class=muted>loading…</div>") : "";
185
+ const detail = "<tr class=detail-row id='detail-row-" + esc(r.runId) + "'" +
186
+ " style='display:" + (isOpen ? "table-row" : "none") + "'>" +
187
+ "<td colspan=8 class=detail-cell id='detail-" + esc(r.runId) + "'>" + cellContent + "</td></tr>";
188
+ return main + detail;
189
+ }
190
+
191
+ document.getElementById("rows").addEventListener("click", (e) => {
192
+ const btn = e.target.closest(".twirl");
193
+ if (btn) toggle(btn.dataset.runId);
194
+ });
195
+
31
196
  const runningBox = document.getElementById("running");
32
197
  let toggling = false;
33
198
  runningBox.addEventListener("change", async () => {
@@ -62,15 +227,8 @@ async function refresh() {
62
227
  ["success", (stats.successRate * 100).toFixed(0) + "%"],
63
228
  ["PRs", stats.prCount],
64
229
  ].map(([k, v]) => '<div class="stat"><b>' + esc(v) + "</b>" + esc(k) + "</div>").join("");
65
- document.getElementById("rows").innerHTML = runs.map((r) => {
66
- const gate = (r.gate || []).map((s) => (s.exitCode === 0 ? "✓" : "✗")).join("");
67
- const pr = r.prUrl ? '<a href="' + esc(r.prUrl) + '">#' + esc(r.prNumber) + "</a>" : "";
68
- const when = r.startedAt ? new Date(r.startedAt).toLocaleString() : "";
69
- const state = esc(r.state || "in-progress");
70
- return "<tr><td class=muted>" + esc(r.runId.slice(0, 8)) + "</td><td>" + esc(r.title || r.itemId || "") +
71
- '</td><td class="state ' + state + '">' + state + "</td><td>" + esc(r.backend || "") +
72
- "</td><td>" + gate + "</td><td>" + pr + "</td><td class=muted>" + esc(when) + "</td></tr>";
73
- }).join("");
230
+ document.getElementById("rows").innerHTML = runs.map(rowHtml).join("");
231
+ for (const runId of expanded) loadDetail(runId);
74
232
  }
75
233
  refresh();
76
234
  setInterval(refresh, 5000);
@@ -1 +1 @@
1
- {"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/board/page.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA6EjB,CAAC"}
1
+ {"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/board/page.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA2OjB,CAAC"}
@@ -1,5 +1,7 @@
1
1
  import { type Server } from "node:http";
2
- import type { FileStore } from "../store/file-store.js";
2
+ import type { RunControl } from "../loop/control.js";
3
+ import type { PrStatus } from "../publish/githost.js";
4
+ import type { RunStore } from "../store/port.js";
3
5
  export type Route = {
4
6
  kind: "page";
5
7
  } | {
@@ -10,6 +12,9 @@ export type Route = {
10
12
  } | {
11
13
  kind: "events";
12
14
  id: string;
15
+ } | {
16
+ kind: "prStatus";
17
+ id: string;
13
18
  } | {
14
19
  kind: "stats";
15
20
  } | {
@@ -22,6 +27,10 @@ export type Route = {
22
27
  };
23
28
  /** Map a request pathname to a board route. Pure. */
24
29
  export declare function parseRoute(pathname: string): Route;
30
+ /** The narrow read the board needs to show live PR/CI status; a `GitHost` satisfies it. */
31
+ export interface PrStatusReader {
32
+ getPrStatus(prNumber: number): Promise<PrStatus>;
33
+ }
25
34
  export interface BoardOptions {
26
35
  /** Address to bind. Defaults to loopback. */
27
36
  bind?: string;
@@ -34,6 +43,14 @@ export interface BoardOptions {
34
43
  * who can reach the host.
35
44
  */
36
45
  allowNoToken?: boolean;
46
+ /** Optional live PR/CI status reader. Without it, `/api/runs/:id/pr-status` reports unavailable. */
47
+ gitHost?: PrStatusReader;
48
+ /**
49
+ * The run/pause flag. Without it, `/api/control` reports the ghostrail as
50
+ * running and refuses to change it: a board that cannot reach the flag should
51
+ * say so rather than claim a pause it did not perform.
52
+ */
53
+ control?: RunControl;
37
54
  }
38
55
  /** True for an address only this machine can reach, where a token is optional. */
39
56
  export declare function isLoopback(bind: string): boolean;
@@ -45,7 +62,7 @@ export declare function isLoopback(bind: string): boolean;
45
62
  * token is configured (required whenever the bind is not loopback), every
46
63
  * request must present it.
47
64
  */
48
- export declare function createBoardServer(store: FileStore, options?: BoardOptions): Server;
65
+ export declare function createBoardServer(store: RunStore, options?: BoardOptions): Server;
49
66
  /** A token that is absent, empty, or only whitespace is no token at all. */
50
67
  /**
51
68
  * An empty or whitespace-only token is no token.
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/board/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,MAAM,EAAqC,MAAM,WAAW,CAAC;AAEjG,OAAO,KAAK,EAAE,SAAS,EAAa,MAAM,wBAAwB,CAAC;AAInE,MAAM,MAAM,KAAK,GACb;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC3B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAEzB,qDAAqD;AACrD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,CAkBlD;AAuBD,MAAM,WAAW,YAAY;IAC3B,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4FAA4F;IAC5F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,kFAAkF;AAClF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD;AAQD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,GAAE,YAAiB,GAAG,MAAM,CAqBtF;AAED,4EAA4E;AAC5E;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAG5E"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/board/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,MAAM,EAAqC,MAAM,WAAW,CAAC;AACjG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAa,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI5D,MAAM,MAAM,KAAK,GACb;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC3B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAEzB,qDAAqD;AACrD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,CAmBlD;AAED,2FAA2F;AAC3F,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CAClD;AAuBD,MAAM,WAAW,YAAY;IAC3B,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4FAA4F;IAC5F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oGAAoG;IACpG,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB;;;;OAIG;IACH,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB;AAED,kFAAkF;AAClF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD;AAQD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,GAAE,YAAiB,GAAG,MAAM,CAqBrF;AAED,4EAA4E;AAC5E;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAG5E"}
@@ -1,5 +1,4 @@
1
1
  import { createServer } from "node:http";
2
- import { readControl, writeControl } from "../loop/control.js";
3
2
  import { PAGE_HTML } from "./page.js";
4
3
  import { computeStats } from "./stats.js";
5
4
  /** Map a request pathname to a board route. Pure. */
@@ -17,6 +16,8 @@ export function parseRoute(pathname) {
17
16
  return { kind: "run", id };
18
17
  if (parts.length === 4 && parts[3] === "events")
19
18
  return { kind: "events", id };
19
+ if (parts.length === 4 && parts[3] === "pr-status")
20
+ return { kind: "prStatus", id };
20
21
  return { kind: "notfound" };
21
22
  }
22
23
  if (parts[1] === "stats" && parts.length === 2)
@@ -134,10 +135,40 @@ async function handle(store, options, req, res) {
134
135
  case "events":
135
136
  sendJson(res, 200, await store.getEvents(route.id));
136
137
  return;
138
+ case "prStatus": {
139
+ const row = await store.getRun(route.id);
140
+ if (row === undefined) {
141
+ sendJson(res, 404, { error: "not found" });
142
+ return;
143
+ }
144
+ if (row.prNumber === undefined) {
145
+ sendJson(res, 404, { error: "no pull request for this run" });
146
+ return;
147
+ }
148
+ if (options.gitHost === undefined) {
149
+ sendJson(res, 200, { available: false });
150
+ return;
151
+ }
152
+ try {
153
+ const status = await options.gitHost.getPrStatus(row.prNumber);
154
+ sendJson(res, 200, { available: true, ...status });
155
+ }
156
+ catch (error) {
157
+ sendJson(res, 200, {
158
+ available: false,
159
+ error: error instanceof Error ? error.message : String(error),
160
+ });
161
+ }
162
+ return;
163
+ }
137
164
  case "stats":
138
165
  sendJson(res, 200, computeStats(await store.listRuns()));
139
166
  return;
140
167
  case "control": {
168
+ // From the options this request was handed, not a closure: `handle` is a
169
+ // module-level function, and a free `control` here silently resolved to a
170
+ // global at compile time and threw at runtime.
171
+ const control = options.control;
141
172
  if (req.method === "POST") {
142
173
  let payload;
143
174
  try {
@@ -154,9 +185,13 @@ async function handle(store, options, req, res) {
154
185
  sendJson(res, 400, { error: "enabled must be a boolean" });
155
186
  return;
156
187
  }
157
- await writeControl(store.dir, { enabled });
188
+ if (control === undefined) {
189
+ sendJson(res, 503, { error: "this board cannot change the run flag" });
190
+ return;
191
+ }
192
+ await control.write({ enabled });
158
193
  }
159
- sendJson(res, 200, await readControl(store.dir));
194
+ sendJson(res, 200, control === undefined ? { enabled: true } : await control.read());
160
195
  return;
161
196
  }
162
197
  case "artifact": {
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/board/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/board/server.ts"],"names":[],"mappings":"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"}
@@ -84,7 +84,7 @@ export declare function cmdStop(argv: readonly string[], streams: CommandStreams
84
84
  /** `ghostrail status`: what each ghostrail is doing, and what it should be doing. */
85
85
  export declare function cmdStatus(argv: readonly string[], streams: CommandStreams, env?: CommandEnv, manager?: ServiceManager): Promise<number>;
86
86
  /** The quickstart templates bundled with the package. */
87
- export declare const TEMPLATES: readonly ["code-local", "content-loop"];
87
+ export declare const TEMPLATES: readonly ["code", "content"];
88
88
  /**
89
89
  * `ghostrail init <template> [--repo <path>] [--force|--diff|--update]`: scaffold
90
90
  * `ghostrail.toml` and `prompts/` from a quickstart template. Safe for a fresh OR
@@ -1 +1 @@
1
- {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}