reflectt-node 0.1.4 β 0.1.5
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/README.md +60 -151
- package/dist/alert-preflight.d.ts +28 -0
- package/dist/alert-preflight.d.ts.map +1 -1
- package/dist/alert-preflight.js +178 -0
- package/dist/alert-preflight.js.map +1 -1
- package/dist/boardHealthWorker.d.ts.map +1 -1
- package/dist/boardHealthWorker.js +25 -12
- package/dist/boardHealthWorker.js.map +1 -1
- package/dist/chat-approval-detector.d.ts.map +1 -1
- package/dist/chat-approval-detector.js +29 -11
- package/dist/chat-approval-detector.js.map +1 -1
- package/dist/chat.d.ts +1 -0
- package/dist/chat.d.ts.map +1 -1
- package/dist/chat.js +14 -3
- package/dist/chat.js.map +1 -1
- package/dist/cli.js +187 -22
- package/dist/cli.js.map +1 -1
- package/dist/cloud.d.ts +28 -1
- package/dist/cloud.d.ts.map +1 -1
- package/dist/cloud.js +55 -20
- package/dist/cloud.js.map +1 -1
- package/dist/compliance-detector.d.ts +42 -0
- package/dist/compliance-detector.d.ts.map +1 -0
- package/dist/compliance-detector.js +286 -0
- package/dist/compliance-detector.js.map +1 -0
- package/dist/continuity-loop.d.ts.map +1 -1
- package/dist/continuity-loop.js +7 -3
- package/dist/continuity-loop.js.map +1 -1
- package/dist/dashboard.d.ts +6 -2
- package/dist/dashboard.d.ts.map +1 -1
- package/dist/dashboard.js +55 -26
- package/dist/dashboard.js.map +1 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +17 -6
- package/dist/doctor.js.map +1 -1
- package/dist/executionSweeper.d.ts.map +1 -1
- package/dist/executionSweeper.js +12 -0
- package/dist/executionSweeper.js.map +1 -1
- package/dist/health.d.ts.map +1 -1
- package/dist/health.js +30 -7
- package/dist/health.js.map +1 -1
- package/dist/hostConnectGuard.d.ts +25 -0
- package/dist/hostConnectGuard.d.ts.map +1 -0
- package/dist/hostConnectGuard.js +27 -0
- package/dist/hostConnectGuard.js.map +1 -0
- package/dist/index.js +144 -29
- package/dist/index.js.map +1 -1
- package/dist/insight-task-bridge.d.ts +1 -1
- package/dist/insight-task-bridge.d.ts.map +1 -1
- package/dist/insight-task-bridge.js +6 -3
- package/dist/insight-task-bridge.js.map +1 -1
- package/dist/mcp.js +6 -6
- package/dist/mcp.js.map +1 -1
- package/dist/notificationDedupeGuard.d.ts +33 -0
- package/dist/notificationDedupeGuard.d.ts.map +1 -0
- package/dist/notificationDedupeGuard.js +88 -0
- package/dist/notificationDedupeGuard.js.map +1 -0
- package/dist/policy.d.ts +1 -1
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +3 -1
- package/dist/policy.js.map +1 -1
- package/dist/reflection-automation.d.ts.map +1 -1
- package/dist/reflection-automation.js +38 -0
- package/dist/reflection-automation.js.map +1 -1
- package/dist/request-tracker.d.ts +6 -0
- package/dist/request-tracker.d.ts.map +1 -1
- package/dist/request-tracker.js +31 -12
- package/dist/request-tracker.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +242 -57
- package/dist/server.js.map +1 -1
- package/dist/service-probe.d.ts.map +1 -1
- package/dist/service-probe.js +39 -2
- package/dist/service-probe.js.map +1 -1
- package/dist/shipped-heartbeat.d.ts +1 -1
- package/dist/shipped-heartbeat.js +1 -1
- package/dist/taskPrecheck.js +6 -6
- package/dist/taskPrecheck.js.map +1 -1
- package/dist/tasks.d.ts +1 -1
- package/dist/tasks.d.ts.map +1 -1
- package/dist/tasks.js +8 -5
- package/dist/tasks.js.map +1 -1
- package/dist/todoHoardingGuard.d.ts +35 -0
- package/dist/todoHoardingGuard.d.ts.map +1 -0
- package/dist/todoHoardingGuard.js +150 -0
- package/dist/todoHoardingGuard.js.map +1 -0
- package/dist/types.d.ts +2 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/working-contract.d.ts.map +1 -1
- package/dist/working-contract.js +59 -3
- package/dist/working-contract.js.map +1 -1
- package/package.json +1 -1
- package/public/dashboard.js +75 -19
- package/public/docs.md +17 -2
- package/public/polls-mock.html +1 -1
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) Reflectt AI
|
|
3
|
+
/**
|
|
4
|
+
* Session Compliance Detector
|
|
5
|
+
*
|
|
6
|
+
* Implements the state-read-before-assertion rule:
|
|
7
|
+
* Every triggering action (task create, status transition, review, reflection)
|
|
8
|
+
* must be preceded by at least one qualifying state read within the session window.
|
|
9
|
+
*
|
|
10
|
+
* Based on: docs/compliance-spec-state-reads.md
|
|
11
|
+
* Task: task-1772609696194-1i9s775yl
|
|
12
|
+
*
|
|
13
|
+
* Phase 1: API-layer triggers only.
|
|
14
|
+
* Phase 2 (future): chat assertion detection.
|
|
15
|
+
*
|
|
16
|
+
* Flag, do not block. Observability-first.
|
|
17
|
+
*/
|
|
18
|
+
import { getDb } from './db.js';
|
|
19
|
+
// ββ Constants ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
20
|
+
/** Normal session window (ms) */
|
|
21
|
+
const WINDOW_NORMAL_MS = 10 * 60 * 1000;
|
|
22
|
+
/** Long-running task session window (ms) */
|
|
23
|
+
const WINDOW_LONG_MS = 30 * 60 * 1000;
|
|
24
|
+
/** Heartbeat-triggered session window (ms) */
|
|
25
|
+
const WINDOW_HEARTBEAT_MS = 5 * 60 * 1000;
|
|
26
|
+
// Sessions keyed by: `${agent}:${bucketId}` where bucketId is 30-min bucket
|
|
27
|
+
const sessions = new Map();
|
|
28
|
+
function getBucketId(now) {
|
|
29
|
+
// 30-minute buckets
|
|
30
|
+
return String(Math.floor(now / WINDOW_LONG_MS));
|
|
31
|
+
}
|
|
32
|
+
function getSessionKey(agent, now) {
|
|
33
|
+
return `${agent.toLowerCase()}:${getBucketId(now)}`;
|
|
34
|
+
}
|
|
35
|
+
function getOrCreateSession(agent, now) {
|
|
36
|
+
const key = getSessionKey(agent, now);
|
|
37
|
+
if (!sessions.has(key)) {
|
|
38
|
+
// Carry forward the most recent state read from the previous bucket,
|
|
39
|
+
// so reads near a bucket boundary don't lose their validity window.
|
|
40
|
+
const prevKey = `${agent.toLowerCase()}:${String(Number(getBucketId(now)) - 1)}`;
|
|
41
|
+
const prev = sessions.get(prevKey);
|
|
42
|
+
sessions.set(key, {
|
|
43
|
+
lastStateReadAt: prev?.lastStateReadAt ?? null,
|
|
44
|
+
lastReadWasHeartbeat: prev?.lastReadWasHeartbeat ?? false,
|
|
45
|
+
hasActiveTask: prev?.hasActiveTask ?? false,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
// Clean stale sessions (older than 2 buckets)
|
|
49
|
+
cleanStaleSessions(now);
|
|
50
|
+
return sessions.get(key);
|
|
51
|
+
}
|
|
52
|
+
function cleanStaleSessions(now) {
|
|
53
|
+
const currentBucket = getBucketId(now);
|
|
54
|
+
const prevBucket = String(Number(currentBucket) - 1);
|
|
55
|
+
for (const key of sessions.keys()) {
|
|
56
|
+
const bucket = key.split(':')[1];
|
|
57
|
+
if (bucket !== currentBucket && bucket !== prevBucket) {
|
|
58
|
+
sessions.delete(key);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// ββ State read registry ββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
63
|
+
/** URL patterns that count as qualifying state reads */
|
|
64
|
+
const STATE_READ_PATTERNS = [
|
|
65
|
+
{ pattern: /^GET \/heartbeat\/[^/]+$/, isHeartbeat: true },
|
|
66
|
+
{ pattern: /^GET \/tasks\/active($|\?)/, isHeartbeat: false },
|
|
67
|
+
{ pattern: /^GET \/tasks\/next($|\?)/, isHeartbeat: false },
|
|
68
|
+
{ pattern: /^GET \/tasks($|\?)/, isHeartbeat: false },
|
|
69
|
+
{ pattern: /^GET \/tasks\/[^/]+($|\?)/, isHeartbeat: false },
|
|
70
|
+
{ pattern: /^GET \/chat\/messages($|\?)/, isHeartbeat: false },
|
|
71
|
+
{ pattern: /^GET \/inbox\/[^/]+($|\?)/, isHeartbeat: false },
|
|
72
|
+
{ pattern: /^GET \/me\/[^/]+($|\?)/, isHeartbeat: false },
|
|
73
|
+
];
|
|
74
|
+
/** URL + method patterns that count as triggering actions */
|
|
75
|
+
const TRIGGERING_PATTERNS = [
|
|
76
|
+
{ pattern: /^POST \/tasks($|\?)/, label: 'POST /tasks' },
|
|
77
|
+
{ pattern: /^PATCH \/tasks\/[^/]+($|\?)/, label: 'PATCH /tasks/:id' },
|
|
78
|
+
{ pattern: /^POST \/tasks\/[^/]+\/review($|\?)/, label: 'POST /tasks/:id/review' },
|
|
79
|
+
{ pattern: /^POST \/reflections($|\?)/, label: 'POST /reflections' },
|
|
80
|
+
// Note: POST /tasks/:id/comments is NOT a Phase 1 trigger.
|
|
81
|
+
// Phase 2 will add chat assertion detection for comments with status claims.
|
|
82
|
+
];
|
|
83
|
+
function isStateRead(method, path) {
|
|
84
|
+
const key = `${method.toUpperCase()} ${path.split('?')[0]}`;
|
|
85
|
+
for (const { pattern, isHeartbeat } of STATE_READ_PATTERNS) {
|
|
86
|
+
if (pattern.test(key))
|
|
87
|
+
return { isRead: true, isHeartbeat };
|
|
88
|
+
}
|
|
89
|
+
return { isRead: false, isHeartbeat: false };
|
|
90
|
+
}
|
|
91
|
+
function isTriggeringAction(method, path) {
|
|
92
|
+
const key = `${method.toUpperCase()} ${path.split('?')[0]}`;
|
|
93
|
+
for (const { pattern, label } of TRIGGERING_PATTERNS) {
|
|
94
|
+
if (pattern.test(key))
|
|
95
|
+
return label;
|
|
96
|
+
}
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
// ββ Agent extraction βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
100
|
+
/**
|
|
101
|
+
* Extract agent name from request context.
|
|
102
|
+
* Tries: URL params, query params, body, from header.
|
|
103
|
+
*/
|
|
104
|
+
export function extractAgent(method, url, query, body, headers) {
|
|
105
|
+
// URL param patterns: /heartbeat/:agent, /inbox/:agent, /me/:agent
|
|
106
|
+
const urlMatch = url.match(/\/(?:heartbeat|inbox|me)\/([a-z][a-z0-9_-]*)(?:\/|\?|$)/i);
|
|
107
|
+
if (urlMatch)
|
|
108
|
+
return urlMatch[1].toLowerCase();
|
|
109
|
+
// Query param: agent=
|
|
110
|
+
if (query.agent && typeof query.agent === 'string')
|
|
111
|
+
return query.agent.toLowerCase();
|
|
112
|
+
// Body: from, agent, assignee
|
|
113
|
+
if (body && typeof body === 'object') {
|
|
114
|
+
const b = body;
|
|
115
|
+
const candidate = b.from ?? b.agent ?? b.assignee;
|
|
116
|
+
if (typeof candidate === 'string' && candidate.length > 0)
|
|
117
|
+
return candidate.toLowerCase();
|
|
118
|
+
}
|
|
119
|
+
// Header: x-agent-id
|
|
120
|
+
const agentHeader = headers['x-agent-id'];
|
|
121
|
+
if (typeof agentHeader === 'string')
|
|
122
|
+
return agentHeader.toLowerCase();
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
// ββ DB setup βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
126
|
+
let dbReady = false;
|
|
127
|
+
function ensureTable() {
|
|
128
|
+
if (dbReady)
|
|
129
|
+
return;
|
|
130
|
+
try {
|
|
131
|
+
const db = getDb();
|
|
132
|
+
db.exec(`
|
|
133
|
+
CREATE TABLE IF NOT EXISTS compliance_violations (
|
|
134
|
+
id TEXT PRIMARY KEY,
|
|
135
|
+
agent TEXT NOT NULL,
|
|
136
|
+
session_id TEXT NOT NULL,
|
|
137
|
+
violation_type TEXT NOT NULL,
|
|
138
|
+
severity TEXT NOT NULL,
|
|
139
|
+
triggering_call TEXT NOT NULL,
|
|
140
|
+
last_state_read_at INTEGER,
|
|
141
|
+
window_elapsed_ms INTEGER,
|
|
142
|
+
window_used_ms INTEGER NOT NULL,
|
|
143
|
+
detected_at INTEGER NOT NULL
|
|
144
|
+
);
|
|
145
|
+
CREATE INDEX IF NOT EXISTS idx_compliance_violations_agent ON compliance_violations(agent);
|
|
146
|
+
CREATE INDEX IF NOT EXISTS idx_compliance_violations_detected_at ON compliance_violations(detected_at);
|
|
147
|
+
`);
|
|
148
|
+
dbReady = true;
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// DB not available (e.g. test env) β run in degraded mode
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
function persistViolation(v) {
|
|
155
|
+
try {
|
|
156
|
+
const db = getDb();
|
|
157
|
+
db.prepare(`
|
|
158
|
+
INSERT OR REPLACE INTO compliance_violations
|
|
159
|
+
(id, agent, session_id, violation_type, severity, triggering_call,
|
|
160
|
+
last_state_read_at, window_elapsed_ms, window_used_ms, detected_at)
|
|
161
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
162
|
+
`).run(v.id, v.agent, v.session_id, v.violation_type, v.severity, v.triggering_call, v.last_state_read_at, v.window_elapsed_ms, v.window_used_ms, v.detected_at);
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// Silent β never block a request due to compliance logging failure
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// ββ Core detector ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
169
|
+
/**
|
|
170
|
+
* Called for every request that completes successfully (statusCode < 400).
|
|
171
|
+
* Records state reads and checks triggering actions for compliance.
|
|
172
|
+
*/
|
|
173
|
+
export function processRequest(method, url, statusCode, query, body, headers, now = Date.now()) {
|
|
174
|
+
// Only track successful requests
|
|
175
|
+
if (statusCode >= 400)
|
|
176
|
+
return null;
|
|
177
|
+
const agent = extractAgent(method, url, query, body, headers);
|
|
178
|
+
if (!agent)
|
|
179
|
+
return null;
|
|
180
|
+
// Skip system/watchdog agents
|
|
181
|
+
if (['system', 'watchdog', 'openai'].includes(agent))
|
|
182
|
+
return null;
|
|
183
|
+
ensureTable();
|
|
184
|
+
const path = url.split('?')[0];
|
|
185
|
+
const session = getOrCreateSession(agent, now);
|
|
186
|
+
const sessionId = getSessionKey(agent, now);
|
|
187
|
+
// Record state read
|
|
188
|
+
const { isRead, isHeartbeat } = isStateRead(method, path);
|
|
189
|
+
if (isRead) {
|
|
190
|
+
session.lastStateReadAt = now;
|
|
191
|
+
session.lastReadWasHeartbeat = isHeartbeat;
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
194
|
+
// Check triggering action
|
|
195
|
+
const triggerLabel = isTriggeringAction(method, path);
|
|
196
|
+
if (!triggerLabel)
|
|
197
|
+
return null;
|
|
198
|
+
// Determine window
|
|
199
|
+
const windowMs = session.lastReadWasHeartbeat
|
|
200
|
+
? WINDOW_HEARTBEAT_MS
|
|
201
|
+
: session.hasActiveTask
|
|
202
|
+
? WINDOW_LONG_MS
|
|
203
|
+
: WINDOW_NORMAL_MS;
|
|
204
|
+
const lastReadAt = session.lastStateReadAt;
|
|
205
|
+
const windowElapsedMs = lastReadAt !== null ? now - lastReadAt : null;
|
|
206
|
+
// Evaluate violation
|
|
207
|
+
let violationType = null;
|
|
208
|
+
let severity = 'medium';
|
|
209
|
+
if (lastReadAt === null) {
|
|
210
|
+
// No state read at all this session
|
|
211
|
+
violationType = 'no_state_read_before_action';
|
|
212
|
+
severity = 'high';
|
|
213
|
+
}
|
|
214
|
+
else if (windowElapsedMs !== null && windowElapsedMs > windowMs) {
|
|
215
|
+
// State read exists but window expired
|
|
216
|
+
violationType = 'stale_state_read';
|
|
217
|
+
severity = 'medium';
|
|
218
|
+
}
|
|
219
|
+
if (!violationType)
|
|
220
|
+
return null;
|
|
221
|
+
const violation = {
|
|
222
|
+
id: `cv-${now}-${Math.random().toString(36).slice(2, 9)}`,
|
|
223
|
+
agent,
|
|
224
|
+
session_id: sessionId,
|
|
225
|
+
violation_type: violationType,
|
|
226
|
+
severity,
|
|
227
|
+
triggering_call: triggerLabel,
|
|
228
|
+
last_state_read_at: lastReadAt,
|
|
229
|
+
window_elapsed_ms: windowElapsedMs,
|
|
230
|
+
window_used_ms: windowMs,
|
|
231
|
+
detected_at: now,
|
|
232
|
+
};
|
|
233
|
+
persistViolation(violation);
|
|
234
|
+
return violation;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Mark a session as having an active doing task (extends window to 30 min).
|
|
238
|
+
*/
|
|
239
|
+
export function setSessionHasActiveTask(agent, hasTask, now = Date.now()) {
|
|
240
|
+
const session = getOrCreateSession(agent, now);
|
|
241
|
+
session.hasActiveTask = hasTask;
|
|
242
|
+
}
|
|
243
|
+
export function queryViolations(opts = {}) {
|
|
244
|
+
try {
|
|
245
|
+
const db = getDb();
|
|
246
|
+
ensureTable();
|
|
247
|
+
const { agent, severity, limit = 100, since } = opts;
|
|
248
|
+
const conditions = [];
|
|
249
|
+
const params = [];
|
|
250
|
+
if (agent) {
|
|
251
|
+
conditions.push('agent = ?');
|
|
252
|
+
params.push(agent.toLowerCase());
|
|
253
|
+
}
|
|
254
|
+
if (severity) {
|
|
255
|
+
conditions.push('severity = ?');
|
|
256
|
+
params.push(severity);
|
|
257
|
+
}
|
|
258
|
+
if (since) {
|
|
259
|
+
conditions.push('detected_at >= ?');
|
|
260
|
+
params.push(since);
|
|
261
|
+
}
|
|
262
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
263
|
+
const rows = db.prepare(`SELECT * FROM compliance_violations ${where} ORDER BY detected_at DESC LIMIT ?`).all(...params, limit);
|
|
264
|
+
return rows;
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
return [];
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
export function getViolationSummary(since) {
|
|
271
|
+
const cutoff = since ?? (Date.now() - 24 * 60 * 60 * 1000); // default 24h
|
|
272
|
+
const violations = queryViolations({ since: cutoff, limit: 10_000 });
|
|
273
|
+
const byAgent = {};
|
|
274
|
+
const bySeverity = {};
|
|
275
|
+
for (const v of violations) {
|
|
276
|
+
byAgent[v.agent] = (byAgent[v.agent] ?? 0) + 1;
|
|
277
|
+
bySeverity[v.severity] = (bySeverity[v.severity] ?? 0) + 1;
|
|
278
|
+
}
|
|
279
|
+
return {
|
|
280
|
+
total: violations.length,
|
|
281
|
+
byAgent,
|
|
282
|
+
bySeverity,
|
|
283
|
+
sinceMs: cutoff,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=compliance-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compliance-detector.js","sourceRoot":"","sources":["../src/compliance-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"continuity-loop.d.ts","sourceRoot":"","sources":["../src/continuity-loop.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,iBAAiB,GAAG,kBAAkB,GAAG,4BAA4B,GAAG,eAAe,CAAA;IAC7F,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAA;IAChB,oEAAoE;IACpE,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAA;IAChB,2DAA2D;IAC3D,kBAAkB,EAAE,MAAM,CAAA;IAC1B,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAA;IACnB,+CAA+C;IAC/C,eAAe,EAAE,MAAM,CAAA;IACvB,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,MAAM,CAAA;IACxB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,iBAAiB,EAAE,MAAM,CAAA;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAiBD,wBAAgB,0BAA0B,IAAI,IAAI,CAejD;AAqCD;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC;IAClD,OAAO,EAAE,gBAAgB,EAAE,CAAA;IAC3B,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAC,
|
|
1
|
+
{"version":3,"file":"continuity-loop.d.ts","sourceRoot":"","sources":["../src/continuity-loop.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,iBAAiB,GAAG,kBAAkB,GAAG,4BAA4B,GAAG,eAAe,CAAA;IAC7F,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAA;IAChB,oEAAoE;IACpE,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAA;IAChB,2DAA2D;IAC3D,kBAAkB,EAAE,MAAM,CAAA;IAC1B,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAA;IACnB,+CAA+C;IAC/C,eAAe,EAAE,MAAM,CAAA;IACvB,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,MAAM,CAAA;IACxB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,iBAAiB,EAAE,MAAM,CAAA;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAiBD,wBAAgB,0BAA0B,IAAI,IAAI,CAejD;AAqCD;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC;IAClD,OAAO,EAAE,gBAAgB,EAAE,CAAA;IAC3B,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAC,CA0FD;AAuED,wBAAgB,kBAAkB,IAAI,eAAe,CAEpD;AAED,wBAAgB,qBAAqB,CAAC,KAAK,SAAK,GAAG,gBAAgB,EAAE,CAEpE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,gBAAgB,EAAE,CAmB1H;AAID,wBAAgB,qBAAqB,IAAI,IAAI,CAU5C"}
|
package/dist/continuity-loop.js
CHANGED
|
@@ -86,15 +86,19 @@ function getConfig() {
|
|
|
86
86
|
*/
|
|
87
87
|
export async function tickContinuityLoop() {
|
|
88
88
|
const config = getConfig();
|
|
89
|
+
const now = Date.now();
|
|
90
|
+
// Always record the tick when the loop is enabled so /continuity/stats reflects
|
|
91
|
+
// real scheduler activity even on no-op cycles (e.g. zero agents configured).
|
|
92
|
+
if (config.enabled) {
|
|
93
|
+
stats.cyclesRun++;
|
|
94
|
+
stats.lastRunAt = now;
|
|
95
|
+
}
|
|
89
96
|
if (!config.enabled || config.agents.length === 0) {
|
|
90
97
|
return { actions: [], agentsChecked: 0, replenished: 0 };
|
|
91
98
|
}
|
|
92
|
-
const now = Date.now();
|
|
93
99
|
const cooldownMs = config.cooldownMin * 60_000;
|
|
94
100
|
const actions = [];
|
|
95
101
|
let replenished = 0;
|
|
96
|
-
stats.cyclesRun++;
|
|
97
|
-
stats.lastRunAt = now;
|
|
98
102
|
for (const agent of config.agents) {
|
|
99
103
|
// Cooldown check
|
|
100
104
|
if (lastReplenishAt[agent] && now - lastReplenishAt[agent] < cooldownMs)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"continuity-loop.js","sourceRoot":"","sources":["../src/continuity-loop.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"continuity-loop.js","sourceRoot":"","sources":["../src/continuity-loop.ts"],"names":[],"mappings":"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"}
|
package/dist/dashboard.d.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Dashboard HTML β self-contained page served at /dashboard
|
|
3
|
-
* v2:
|
|
3
|
+
* v2: redesign + chat input
|
|
4
4
|
*/
|
|
5
|
-
export
|
|
5
|
+
export interface DashboardOptions {
|
|
6
|
+
/** Show internal cockpit controls (intensity, pause, etc.). Default: false */
|
|
7
|
+
internalMode?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function getDashboardHTML(opts?: DashboardOptions): string;
|
|
6
10
|
//# sourceMappingURL=dashboard.d.ts.map
|
package/dist/dashboard.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"AAGA;;;GAGG;AAEH,wBAAgB,gBAAgB,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"AAGA;;;GAGG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,8EAA8E;IAC9E,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,gBAAqB,GAAG,MAAM,CA+5EpE"}
|
package/dist/dashboard.js
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
// Copyright (c) Reflectt AI
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
* v2: Pixel's redesign + chat input for Ryan
|
|
6
|
-
*/
|
|
7
|
-
export function getDashboardHTML() {
|
|
3
|
+
export function getDashboardHTML(opts = {}) {
|
|
4
|
+
const internalMode = opts.internalMode ?? false;
|
|
8
5
|
return `<!DOCTYPE html>
|
|
9
6
|
<html lang="en">
|
|
10
7
|
<head>
|
|
@@ -442,6 +439,13 @@ export function getDashboardHTML() {
|
|
|
442
439
|
.project-tab.active { color: var(--accent); border-bottom-color: var(--accent); }
|
|
443
440
|
.kanban { display: flex; gap: var(--space-3); padding: 16px 18px; overflow-x: auto; min-height: 180px; align-items: flex-start; }
|
|
444
441
|
.kanban-col { flex: 1; min-width: 160px; max-height: 75vh; overflow-y: auto; scrollbar-width: thin; }
|
|
442
|
+
@media (max-width: 768px) {
|
|
443
|
+
.kanban { flex-wrap: wrap; gap: var(--space-2); padding: 12px; }
|
|
444
|
+
.kanban-col { min-width: 140px; flex-basis: calc(50% - 6px); }
|
|
445
|
+
}
|
|
446
|
+
@media (max-width: 480px) {
|
|
447
|
+
.kanban-col { flex-basis: 100%; }
|
|
448
|
+
}
|
|
445
449
|
.kanban-col::-webkit-scrollbar { width: 4px; }
|
|
446
450
|
.kanban-col::-webkit-scrollbar-track { background: transparent; }
|
|
447
451
|
.kanban-col::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; }
|
|
@@ -986,6 +990,12 @@ export function getDashboardHTML() {
|
|
|
986
990
|
.msg-time { margin-left: 0; }
|
|
987
991
|
.chat-input-bar { padding: 8px 10px; }
|
|
988
992
|
.chat-input-bar select { min-width: 0; width: 100%; }
|
|
993
|
+
.intensity-control { padding: 8px 12px; gap: 6px; }
|
|
994
|
+
.intensity-label { font-size: 10px; }
|
|
995
|
+
.intensity-btn { padding: 4px 8px; font-size: 12px; }
|
|
996
|
+
.intensity-info { font-size: 10px; margin-left: 4px; }
|
|
997
|
+
.intensity-sep { display: none; }
|
|
998
|
+
.pause-toggle-btn { padding: 4px 8px; font-size: 12px; }
|
|
989
999
|
}
|
|
990
1000
|
|
|
991
1001
|
@media (min-width: 768px) and (max-width: 1023px) {
|
|
@@ -1625,6 +1635,7 @@ export function getDashboardHTML() {
|
|
|
1625
1635
|
.intensity-control {
|
|
1626
1636
|
display: flex; align-items: center; gap: 8px; padding: 8px 16px;
|
|
1627
1637
|
background: var(--surface, #1a1a2e); border-bottom: 1px solid var(--border, #2a2a4a);
|
|
1638
|
+
flex-wrap: wrap; max-width: 100vw; box-sizing: border-box;
|
|
1628
1639
|
}
|
|
1629
1640
|
.intensity-label { font-size: var(--text-xs, 11px); color: var(--text-muted, #888); text-transform: uppercase; letter-spacing: 0.05em; margin-right: 4px; }
|
|
1630
1641
|
.intensity-btn {
|
|
@@ -2028,12 +2039,12 @@ export function getDashboardHTML() {
|
|
|
2028
2039
|
<button class="focus-toggle" id="focus-toggle" onclick="toggleFocusMode()" title="Focus Mode: highlight active work, collapse noise">
|
|
2029
2040
|
<span class="focus-icon">π―</span> Focus
|
|
2030
2041
|
</button>
|
|
2031
|
-
<span id="release-badge" class="release-badge" title="Deploy status">deploy: checkingβ¦</span>
|
|
2032
|
-
<span id="build-badge" class="release-badge" title="Build info">build: loadingβ¦</span>
|
|
2042
|
+
<span id="release-badge" class="release-badge" title="Deploy status" style="display:none">deploy: checkingβ¦</span>
|
|
2043
|
+
<span id="build-badge" class="release-badge" title="Build info" style="display:none">build: loadingβ¦</span>
|
|
2033
2044
|
<span id="clock"></span>
|
|
2034
2045
|
</div>
|
|
2035
2046
|
</div>
|
|
2036
|
-
|
|
2047
|
+
${internalMode ? `<div id="pause-banner" class="pause-banner" style="display:none">
|
|
2037
2048
|
<span class="pause-icon">βΈοΈ</span>
|
|
2038
2049
|
<span id="pause-message">Team paused</span>
|
|
2039
2050
|
<button onclick="resumeFromBanner()" class="pause-resume-btn">Resume</button>
|
|
@@ -2046,17 +2057,17 @@ export function getDashboardHTML() {
|
|
|
2046
2057
|
<span id="intensity-info" class="intensity-info"></span>
|
|
2047
2058
|
<span class="intensity-sep">|</span>
|
|
2048
2059
|
<button id="pause-toggle-btn" class="pause-toggle-btn" onclick="toggleTeamPause()" aria-label="Pause team" tabindex="0">βΈοΈ Pause</button>
|
|
2049
|
-
</div
|
|
2060
|
+
</div>` : '<!-- internal controls hidden (set REFLECTT_INTERNAL_UI=1 to enable) -->'}
|
|
2050
2061
|
|
|
2051
2062
|
<div class="first-boot-banner" id="first-boot-banner" role="region" aria-label="Welcome banner" hidden>
|
|
2052
2063
|
<button class="banner-dismiss" aria-label="Dismiss welcome banner" onclick="dismissFirstBootBanner()">β</button>
|
|
2053
2064
|
<div class="banner-status"><span class="banner-status-dot"></span> Running</div>
|
|
2054
|
-
<h2 class="banner-heading">
|
|
2055
|
-
<p class="banner-subtext">
|
|
2065
|
+
<h2 class="banner-heading">Welcome β your team is running.</h2>
|
|
2066
|
+
<p class="banner-subtext">Next, connect a chat client or run your first task. Everything here is logged and reviewable.</p>
|
|
2056
2067
|
<div class="banner-pills">
|
|
2057
|
-
<a href="/docs
|
|
2058
|
-
<a href="/
|
|
2059
|
-
<a href="https://app.reflectt.ai" class="banner-pill" target="_blank" rel="noopener"><span>βοΈ</span> Connect to
|
|
2068
|
+
<a href="/docs" class="banner-pill"><span>π</span> Read the docs</a>
|
|
2069
|
+
<a href="/capabilities" class="banner-pill"><span>π§</span> Browse the API</a>
|
|
2070
|
+
<a href="https://app.reflectt.ai/" class="banner-pill" target="_blank" rel="noopener"><span>βοΈ</span> Connect to Reflectt Cloud <span class="banner-pill-optional">(optional)</span></a>
|
|
2060
2071
|
</div>
|
|
2061
2072
|
</div>
|
|
2062
2073
|
|
|
@@ -2112,38 +2123,54 @@ export function getDashboardHTML() {
|
|
|
2112
2123
|
<!-- Getting Started panel β hidden when configured -->
|
|
2113
2124
|
<div class="getting-started" id="getting-started">
|
|
2114
2125
|
<div class="panel-header">
|
|
2115
|
-
π
|
|
2116
|
-
<button class="dismiss-btn" onclick="dismissGettingStarted()" aria-label="Dismiss
|
|
2126
|
+
π Next Steps
|
|
2127
|
+
<button class="dismiss-btn" onclick="dismissGettingStarted()" aria-label="Dismiss panel">Dismiss β</button>
|
|
2117
2128
|
</div>
|
|
2118
2129
|
<div class="gs-steps" id="gs-steps">
|
|
2119
2130
|
<div class="gs-step" id="gs-preflight">
|
|
2120
2131
|
<div class="gs-icon">1</div>
|
|
2121
2132
|
<div class="gs-content">
|
|
2122
|
-
<div class="gs-title">
|
|
2123
|
-
<div class="gs-desc">
|
|
2124
|
-
<a class="gs-link" href="/health" target="_blank">
|
|
2133
|
+
<div class="gs-title">Server is running</div>
|
|
2134
|
+
<div class="gs-desc">Your reflectt-node is up and healthy. Check status anytime with <code style="background:var(--border);padding:1px 5px;border-radius:3px;font-size:11px">reflectt status</code></div>
|
|
2135
|
+
<a class="gs-link" href="/health" target="_blank">View health β</a>
|
|
2125
2136
|
</div>
|
|
2126
2137
|
</div>
|
|
2127
2138
|
<div class="gs-step" id="gs-connect">
|
|
2128
2139
|
<div class="gs-icon">2</div>
|
|
2129
2140
|
<div class="gs-content">
|
|
2130
|
-
<div class="gs-title">Connect
|
|
2131
|
-
<div class="gs-desc">
|
|
2132
|
-
<a class="gs-link" href="https://reflectt.ai/
|
|
2141
|
+
<div class="gs-title">Connect to cloud <span style="font-size:11px;opacity:0.6">(optional)</span></div>
|
|
2142
|
+
<div class="gs-desc">Sync your dashboard to the web. Sign up at <a href="https://app.reflectt.ai" target="_blank" style="color:var(--accent)">app.reflectt.ai</a>, get a join token, then run:<br><code style="background:var(--border);padding:2px 6px;border-radius:3px;font-size:11px;display:inline-block;margin-top:4px">reflectt host connect --join-token <token> --cloud-url https://app.reflectt.ai</code></div>
|
|
2143
|
+
<a class="gs-link" href="https://docs.reflectt.ai/first-time-user-journey" target="_blank">Setup guide β</a>
|
|
2133
2144
|
</div>
|
|
2134
2145
|
</div>
|
|
2135
2146
|
<div class="gs-step" id="gs-task">
|
|
2136
2147
|
<div class="gs-icon">3</div>
|
|
2137
2148
|
<div class="gs-content">
|
|
2138
|
-
<div class="gs-title">Create
|
|
2139
|
-
<div class="gs-desc">Post
|
|
2140
|
-
<a class="gs-link" href="/docs" target="_blank">API
|
|
2149
|
+
<div class="gs-title">Create a task or connect an agent</div>
|
|
2150
|
+
<div class="gs-desc">Post your first task via the API, or connect an AI agent (OpenClaw, Claude, etc.) to start working. Your team will pick up tasks automatically.</div>
|
|
2151
|
+
<a class="gs-link" href="/docs" target="_blank">API reference β</a>
|
|
2141
2152
|
</div>
|
|
2142
2153
|
</div>
|
|
2143
2154
|
</div>
|
|
2144
2155
|
</div>
|
|
2145
2156
|
|
|
2146
|
-
|
|
2157
|
+
<!-- Overview empty state β shown when no tasks and no chat activity -->
|
|
2158
|
+
<div class="panel" id="overview-empty-state" style="display:none">
|
|
2159
|
+
<div class="panel-body" style="text-align:center;padding:36px 20px">
|
|
2160
|
+
<div style="font-size:28px;margin-bottom:10px">π±</div>
|
|
2161
|
+
<div style="font-size:15px;font-weight:500;color:var(--text-bright);margin-bottom:6px">Your workspace is ready</div>
|
|
2162
|
+
<div style="font-size:13px;color:var(--text-muted);max-width:380px;margin:0 auto;line-height:1.5">
|
|
2163
|
+
No tasks or messages yet. Once agents start working, you'll see task progress, chat activity, and shipped outcomes here.
|
|
2164
|
+
</div>
|
|
2165
|
+
<div style="margin-top:16px;display:flex;gap:12px;justify-content:center;flex-wrap:wrap">
|
|
2166
|
+
<a href="/docs" target="_blank" style="color:var(--accent);font-size:12px;text-decoration:none">API docs β</a>
|
|
2167
|
+
<a href="/capabilities" target="_blank" style="color:var(--accent);font-size:12px;text-decoration:none">All capabilities β</a>
|
|
2168
|
+
<a href="/health" target="_blank" style="color:var(--accent);font-size:12px;text-decoration:none">System health β</a>
|
|
2169
|
+
</div>
|
|
2170
|
+
</div>
|
|
2171
|
+
</div>
|
|
2172
|
+
|
|
2173
|
+
<div class="panel focus-only" style="display:none">
|
|
2147
2174
|
<div class="panel-header">π§ Runtime Truth Card <span class="count" id="truth-count">loadingβ¦</span></div>
|
|
2148
2175
|
<div class="panel-body" id="truth-body"></div>
|
|
2149
2176
|
</div>
|
|
@@ -2386,6 +2413,8 @@ export function getDashboardHTML() {
|
|
|
2386
2413
|
<button class="status-btn" data-status="blocked" onclick="updateTaskStatus('blocked')">Blocked</button>
|
|
2387
2414
|
<button class="status-btn" data-status="validating" onclick="updateTaskStatus('validating')">Validating</button>
|
|
2388
2415
|
<button class="status-btn" data-status="done" onclick="updateTaskStatus('done')">Done</button>
|
|
2416
|
+
<button class="status-btn" data-status="resolved_externally" onclick="updateTaskStatus('resolved_externally')">Resolved ext</button>
|
|
2417
|
+
<button class="status-btn" data-status="cancelled" onclick="updateTaskStatus('cancelled')">Cancelled</button>
|
|
2389
2418
|
</div>
|
|
2390
2419
|
</div>
|
|
2391
2420
|
|
package/dist/dashboard.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,4BAA4B;
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,4BAA4B;AAY5B,MAAM,UAAU,gBAAgB,CAAC,OAAyB,EAAE;IAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,KAAK,CAAA;IAC/C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0/DP,YAAY,CAAC,CAAC,CAAC;;;;;;;;;;;;;OAaV,CAAC,CAAC,CAAC,0EAA0E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAqZ5E,CAAC;AACT,CAAC"}
|
package/dist/doctor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAExF,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,GAAG,CAAA;CACX,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;IACjC,EAAE,EAAE,OAAO,CAAA;IACX,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,qDAAqD;IACrD,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,QAAQ,EAAE;QACR,MAAM,EAAE,mBAAmB,CAAA;QAC3B,MAAM,EAAE,mBAAmB,CAAA;QAC3B,SAAS,EAAE,mBAAmB,CAAA;QAC9B,MAAM,EAAE,mBAAmB,CAAA;QAC3B,UAAU,EAAE,mBAAmB,CAAA;QAC/B,SAAS,EAAE,mBAAmB,CAAA;KAC/B,CAAA;IACD,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB,CAAA;AAwCD,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAC/C,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,WAAW,CAAA;CACtB,GAAG,OAAO,CAAC,YAAY,CAAC,CAkFxB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAExF,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,GAAG,CAAA;CACX,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;IACjC,EAAE,EAAE,OAAO,CAAA;IACX,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,qDAAqD;IACrD,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,QAAQ,EAAE;QACR,MAAM,EAAE,mBAAmB,CAAA;QAC3B,MAAM,EAAE,mBAAmB,CAAA;QAC3B,SAAS,EAAE,mBAAmB,CAAA;QAC9B,MAAM,EAAE,mBAAmB,CAAA;QAC3B,UAAU,EAAE,mBAAmB,CAAA;QAC/B,SAAS,EAAE,mBAAmB,CAAA;KAC/B,CAAA;IACD,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB,CAAA;AAwCD,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAC/C,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,WAAW,CAAA;CACtB,GAAG,OAAO,CAAC,YAAY,CAAC,CAkFxB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA6I9D"}
|
package/dist/doctor.js
CHANGED
|
@@ -199,17 +199,28 @@ export function formatDoctorHuman(report) {
|
|
|
199
199
|
const overall = d?.overall;
|
|
200
200
|
const OPTIONAL = new Set(['github-identity', 'openclaw_bootstrap']);
|
|
201
201
|
const checks = Array.isArray(d?.checks) ? d.checks : [];
|
|
202
|
-
const fails = checks.filter((c) => c?.status === 'fail')
|
|
203
|
-
const warns = checks.filter((c) => c?.status === 'warn')
|
|
204
|
-
const
|
|
205
|
-
const
|
|
202
|
+
const fails = checks.filter((c) => c?.status === 'fail');
|
|
203
|
+
const warns = checks.filter((c) => c?.status === 'warn');
|
|
204
|
+
const failNames = fails.map((c) => c?.name).filter(Boolean);
|
|
205
|
+
const warnNames = warns.map((c) => c?.name).filter(Boolean);
|
|
206
|
+
const requiredFails = failNames.filter(n => !OPTIONAL.has(n));
|
|
207
|
+
const optionalFails = failNames.filter(n => OPTIONAL.has(n));
|
|
206
208
|
const parts = [`overall=${overall ?? 'n/a'}`];
|
|
207
209
|
if (requiredFails.length)
|
|
208
210
|
parts.push(`fails=${requiredFails.join(',')}`);
|
|
209
211
|
if (optionalFails.length)
|
|
210
212
|
parts.push(`optional=${optionalFails.join(',')}`);
|
|
211
|
-
if (
|
|
212
|
-
parts.push(`warns=${
|
|
213
|
+
if (warnNames.length)
|
|
214
|
+
parts.push(`warns=${warnNames.join(',')}`);
|
|
215
|
+
// Surface fix text for failing/warning checks so users know what to do
|
|
216
|
+
const actionable = [...fails, ...warns].filter((c) => c?.fix);
|
|
217
|
+
if (actionable.length) {
|
|
218
|
+
parts.push('\n');
|
|
219
|
+
for (const c of actionable) {
|
|
220
|
+
const status = c.status === 'fail' ? 'FAIL' : 'WARN';
|
|
221
|
+
parts.push(` ${c.name}: ${status} β ${c.fix}`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
213
224
|
return parts.join(' ');
|
|
214
225
|
});
|
|
215
226
|
section('preflight', '/preflight', (d) => {
|