@shardworks/dashboard-apparatus 0.1.113
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/LICENSE +15 -0
- package/dist/dashboard.d.ts +13 -0
- package/dist/dashboard.d.ts.map +1 -0
- package/dist/dashboard.js +26 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/html.d.ts +7 -0
- package/dist/html.d.ts.map +1 -0
- package/dist/html.js +1017 -0
- package/dist/html.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/rig-types.d.ts +23 -0
- package/dist/rig-types.d.ts.map +1 -0
- package/dist/rig-types.js +5 -0
- package/dist/rig-types.js.map +1 -0
- package/dist/server.d.ts +13 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +284 -0
- package/dist/server.js.map +1 -0
- package/dist/tool.d.ts +12 -0
- package/dist/tool.d.ts.map +1 -0
- package/dist/tool.js +62 -0
- package/dist/tool.js.map +1 -0
- package/dist/types.d.ts +29 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +35 -0
package/dist/html.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../src/html.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,UAAU,gBAAgB;IAC9B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAg/BD,CAAC;AACT,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @shardworks/dashboard-apparatus — The Dashboard.
|
|
3
|
+
*
|
|
4
|
+
* Web-based guild operations dashboard. Exposes the `dashboard-start` CLI
|
|
5
|
+
* tool which launches a local web server with a live operations UI including
|
|
6
|
+
* tabs for Overview, Clerk, Walker, Animator, and Codexes.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* nsg dashboard start
|
|
10
|
+
* nsg dashboard start --port 8080
|
|
11
|
+
* nsg dashboard start --no-open
|
|
12
|
+
*/
|
|
13
|
+
export { createDashboard } from './dashboard.ts';
|
|
14
|
+
declare const _default: import("@shardworks/nexus-core").Plugin;
|
|
15
|
+
export default _default;
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;;AAIjD,wBAAiC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @shardworks/dashboard-apparatus — The Dashboard.
|
|
3
|
+
*
|
|
4
|
+
* Web-based guild operations dashboard. Exposes the `dashboard-start` CLI
|
|
5
|
+
* tool which launches a local web server with a live operations UI including
|
|
6
|
+
* tabs for Overview, Clerk, Walker, Animator, and Codexes.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* nsg dashboard start
|
|
10
|
+
* nsg dashboard start --port 8080
|
|
11
|
+
* nsg dashboard start --no-open
|
|
12
|
+
*/
|
|
13
|
+
import { createDashboard } from "./dashboard.js";
|
|
14
|
+
export { createDashboard } from "./dashboard.js";
|
|
15
|
+
// ── Default export: the apparatus plugin ──────────────────────────
|
|
16
|
+
export default createDashboard();
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,qEAAqE;AAErE,eAAe,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local type stubs for Walker rig documents read via Stacks readBook().
|
|
3
|
+
*/
|
|
4
|
+
export interface EngineInstance {
|
|
5
|
+
id: string;
|
|
6
|
+
designId: string;
|
|
7
|
+
status: 'pending' | 'running' | 'completed' | 'failed';
|
|
8
|
+
upstream: string[];
|
|
9
|
+
givensSpec: Record<string, unknown>;
|
|
10
|
+
yields?: unknown;
|
|
11
|
+
error?: string;
|
|
12
|
+
sessionId?: string;
|
|
13
|
+
startedAt?: string;
|
|
14
|
+
completedAt?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface RigDoc {
|
|
17
|
+
id: string;
|
|
18
|
+
writId: string;
|
|
19
|
+
status: 'running' | 'completed' | 'failed';
|
|
20
|
+
engines: EngineInstance[];
|
|
21
|
+
[key: string]: unknown;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=rig-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rig-types.d.ts","sourceRoot":"","sources":["../src/rig-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IACvD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3C,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rig-types.js","sourceRoot":"","sources":["../src/rig-types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard HTTP server.
|
|
3
|
+
*
|
|
4
|
+
* Serves the web UI at / and REST API endpoints at /api/*.
|
|
5
|
+
* Uses only Node built-ins — no express or other dependencies.
|
|
6
|
+
*/
|
|
7
|
+
export interface DashboardServer {
|
|
8
|
+
port: number;
|
|
9
|
+
url: string;
|
|
10
|
+
close(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
export declare function startServer(port: number): Promise<DashboardServer>;
|
|
13
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiRH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA0BxE"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard HTTP server.
|
|
3
|
+
*
|
|
4
|
+
* Serves the web UI at / and REST API endpoints at /api/*.
|
|
5
|
+
* Uses only Node built-ins — no express or other dependencies.
|
|
6
|
+
*/
|
|
7
|
+
import http from 'node:http';
|
|
8
|
+
import { guild } from '@shardworks/nexus-core';
|
|
9
|
+
import { getDashboardHtml } from "./html.js";
|
|
10
|
+
// ── Helpers ───────────────────────────────────────────────────────
|
|
11
|
+
function json(res, data, status = 200) {
|
|
12
|
+
const body = JSON.stringify(data);
|
|
13
|
+
res.writeHead(status, {
|
|
14
|
+
'Content-Type': 'application/json',
|
|
15
|
+
'Content-Length': Buffer.byteLength(body),
|
|
16
|
+
'Cache-Control': 'no-cache',
|
|
17
|
+
});
|
|
18
|
+
res.end(body);
|
|
19
|
+
}
|
|
20
|
+
function error(res, msg, status = 500) {
|
|
21
|
+
res.writeHead(status, { 'Content-Type': 'text/plain' });
|
|
22
|
+
res.end(msg);
|
|
23
|
+
}
|
|
24
|
+
async function readBody(req) {
|
|
25
|
+
return new Promise((resolve, reject) => {
|
|
26
|
+
let raw = '';
|
|
27
|
+
req.on('data', chunk => { raw += chunk; });
|
|
28
|
+
req.on('end', () => {
|
|
29
|
+
try {
|
|
30
|
+
resolve(JSON.parse(raw || '{}'));
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
reject(new Error('Invalid JSON body'));
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
req.on('error', reject);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function parseQS(url) {
|
|
40
|
+
const qm = url.indexOf('?');
|
|
41
|
+
if (qm < 0)
|
|
42
|
+
return {};
|
|
43
|
+
return Object.fromEntries(new URLSearchParams(url.slice(qm + 1)));
|
|
44
|
+
}
|
|
45
|
+
function pathname(url) {
|
|
46
|
+
const qm = url.indexOf('?');
|
|
47
|
+
return qm < 0 ? url : url.slice(0, qm);
|
|
48
|
+
}
|
|
49
|
+
function tryApparatus(name) {
|
|
50
|
+
try {
|
|
51
|
+
return guild().apparatus(name);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// ── Request router ────────────────────────────────────────────────
|
|
58
|
+
async function handleRequest(req, res) {
|
|
59
|
+
const method = req.method ?? 'GET';
|
|
60
|
+
const path = pathname(req.url ?? '/');
|
|
61
|
+
const qs = parseQS(req.url ?? '');
|
|
62
|
+
// ── Web UI ──────────────────────────────────────────────────────
|
|
63
|
+
if (path === '/' || path === '/index.html') {
|
|
64
|
+
const html = getDashboardHtml();
|
|
65
|
+
res.writeHead(200, {
|
|
66
|
+
'Content-Type': 'text/html; charset=utf-8',
|
|
67
|
+
'Content-Length': Buffer.byteLength(html),
|
|
68
|
+
});
|
|
69
|
+
res.end(html);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// ── API: Overview ───────────────────────────────────────────────
|
|
73
|
+
if (path === '/api/overview' && method === 'GET') {
|
|
74
|
+
try {
|
|
75
|
+
const g = guild();
|
|
76
|
+
const config = g.guildConfig();
|
|
77
|
+
const plugins = [
|
|
78
|
+
...g.kits().map(k => ({ id: k.id, version: k.version, type: 'kit' })),
|
|
79
|
+
...g.apparatuses().map(a => ({ id: a.id, version: a.version, type: 'apparatus' })),
|
|
80
|
+
].sort((a, b) => a.id.localeCompare(b.id));
|
|
81
|
+
const counts = {};
|
|
82
|
+
const clerk = tryApparatus('clerk');
|
|
83
|
+
if (clerk) {
|
|
84
|
+
counts.writs = await clerk.count();
|
|
85
|
+
counts.ready = await clerk.count({ status: 'ready' });
|
|
86
|
+
counts.active = await clerk.count({ status: 'active' });
|
|
87
|
+
}
|
|
88
|
+
const stacks = tryApparatus('stacks');
|
|
89
|
+
if (stacks) {
|
|
90
|
+
try {
|
|
91
|
+
const sessions = stacks.readBook('animator', 'sessions');
|
|
92
|
+
counts.sessions = await sessions.count();
|
|
93
|
+
counts.runningSessions = await sessions.count([['status', '=', 'running']]);
|
|
94
|
+
}
|
|
95
|
+
catch { /* animator not installed */ }
|
|
96
|
+
try {
|
|
97
|
+
const rigs = stacks.readBook('walker', 'rigs');
|
|
98
|
+
counts.rigs = await rigs.count();
|
|
99
|
+
counts.runningRigs = await rigs.count([['status', '=', 'running']]);
|
|
100
|
+
}
|
|
101
|
+
catch { /* walker not installed */ }
|
|
102
|
+
}
|
|
103
|
+
const scriptorium = tryApparatus('codexes');
|
|
104
|
+
if (scriptorium) {
|
|
105
|
+
const codexList = await scriptorium.list();
|
|
106
|
+
counts.codexes = codexList.length;
|
|
107
|
+
counts.codexNames = codexList.map(c => c.name);
|
|
108
|
+
}
|
|
109
|
+
json(res, { guild: config, plugins, counts });
|
|
110
|
+
}
|
|
111
|
+
catch (e) {
|
|
112
|
+
error(res, e.message);
|
|
113
|
+
}
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
// ── API: Writs ──────────────────────────────────────────────────
|
|
117
|
+
if (path === '/api/writs' && method === 'GET') {
|
|
118
|
+
const clerk = tryApparatus('clerk');
|
|
119
|
+
if (!clerk) {
|
|
120
|
+
error(res, 'Clerk apparatus not installed', 404);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
try {
|
|
124
|
+
const filters = {};
|
|
125
|
+
if (qs.status)
|
|
126
|
+
filters.status = qs.status;
|
|
127
|
+
if (qs.type)
|
|
128
|
+
filters.type = qs.type;
|
|
129
|
+
filters.limit = qs.limit ? parseInt(qs.limit, 10) : 20;
|
|
130
|
+
filters.offset = qs.offset ? parseInt(qs.offset, 10) : 0;
|
|
131
|
+
const [writs, total] = await Promise.all([
|
|
132
|
+
clerk.list(filters),
|
|
133
|
+
clerk.count({ status: filters.status, type: filters.type }),
|
|
134
|
+
]);
|
|
135
|
+
// Derive declared types from guild config
|
|
136
|
+
const clerkConfig = guild().guildConfig().clerk;
|
|
137
|
+
const types = ['mandate', ...(clerkConfig?.writTypes?.map(t => t.name) ?? [])];
|
|
138
|
+
json(res, { writs, total, types });
|
|
139
|
+
}
|
|
140
|
+
catch (e) {
|
|
141
|
+
error(res, e.message);
|
|
142
|
+
}
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
if (path === '/api/writs' && method === 'POST') {
|
|
146
|
+
const clerk = tryApparatus('clerk');
|
|
147
|
+
if (!clerk) {
|
|
148
|
+
error(res, 'Clerk apparatus not installed', 404);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
try {
|
|
152
|
+
const body = await readBody(req);
|
|
153
|
+
const writ = await clerk.post({
|
|
154
|
+
title: body.title,
|
|
155
|
+
body: body.body,
|
|
156
|
+
...(body.type ? { type: body.type } : {}),
|
|
157
|
+
...(body.codex ? { codex: body.codex } : {}),
|
|
158
|
+
});
|
|
159
|
+
json(res, writ, 201);
|
|
160
|
+
}
|
|
161
|
+
catch (e) {
|
|
162
|
+
error(res, e.message, 400);
|
|
163
|
+
}
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
// ── API: Writ transition ─────────────────────────────────────────
|
|
167
|
+
const transMatch = path.match(/^\/api\/writs\/([^/]+)\/transition$/);
|
|
168
|
+
if (transMatch && method === 'POST') {
|
|
169
|
+
const clerk = tryApparatus('clerk');
|
|
170
|
+
if (!clerk) {
|
|
171
|
+
error(res, 'Clerk apparatus not installed', 404);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
try {
|
|
175
|
+
const id = transMatch[1];
|
|
176
|
+
const body = await readBody(req);
|
|
177
|
+
const fields = {};
|
|
178
|
+
if (body.resolution)
|
|
179
|
+
fields.resolution = body.resolution;
|
|
180
|
+
const writ = await clerk.transition(id, body.to, Object.keys(fields).length ? fields : undefined);
|
|
181
|
+
json(res, writ);
|
|
182
|
+
}
|
|
183
|
+
catch (e) {
|
|
184
|
+
error(res, e.message, 400);
|
|
185
|
+
}
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
// ── API: Sessions ────────────────────────────────────────────────
|
|
189
|
+
if (path === '/api/sessions' && method === 'GET') {
|
|
190
|
+
const stacks = tryApparatus('stacks');
|
|
191
|
+
if (!stacks) {
|
|
192
|
+
json(res, { sessions: [], total: 0 });
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
try {
|
|
196
|
+
const sessions = stacks.readBook('animator', 'sessions');
|
|
197
|
+
const limit = qs.limit ? parseInt(qs.limit, 10) : 20;
|
|
198
|
+
const offset = qs.offset ? parseInt(qs.offset, 10) : 0;
|
|
199
|
+
const where = qs.status
|
|
200
|
+
? [['status', '=', qs.status]]
|
|
201
|
+
: undefined;
|
|
202
|
+
const [rows, total] = await Promise.all([
|
|
203
|
+
sessions.find({ where, orderBy: ['startedAt', 'desc'], limit, offset }),
|
|
204
|
+
sessions.count(where),
|
|
205
|
+
]);
|
|
206
|
+
json(res, { sessions: rows, total });
|
|
207
|
+
}
|
|
208
|
+
catch (e) {
|
|
209
|
+
json(res, { sessions: [], total: 0 });
|
|
210
|
+
}
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
// ── API: Rigs ────────────────────────────────────────────────────
|
|
214
|
+
if (path === '/api/rigs' && method === 'GET') {
|
|
215
|
+
const stacks = tryApparatus('stacks');
|
|
216
|
+
if (!stacks) {
|
|
217
|
+
json(res, { rigs: [] });
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
try {
|
|
221
|
+
const rigs = stacks.readBook('walker', 'rigs');
|
|
222
|
+
const where = qs.status
|
|
223
|
+
? [['status', '=', qs.status]]
|
|
224
|
+
: undefined;
|
|
225
|
+
const rows = await rigs.find({
|
|
226
|
+
where,
|
|
227
|
+
orderBy: ['id', 'desc'],
|
|
228
|
+
limit: 100,
|
|
229
|
+
});
|
|
230
|
+
json(res, { rigs: rows });
|
|
231
|
+
}
|
|
232
|
+
catch (e) {
|
|
233
|
+
json(res, { rigs: [] });
|
|
234
|
+
}
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
// ── API: Codexes ─────────────────────────────────────────────────
|
|
238
|
+
if (path === '/api/codexes' && method === 'GET') {
|
|
239
|
+
const scriptorium = tryApparatus('codexes');
|
|
240
|
+
if (!scriptorium) {
|
|
241
|
+
json(res, { codexes: [], drafts: [] });
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
try {
|
|
245
|
+
const [codexes, drafts] = await Promise.all([
|
|
246
|
+
scriptorium.list(),
|
|
247
|
+
scriptorium.listDrafts(),
|
|
248
|
+
]);
|
|
249
|
+
json(res, { codexes, drafts });
|
|
250
|
+
}
|
|
251
|
+
catch (e) {
|
|
252
|
+
error(res, e.message);
|
|
253
|
+
}
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
// ── 404 ──────────────────────────────────────────────────────────
|
|
257
|
+
error(res, 'Not found', 404);
|
|
258
|
+
}
|
|
259
|
+
export async function startServer(port) {
|
|
260
|
+
const server = http.createServer(async (req, res) => {
|
|
261
|
+
try {
|
|
262
|
+
await handleRequest(req, res);
|
|
263
|
+
}
|
|
264
|
+
catch (e) {
|
|
265
|
+
if (!res.headersSent) {
|
|
266
|
+
error(res, e.message ?? 'Internal error');
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
await new Promise((resolve, reject) => {
|
|
271
|
+
server.listen(port, '127.0.0.1', resolve);
|
|
272
|
+
server.once('error', reject);
|
|
273
|
+
});
|
|
274
|
+
const addr = server.address();
|
|
275
|
+
const actualPort = addr.port;
|
|
276
|
+
return {
|
|
277
|
+
port: actualPort,
|
|
278
|
+
url: `http://127.0.0.1:${actualPort}`,
|
|
279
|
+
close: () => new Promise((resolve, reject) => {
|
|
280
|
+
server.close(err => err ? reject(err) : resolve());
|
|
281
|
+
}),
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/tool.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dashboard-start tool — CLI-only.
|
|
3
|
+
*
|
|
4
|
+
* Starts the web dashboard server and opens the browser.
|
|
5
|
+
* Runs until the process is interrupted (Ctrl+C).
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
export declare const dashboardStart: import("@shardworks/tools-apparatus").ToolDefinition<{
|
|
9
|
+
port: z.ZodOptional<z.ZodNumber>;
|
|
10
|
+
'no-open': z.ZodOptional<z.ZodBoolean>;
|
|
11
|
+
}>;
|
|
12
|
+
//# sourceMappingURL=tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,cAAc;;;EAiDzB,CAAC"}
|
package/dist/tool.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dashboard-start tool — CLI-only.
|
|
3
|
+
*
|
|
4
|
+
* Starts the web dashboard server and opens the browser.
|
|
5
|
+
* Runs until the process is interrupted (Ctrl+C).
|
|
6
|
+
*/
|
|
7
|
+
import { execSync } from 'node:child_process';
|
|
8
|
+
import process from 'node:process';
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import { tool } from '@shardworks/tools-apparatus';
|
|
11
|
+
import { startServer } from "./server.js";
|
|
12
|
+
export const dashboardStart = tool({
|
|
13
|
+
name: 'dashboard-start',
|
|
14
|
+
description: 'Start the guild web dashboard. Opens a browser and serves a live operations UI.',
|
|
15
|
+
callableBy: ['cli'],
|
|
16
|
+
params: {
|
|
17
|
+
port: z
|
|
18
|
+
.number()
|
|
19
|
+
.int()
|
|
20
|
+
.min(1024)
|
|
21
|
+
.max(65535)
|
|
22
|
+
.optional()
|
|
23
|
+
.describe('Port to listen on (default: 4242)'),
|
|
24
|
+
'no-open': z
|
|
25
|
+
.boolean()
|
|
26
|
+
.optional()
|
|
27
|
+
.describe('Skip opening the browser automatically'),
|
|
28
|
+
},
|
|
29
|
+
handler: async ({ port: portArg, 'no-open': noOpen }) => {
|
|
30
|
+
const port = portArg ?? 4242;
|
|
31
|
+
const server = await startServer(port);
|
|
32
|
+
const url = server.url;
|
|
33
|
+
console.log('');
|
|
34
|
+
console.log(' Guild Dashboard running at:');
|
|
35
|
+
console.log('');
|
|
36
|
+
console.log(' ' + url);
|
|
37
|
+
console.log('');
|
|
38
|
+
console.log(' Press Ctrl+C to stop.');
|
|
39
|
+
console.log('');
|
|
40
|
+
if (!noOpen) {
|
|
41
|
+
try {
|
|
42
|
+
const platform = process.platform;
|
|
43
|
+
if (platform === 'darwin')
|
|
44
|
+
execSync('open ' + url, { stdio: 'ignore' });
|
|
45
|
+
else if (platform === 'win32')
|
|
46
|
+
execSync('start "" ' + url, { stdio: 'ignore', shell: 'cmd.exe' });
|
|
47
|
+
else
|
|
48
|
+
execSync('xdg-open ' + url + ' 2>/dev/null; true', { stdio: 'ignore', shell: '/bin/sh' });
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Browser open is best-effort; ignore errors
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Keep the process alive until Ctrl+C
|
|
55
|
+
await new Promise(resolve => {
|
|
56
|
+
process.once('SIGINT', async () => { await server.close(); resolve(); });
|
|
57
|
+
process.once('SIGTERM', async () => { await server.close(); resolve(); });
|
|
58
|
+
});
|
|
59
|
+
return { status: 'stopped', url };
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
//# sourceMappingURL=tool.js.map
|
package/dist/tool.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;IACjC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,iFAAiF;IAC9F,UAAU,EAAE,CAAC,KAAK,CAAC;IACnB,MAAM,EAAE;QACN,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,GAAG,EAAE;aACL,GAAG,CAAC,IAAI,CAAC;aACT,GAAG,CAAC,KAAK,CAAC;aACV,QAAQ,EAAE;aACV,QAAQ,CAAC,mCAAmC,CAAC;QAChD,SAAS,EAAE,CAAC;aACT,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CAAC,wCAAwC,CAAC;KACtD;IACD,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE;QACtD,MAAM,IAAI,GAAG,OAAO,IAAI,IAAI,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QAEvB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;gBAClC,IAAI,QAAQ,KAAK,QAAQ;oBAAG,QAAQ,CAAC,OAAO,GAAG,GAAG,EAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;qBACtE,IAAI,QAAQ,KAAK,OAAO;oBAAE,QAAQ,CAAC,WAAW,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;;oBAC7F,QAAQ,CAAC,WAAW,GAAG,GAAG,GAAG,oBAAoB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YACjG,CAAC;YAAC,MAAM,CAAC;gBACP,6CAA6C;YAC/C,CAAC;QACH,CAAC;QAED,sCAAsC;QACtC,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;YAChC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAG,KAAK,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1E,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;IACpC,CAAC;CACF,CAAC,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local type stubs for apparatus documents read via Stacks readBook().
|
|
3
|
+
* These mirror the shapes declared by the respective apparatus packages
|
|
4
|
+
* without importing from them (to keep dashboard dependencies minimal).
|
|
5
|
+
*/
|
|
6
|
+
/** Minimal shape of a session document from the Animator's sessions book. */
|
|
7
|
+
export interface SessionDoc {
|
|
8
|
+
id: string;
|
|
9
|
+
status: 'running' | 'completed' | 'failed' | 'timeout';
|
|
10
|
+
startedAt: string;
|
|
11
|
+
endedAt?: string;
|
|
12
|
+
durationMs?: number;
|
|
13
|
+
provider: string;
|
|
14
|
+
exitCode?: number;
|
|
15
|
+
error?: string;
|
|
16
|
+
conversationId?: string;
|
|
17
|
+
providerSessionId?: string;
|
|
18
|
+
tokenUsage?: {
|
|
19
|
+
inputTokens: number;
|
|
20
|
+
outputTokens: number;
|
|
21
|
+
cacheReadTokens?: number;
|
|
22
|
+
cacheWriteTokens?: number;
|
|
23
|
+
};
|
|
24
|
+
costUsd?: number;
|
|
25
|
+
metadata?: Record<string, unknown>;
|
|
26
|
+
output?: string;
|
|
27
|
+
[key: string]: unknown;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,6EAA6E;AAC7E,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE;QACX,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local type stubs for apparatus documents read via Stacks readBook().
|
|
3
|
+
* These mirror the shapes declared by the respective apparatus packages
|
|
4
|
+
* without importing from them (to keep dashboard dependencies minimal).
|
|
5
|
+
*/
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@shardworks/dashboard-apparatus",
|
|
3
|
+
"version": "0.1.113",
|
|
4
|
+
"license": "ISC",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "https://github.com/shardworks/nexus",
|
|
8
|
+
"directory": "packages/plugins/dashboard"
|
|
9
|
+
},
|
|
10
|
+
"description": "The Dashboard — web-based guild operations dashboard apparatus",
|
|
11
|
+
"type": "module",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"import": "./dist/index.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"zod": "4.3.6",
|
|
20
|
+
"@shardworks/clerk-apparatus": "0.1.113",
|
|
21
|
+
"@shardworks/nexus-core": "0.1.113",
|
|
22
|
+
"@shardworks/stacks-apparatus": "0.1.113",
|
|
23
|
+
"@shardworks/tools-apparatus": "0.1.113"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@types/node": "25.5.0"
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"dist"
|
|
30
|
+
],
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "tsc",
|
|
33
|
+
"typecheck": "tsc --noEmit"
|
|
34
|
+
}
|
|
35
|
+
}
|