sensorium-mcp 3.1.2-board.1 → 3.1.2
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/dist/dashboard/routes/types.d.ts +0 -6
- package/dist/dashboard/routes/types.d.ts.map +1 -1
- package/dist/dashboard/routes/types.js.map +1 -1
- package/dist/dashboard/routes.d.ts.map +1 -1
- package/dist/dashboard/routes.js +0 -32
- package/dist/dashboard/routes.js.map +1 -1
- package/dist/dashboard/spa.html +12 -12
- package/dist/data/memory/migration-runner.d.ts.map +1 -1
- package/dist/data/memory/migration-runner.js +0 -4
- package/dist/data/memory/migration-runner.js.map +1 -1
- package/dist/data/memory/schema.d.ts.map +1 -1
- package/dist/data/memory/schema.js +0 -4
- package/dist/data/memory/schema.js.map +1 -1
- package/dist/index.js +2 -39
- package/dist/index.js.map +1 -1
- package/dist/server/http-server.d.ts +1 -3
- package/dist/server/http-server.d.ts.map +1 -1
- package/dist/server/http-server.js +1 -3
- package/dist/server/http-server.js.map +1 -1
- package/dist/services/spawn-common.d.ts.map +1 -1
- package/dist/services/spawn-common.js +1 -3
- package/dist/services/spawn-common.js.map +1 -1
- package/dist/services/worker-cleanup.service.d.ts +1 -6
- package/dist/services/worker-cleanup.service.d.ts.map +1 -1
- package/dist/services/worker-cleanup.service.js +10 -123
- package/dist/services/worker-cleanup.service.js.map +1 -1
- package/dist/tools/delegate-tool.d.ts.map +1 -1
- package/dist/tools/delegate-tool.js +0 -32
- package/dist/tools/delegate-tool.js.map +1 -1
- package/dist/tools/wait/message-delivery.d.ts.map +1 -1
- package/dist/tools/wait/message-delivery.js +0 -13
- package/dist/tools/wait/message-delivery.js.map +1 -1
- package/package.json +1 -1
- package/dist/dashboard/routes/board.d.ts +0 -67
- package/dist/dashboard/routes/board.d.ts.map +0 -1
- package/dist/dashboard/routes/board.js +0 -612
- package/dist/dashboard/routes/board.js.map +0 -1
- package/dist/data/board/board-schema.d.ts +0 -22
- package/dist/data/board/board-schema.d.ts.map +0 -1
- package/dist/data/board/board-schema.js +0 -103
- package/dist/data/board/board-schema.js.map +0 -1
- package/dist/data/board/board-types.d.ts +0 -117
- package/dist/data/board/board-types.d.ts.map +0 -1
- package/dist/data/board/board-types.js +0 -9
- package/dist/data/board/board-types.js.map +0 -1
- package/dist/data/board/card.repository.d.ts +0 -64
- package/dist/data/board/card.repository.d.ts.map +0 -1
- package/dist/data/board/card.repository.js +0 -272
- package/dist/data/board/card.repository.js.map +0 -1
- package/dist/data/board/comment.repository.d.ts +0 -12
- package/dist/data/board/comment.repository.d.ts.map +0 -1
- package/dist/data/board/comment.repository.js +0 -31
- package/dist/data/board/comment.repository.js.map +0 -1
- package/dist/data/board/lane.repository.d.ts +0 -18
- package/dist/data/board/lane.repository.d.ts.map +0 -1
- package/dist/data/board/lane.repository.js +0 -44
- package/dist/data/board/lane.repository.js.map +0 -1
- package/dist/data/board/profile-defaults.d.ts +0 -19
- package/dist/data/board/profile-defaults.d.ts.map +0 -1
- package/dist/data/board/profile-defaults.js +0 -118
- package/dist/data/board/profile-defaults.js.map +0 -1
- package/dist/services/board/board-signals.d.ts +0 -25
- package/dist/services/board/board-signals.d.ts.map +0 -1
- package/dist/services/board/board-signals.js +0 -83
- package/dist/services/board/board-signals.js.map +0 -1
- package/dist/services/board/card-briefing.d.ts +0 -17
- package/dist/services/board/card-briefing.d.ts.map +0 -1
- package/dist/services/board/card-briefing.js +0 -86
- package/dist/services/board/card-briefing.js.map +0 -1
- package/dist/services/board/orchestrator.service.d.ts +0 -55
- package/dist/services/board/orchestrator.service.d.ts.map +0 -1
- package/dist/services/board/orchestrator.service.js +0 -198
- package/dist/services/board/orchestrator.service.js.map +0 -1
- package/dist/services/board/release-worker.d.ts +0 -32
- package/dist/services/board/release-worker.d.ts.map +0 -1
- package/dist/services/board/release-worker.js +0 -49
- package/dist/services/board/release-worker.js.map +0 -1
- package/dist/services/board/report-capture.d.ts +0 -48
- package/dist/services/board/report-capture.d.ts.map +0 -1
- package/dist/services/board/report-capture.js +0 -172
- package/dist/services/board/report-capture.js.map +0 -1
- package/dist/services/board/worker-spawn.d.ts +0 -30
- package/dist/services/board/worker-spawn.d.ts.map +0 -1
- package/dist/services/board/worker-spawn.js +0 -90
- package/dist/services/board/worker-spawn.js.map +0 -1
- package/dist/services/passive-notice.service.d.ts +0 -39
- package/dist/services/passive-notice.service.d.ts.map +0 -1
- package/dist/services/passive-notice.service.js +0 -274
- package/dist/services/passive-notice.service.js.map +0 -1
|
@@ -1,272 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Task Board — card CRUD + orchestrator queries.
|
|
3
|
-
*
|
|
4
|
-
* Writers: dashboard routes (operator) and the board orchestrator only.
|
|
5
|
-
* Agents never touch these tables (single-writer invariant, design §2).
|
|
6
|
-
*/
|
|
7
|
-
import { nowISO } from "../memory/utils.js";
|
|
8
|
-
import { log } from "../../lib/logger.js";
|
|
9
|
-
import { errorMessage } from "../../lib/utils.js";
|
|
10
|
-
function parseProfile(json) {
|
|
11
|
-
try {
|
|
12
|
-
const parsed = JSON.parse(json);
|
|
13
|
-
return typeof parsed === "object" && parsed !== null ? parsed : {};
|
|
14
|
-
}
|
|
15
|
-
catch (err) {
|
|
16
|
-
log.warn(`[board] Malformed profile_json — using empty profile: ${errorMessage(err)}`);
|
|
17
|
-
return {};
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
function mapRow(row) {
|
|
21
|
-
return {
|
|
22
|
-
cardId: row.card_id,
|
|
23
|
-
title: row.title,
|
|
24
|
-
description: row.description,
|
|
25
|
-
acceptance: row.acceptance,
|
|
26
|
-
type: row.type,
|
|
27
|
-
laneThreadId: row.lane_thread_id,
|
|
28
|
-
priority: row.priority,
|
|
29
|
-
status: row.status,
|
|
30
|
-
profile: parseProfile(row.profile_json),
|
|
31
|
-
escalate: row.escalate === 1,
|
|
32
|
-
recurDelayMin: row.recur_delay_min,
|
|
33
|
-
recurGroupId: row.recur_group_id,
|
|
34
|
-
nextSpawnAt: row.next_spawn_at,
|
|
35
|
-
workerThreadId: row.worker_thread_id,
|
|
36
|
-
blockedReason: row.blocked_reason,
|
|
37
|
-
archivedAt: row.archived_at,
|
|
38
|
-
createdAt: row.created_at,
|
|
39
|
-
updatedAt: row.updated_at,
|
|
40
|
-
startedAt: row.started_at,
|
|
41
|
-
finishedAt: row.finished_at,
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
export function createCard(db, card) {
|
|
45
|
-
// Insert + group-anchor update are one atomic unit (a crash between them
|
|
46
|
-
// left a recurring card with no group — invisible to recurrence forever).
|
|
47
|
-
return db.transaction(() => {
|
|
48
|
-
const now = nowISO();
|
|
49
|
-
// Defense-in-depth floor (the API also validates): recurDelayMin < 1 —
|
|
50
|
-
// e.g. an empty input coerced to 0 — would be a tight respawn loop.
|
|
51
|
-
const recurDelayMin = card.recurDelayMin != null ? Math.max(1, Math.trunc(card.recurDelayMin)) : null;
|
|
52
|
-
const result = db
|
|
53
|
-
.prepare(`INSERT INTO board_cards (
|
|
54
|
-
title, description, acceptance, type, lane_thread_id, priority,
|
|
55
|
-
profile_json, escalate, recur_delay_min, recur_group_id, created_at, updated_at
|
|
56
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
57
|
-
.run(card.title, card.description ?? "", card.acceptance ?? "", card.type ?? "chore", card.laneThreadId, card.priority ?? 0, JSON.stringify(card.profile ?? {}), card.escalate ? 1 : 0, recurDelayMin, card.recurGroupId ?? null, now, now);
|
|
58
|
-
const created = getCard(db, Number(result.lastInsertRowid));
|
|
59
|
-
if (!created)
|
|
60
|
-
throw new Error("board_cards insert did not persist");
|
|
61
|
-
// A recurring original anchors its own group so fresh copies can find it.
|
|
62
|
-
if (created.recurDelayMin != null && created.recurGroupId == null) {
|
|
63
|
-
db.prepare(`UPDATE board_cards SET recur_group_id = ? WHERE card_id = ?`).run(created.cardId, created.cardId);
|
|
64
|
-
created.recurGroupId = created.cardId;
|
|
65
|
-
}
|
|
66
|
-
return created;
|
|
67
|
-
})();
|
|
68
|
-
}
|
|
69
|
-
export function getCard(db, cardId) {
|
|
70
|
-
const row = db.prepare(`SELECT * FROM board_cards WHERE card_id = ?`).get(cardId);
|
|
71
|
-
return row ? mapRow(row) : undefined;
|
|
72
|
-
}
|
|
73
|
-
export function listCards(db, opts = {}) {
|
|
74
|
-
const where = [];
|
|
75
|
-
const params = [];
|
|
76
|
-
if (!opts.includeArchived)
|
|
77
|
-
where.push("archived_at IS NULL");
|
|
78
|
-
if (opts.laneThreadId !== undefined) {
|
|
79
|
-
where.push("lane_thread_id = ?");
|
|
80
|
-
params.push(opts.laneThreadId);
|
|
81
|
-
}
|
|
82
|
-
if (opts.status !== undefined) {
|
|
83
|
-
where.push("status = ?");
|
|
84
|
-
params.push(opts.status);
|
|
85
|
-
}
|
|
86
|
-
const sql = `SELECT * FROM board_cards` +
|
|
87
|
-
(where.length > 0 ? ` WHERE ${where.join(" AND ")}` : "") +
|
|
88
|
-
` ORDER BY priority DESC, created_at ASC`;
|
|
89
|
-
return db.prepare(sql).all(...params).map(mapRow);
|
|
90
|
-
}
|
|
91
|
-
/** Column-name map for the dynamically assembled UPDATE in updateCard. */
|
|
92
|
-
const PATCH_COLUMNS = {
|
|
93
|
-
title: "title",
|
|
94
|
-
description: "description",
|
|
95
|
-
acceptance: "acceptance",
|
|
96
|
-
type: "type",
|
|
97
|
-
laneThreadId: "lane_thread_id",
|
|
98
|
-
priority: "priority",
|
|
99
|
-
status: "status",
|
|
100
|
-
profile: "profile_json",
|
|
101
|
-
escalate: "escalate",
|
|
102
|
-
recurDelayMin: "recur_delay_min",
|
|
103
|
-
recurGroupId: "recur_group_id",
|
|
104
|
-
nextSpawnAt: "next_spawn_at",
|
|
105
|
-
workerThreadId: "worker_thread_id",
|
|
106
|
-
blockedReason: "blocked_reason",
|
|
107
|
-
archivedAt: "archived_at",
|
|
108
|
-
startedAt: "started_at",
|
|
109
|
-
finishedAt: "finished_at",
|
|
110
|
-
};
|
|
111
|
-
export function updateCard(db, cardId, patch) {
|
|
112
|
-
const sets = [];
|
|
113
|
-
const params = [];
|
|
114
|
-
for (const [key, column] of Object.entries(PATCH_COLUMNS)) {
|
|
115
|
-
const value = patch[key];
|
|
116
|
-
// Test the VALUE, not key presence: `{ title: undefined }` must mean
|
|
117
|
-
// "unchanged", not "SET title = NULL" (which throws on NOT NULL columns).
|
|
118
|
-
// Nullable columns are cleared with an explicit null.
|
|
119
|
-
if (value === undefined)
|
|
120
|
-
continue;
|
|
121
|
-
sets.push(`${column} = ?`);
|
|
122
|
-
if (key === "profile")
|
|
123
|
-
params.push(JSON.stringify(value ?? {}));
|
|
124
|
-
else if (key === "escalate")
|
|
125
|
-
params.push(value ? 1 : 0);
|
|
126
|
-
else
|
|
127
|
-
params.push(value ?? null);
|
|
128
|
-
}
|
|
129
|
-
if (sets.length === 0)
|
|
130
|
-
return getCard(db, cardId);
|
|
131
|
-
sets.push("updated_at = ?");
|
|
132
|
-
params.push(nowISO(), cardId);
|
|
133
|
-
db.prepare(`UPDATE board_cards SET ${sets.join(", ")} WHERE card_id = ?`).run(...params);
|
|
134
|
-
return getCard(db, cardId);
|
|
135
|
-
}
|
|
136
|
-
export function deleteCard(db, cardId) {
|
|
137
|
-
// Atomic: never leave orphaned comments when the card delete fails mid-way.
|
|
138
|
-
return db.transaction(() => {
|
|
139
|
-
db.prepare(`DELETE FROM board_comments WHERE card_id = ?`).run(cardId);
|
|
140
|
-
const result = db.prepare(`DELETE FROM board_cards WHERE card_id = ?`).run(cardId);
|
|
141
|
-
return result.changes > 0;
|
|
142
|
-
})();
|
|
143
|
-
}
|
|
144
|
-
// ── Orchestrator queries (design §3) ────────────────────────────────────────
|
|
145
|
-
/** Top-priority dispatchable Backlog card for a lane (priority DESC, oldest first). */
|
|
146
|
-
export function getNextDispatchableCard(db, laneThreadId) {
|
|
147
|
-
const row = db
|
|
148
|
-
.prepare(`SELECT * FROM board_cards
|
|
149
|
-
WHERE lane_thread_id = ? AND status = 'backlog' AND archived_at IS NULL
|
|
150
|
-
ORDER BY priority DESC, created_at ASC LIMIT 1`)
|
|
151
|
-
.get(laneThreadId);
|
|
152
|
-
return row ? mapRow(row) : undefined;
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* THE one DONE transition (single source — operator "Mark Done", worker
|
|
156
|
-
* STATUS: DONE, and any future path must all build the patch here; three
|
|
157
|
-
* hand-rolled copies had already drifted on blockedReason).
|
|
158
|
-
*/
|
|
159
|
-
export function buildDonePatch(card) {
|
|
160
|
-
return {
|
|
161
|
-
status: "done",
|
|
162
|
-
finishedAt: nowISO(),
|
|
163
|
-
workerThreadId: null,
|
|
164
|
-
blockedReason: null,
|
|
165
|
-
...(card.recurDelayMin != null
|
|
166
|
-
? { nextSpawnAt: new Date(Date.now() + card.recurDelayMin * 60_000).toISOString() }
|
|
167
|
-
: {}),
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* Atomically claim a Backlog card for dispatch (compare-and-set on status).
|
|
172
|
-
* Returns false when another process/tick already claimed, archived, or moved
|
|
173
|
-
* it — the caller must NOT spawn in that case. This is the in-DB guard against
|
|
174
|
-
* double-dispatch across concurrent orchestrators (self-update overlap) and
|
|
175
|
-
* against operator moves racing an in-flight tick.
|
|
176
|
-
*/
|
|
177
|
-
export function claimCardForDispatch(db, cardId) {
|
|
178
|
-
const result = db
|
|
179
|
-
.prepare(`UPDATE board_cards
|
|
180
|
-
SET status = 'in_progress', started_at = ?, blocked_reason = NULL, updated_at = ?
|
|
181
|
-
WHERE card_id = ? AND status = 'backlog' AND archived_at IS NULL`)
|
|
182
|
-
.run(nowISO(), nowISO(), cardId);
|
|
183
|
-
return result.changes === 1;
|
|
184
|
-
}
|
|
185
|
-
/** Bind the spawned worker to a card ONLY while it is still in_progress (an
|
|
186
|
-
* operator move/delete during the async spawn must win, not be clobbered). */
|
|
187
|
-
export function bindWorkerToCard(db, cardId, workerThreadId) {
|
|
188
|
-
const result = db
|
|
189
|
-
.prepare(`UPDATE board_cards SET worker_thread_id = ?, updated_at = ?
|
|
190
|
-
WHERE card_id = ? AND status = 'in_progress' AND worker_thread_id IS NULL`)
|
|
191
|
-
.run(workerThreadId, nowISO(), cardId);
|
|
192
|
-
return result.changes === 1;
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* CAS block for a card still bound to a specific worker (exit safety net).
|
|
196
|
-
* Blocks ONLY when the card is in_progress AND its worker is still this exact
|
|
197
|
-
* thread — so two concurrent callers (worker teardown vs a reconcile tick,
|
|
198
|
-
* possibly cross-process) cannot both emit a BLOCKED signal. Returns the
|
|
199
|
-
* updated card when it changed exactly one row, else undefined (another path
|
|
200
|
-
* already handled it → the caller must no-op).
|
|
201
|
-
*/
|
|
202
|
-
export function blockBoundWorkerCard(db, cardId, workerThreadId, reason) {
|
|
203
|
-
const result = db
|
|
204
|
-
.prepare(`UPDATE board_cards
|
|
205
|
-
SET status = 'blocked', blocked_reason = ?, worker_thread_id = NULL, updated_at = ?
|
|
206
|
-
WHERE card_id = ? AND status = 'in_progress' AND worker_thread_id = ?`)
|
|
207
|
-
.run(reason, nowISO(), cardId, workerThreadId);
|
|
208
|
-
return result.changes === 1 ? getCard(db, cardId) : undefined;
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* CAS block for a claimed-but-unbound card (dispatch died between claim and
|
|
212
|
-
* bind, leaving it in_progress with NO worker). Blocks ONLY while it is still
|
|
213
|
-
* in_progress AND worker_thread_id IS NULL, so a late bind or another reconcile
|
|
214
|
-
* tick cannot double-block. Returns the updated card when it changed exactly
|
|
215
|
-
* one row, else undefined.
|
|
216
|
-
*/
|
|
217
|
-
export function blockUnboundCard(db, cardId, reason) {
|
|
218
|
-
const result = db
|
|
219
|
-
.prepare(`UPDATE board_cards
|
|
220
|
-
SET status = 'blocked', blocked_reason = ?, updated_at = ?
|
|
221
|
-
WHERE card_id = ? AND status = 'in_progress' AND worker_thread_id IS NULL`)
|
|
222
|
-
.run(reason, nowISO(), cardId);
|
|
223
|
-
return result.changes === 1 ? getCard(db, cardId) : undefined;
|
|
224
|
-
}
|
|
225
|
-
export function countInProgress(db, laneThreadId) {
|
|
226
|
-
const row = (laneThreadId !== undefined
|
|
227
|
-
? db
|
|
228
|
-
.prepare(`SELECT COUNT(*) AS n FROM board_cards
|
|
229
|
-
WHERE status = 'in_progress' AND archived_at IS NULL AND lane_thread_id = ?`)
|
|
230
|
-
.get(laneThreadId)
|
|
231
|
-
: db
|
|
232
|
-
.prepare(`SELECT COUNT(*) AS n FROM board_cards
|
|
233
|
-
WHERE status = 'in_progress' AND archived_at IS NULL`)
|
|
234
|
-
.get());
|
|
235
|
-
return row.n;
|
|
236
|
-
}
|
|
237
|
-
/** The in_progress card a live card-worker belongs to (report interception key). */
|
|
238
|
-
export function findCardByWorkerThread(db, workerThreadId) {
|
|
239
|
-
const row = db
|
|
240
|
-
.prepare(`SELECT * FROM board_cards WHERE worker_thread_id = ? AND status = 'in_progress' LIMIT 1`)
|
|
241
|
-
.get(workerThreadId);
|
|
242
|
-
return row ? mapRow(row) : undefined;
|
|
243
|
-
}
|
|
244
|
-
/**
|
|
245
|
-
* Done recurring cards whose respawn delay has elapsed AND whose group has no
|
|
246
|
-
* live instance outside Done (single-live-instance anti-clutter, design §4).
|
|
247
|
-
*/
|
|
248
|
-
export function listDueRecurrences(db, nowIso) {
|
|
249
|
-
const rows = db
|
|
250
|
-
.prepare(`SELECT * FROM board_cards c
|
|
251
|
-
WHERE c.status = 'done' AND c.recur_group_id IS NOT NULL
|
|
252
|
-
AND c.archived_at IS NULL
|
|
253
|
-
AND c.next_spawn_at IS NOT NULL AND c.next_spawn_at <= ?
|
|
254
|
-
AND NOT EXISTS (
|
|
255
|
-
SELECT 1 FROM board_cards o
|
|
256
|
-
WHERE o.recur_group_id = c.recur_group_id AND o.status != 'done'
|
|
257
|
-
AND o.archived_at IS NULL
|
|
258
|
-
)`)
|
|
259
|
-
.all(nowIso);
|
|
260
|
-
return rows.map(mapRow);
|
|
261
|
-
}
|
|
262
|
-
/** Auto-archive Done cards older than `days` (hidden, never deleted — design §4). */
|
|
263
|
-
export function archiveDoneOlderThan(db, days) {
|
|
264
|
-
const cutoff = new Date(Date.now() - days * 86_400_000).toISOString();
|
|
265
|
-
const result = db
|
|
266
|
-
.prepare(`UPDATE board_cards SET archived_at = ?, updated_at = ?
|
|
267
|
-
WHERE status = 'done' AND archived_at IS NULL AND finished_at IS NOT NULL
|
|
268
|
-
AND finished_at < ? AND next_spawn_at IS NULL`)
|
|
269
|
-
.run(nowISO(), nowISO(), cutoff);
|
|
270
|
-
return result.changes;
|
|
271
|
-
}
|
|
272
|
-
//# sourceMappingURL=card.repository.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"card.repository.js","sourceRoot":"","sources":["../../../src/data/board/card.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Task Board — card comments.
|
|
3
|
-
*
|
|
4
|
-
* All task chatter lives on the card (design §2): operator guidance, worker
|
|
5
|
-
* reports (written by the orchestrator from intercepted replies), and board
|
|
6
|
-
* lifecycle events. Comments are append-only.
|
|
7
|
-
*/
|
|
8
|
-
import type { Database } from "../memory/db-types.js";
|
|
9
|
-
import type { BoardComment, CommentAuthor } from "./board-types.js";
|
|
10
|
-
export declare function addComment(db: Database, cardId: number, author: CommentAuthor, content: string): BoardComment;
|
|
11
|
-
export declare function listComments(db: Database, cardId: number): BoardComment[];
|
|
12
|
-
//# sourceMappingURL=comment.repository.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"comment.repository.d.ts","sourceRoot":"","sources":["../../../src/data/board/comment.repository.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAoBpE,wBAAgB,UAAU,CACxB,EAAE,EAAE,QAAQ,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,MAAM,GACd,YAAY,CAQd;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE,CAKzE"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Task Board — card comments.
|
|
3
|
-
*
|
|
4
|
-
* All task chatter lives on the card (design §2): operator guidance, worker
|
|
5
|
-
* reports (written by the orchestrator from intercepted replies), and board
|
|
6
|
-
* lifecycle events. Comments are append-only.
|
|
7
|
-
*/
|
|
8
|
-
import { nowISO } from "../memory/utils.js";
|
|
9
|
-
function mapRow(row) {
|
|
10
|
-
return {
|
|
11
|
-
id: row.id,
|
|
12
|
-
cardId: row.card_id,
|
|
13
|
-
author: row.author,
|
|
14
|
-
content: row.content,
|
|
15
|
-
createdAt: row.created_at,
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
export function addComment(db, cardId, author, content) {
|
|
19
|
-
const now = nowISO();
|
|
20
|
-
const result = db
|
|
21
|
-
.prepare(`INSERT INTO board_comments (card_id, author, content, created_at) VALUES (?, ?, ?, ?)`)
|
|
22
|
-
.run(cardId, author, content, now);
|
|
23
|
-
return { id: Number(result.lastInsertRowid), cardId, author, content, createdAt: now };
|
|
24
|
-
}
|
|
25
|
-
export function listComments(db, cardId) {
|
|
26
|
-
const rows = db
|
|
27
|
-
.prepare(`SELECT * FROM board_comments WHERE card_id = ? ORDER BY created_at ASC, id ASC`)
|
|
28
|
-
.all(cardId);
|
|
29
|
-
return rows.map(mapRow);
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=comment.repository.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"comment.repository.js","sourceRoot":"","sources":["../../../src/data/board/comment.repository.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAW5C,SAAS,MAAM,CAAC,GAAe;IAC7B,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,MAAM,EAAE,GAAG,CAAC,OAAO;QACnB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,EAAY,EACZ,MAAc,EACd,MAAqB,EACrB,OAAe;IAEf,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,MAAM,GAAG,EAAE;SACd,OAAO,CACN,uFAAuF,CACxF;SACA,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IACrC,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,EAAY,EAAE,MAAc;IACvD,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CAAC,gFAAgF,CAAC;SACzF,GAAG,CAAC,MAAM,CAAiB,CAAC;IAC/B,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Task Board — lanes (threads connected to the board).
|
|
3
|
-
*
|
|
4
|
-
* A lane is a thread the operator has connected; only connected lanes are
|
|
5
|
-
* dispatched, and a lane's cards are drained by workers branched from that
|
|
6
|
-
* thread (design §3). Connecting is idempotent.
|
|
7
|
-
*/
|
|
8
|
-
import type { Database } from "../memory/db-types.js";
|
|
9
|
-
import type { BoardLane } from "./board-types.js";
|
|
10
|
-
export declare function upsertLane(db: Database, threadId: number, opts?: {
|
|
11
|
-
connected?: boolean;
|
|
12
|
-
maxConcurrent?: number;
|
|
13
|
-
}): BoardLane;
|
|
14
|
-
export declare function listLanes(db: Database): BoardLane[];
|
|
15
|
-
export declare function listConnectedLanes(db: Database): BoardLane[];
|
|
16
|
-
export declare function getLane(db: Database, threadId: number): BoardLane | undefined;
|
|
17
|
-
export declare function removeLane(db: Database, threadId: number): boolean;
|
|
18
|
-
//# sourceMappingURL=lane.repository.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lane.repository.d.ts","sourceRoot":"","sources":["../../../src/data/board/lane.repository.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAkBlD,wBAAgB,UAAU,CACxB,EAAE,EAAE,QAAQ,EACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,GACzD,SAAS,CAiBX;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,QAAQ,GAAG,SAAS,EAAE,CAGnD;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,GAAG,SAAS,EAAE,CAK5D;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAI7E;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGlE"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Task Board — lanes (threads connected to the board).
|
|
3
|
-
*
|
|
4
|
-
* A lane is a thread the operator has connected; only connected lanes are
|
|
5
|
-
* dispatched, and a lane's cards are drained by workers branched from that
|
|
6
|
-
* thread (design §3). Connecting is idempotent.
|
|
7
|
-
*/
|
|
8
|
-
import { nowISO } from "../memory/utils.js";
|
|
9
|
-
function mapRow(row) {
|
|
10
|
-
return {
|
|
11
|
-
threadId: row.thread_id,
|
|
12
|
-
connected: row.connected === 1,
|
|
13
|
-
maxConcurrent: row.max_concurrent,
|
|
14
|
-
createdAt: row.created_at,
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
export function upsertLane(db, threadId, opts = {}) {
|
|
18
|
-
db.prepare(`INSERT INTO board_lanes (thread_id, connected, max_concurrent, created_at)
|
|
19
|
-
VALUES (?, ?, ?, ?)
|
|
20
|
-
ON CONFLICT(thread_id) DO UPDATE SET
|
|
21
|
-
connected = COALESCE(?, board_lanes.connected),
|
|
22
|
-
max_concurrent = COALESCE(?, board_lanes.max_concurrent)`).run(threadId, opts.connected === false ? 0 : 1, opts.maxConcurrent ?? 1, nowISO(), opts.connected === undefined ? null : opts.connected ? 1 : 0, opts.maxConcurrent ?? null);
|
|
23
|
-
const row = db.prepare(`SELECT * FROM board_lanes WHERE thread_id = ?`).get(threadId);
|
|
24
|
-
return mapRow(row);
|
|
25
|
-
}
|
|
26
|
-
export function listLanes(db) {
|
|
27
|
-
const rows = db.prepare(`SELECT * FROM board_lanes ORDER BY created_at ASC`).all();
|
|
28
|
-
return rows.map(mapRow);
|
|
29
|
-
}
|
|
30
|
-
export function listConnectedLanes(db) {
|
|
31
|
-
const rows = db
|
|
32
|
-
.prepare(`SELECT * FROM board_lanes WHERE connected = 1 ORDER BY created_at ASC`)
|
|
33
|
-
.all();
|
|
34
|
-
return rows.map(mapRow);
|
|
35
|
-
}
|
|
36
|
-
export function getLane(db, threadId) {
|
|
37
|
-
const row = db.prepare(`SELECT * FROM board_lanes WHERE thread_id = ?`).get(threadId);
|
|
38
|
-
return row ? mapRow(row) : undefined;
|
|
39
|
-
}
|
|
40
|
-
export function removeLane(db, threadId) {
|
|
41
|
-
const result = db.prepare(`DELETE FROM board_lanes WHERE thread_id = ?`).run(threadId);
|
|
42
|
-
return result.changes > 0;
|
|
43
|
-
}
|
|
44
|
-
//# sourceMappingURL=lane.repository.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lane.repository.js","sourceRoot":"","sources":["../../../src/data/board/lane.repository.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAU5C,SAAS,MAAM,CAAC,GAAY;IAC1B,OAAO;QACL,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,SAAS,EAAE,GAAG,CAAC,SAAS,KAAK,CAAC;QAC9B,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,EAAY,EACZ,QAAgB,EAChB,OAAwD,EAAE;IAE1D,EAAE,CAAC,OAAO,CACR;;;;gEAI4D,CAC7D,CAAC,GAAG,CACH,QAAQ,EACR,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAChC,IAAI,CAAC,aAAa,IAAI,CAAC,EACvB,MAAM,EAAE,EACR,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC5D,IAAI,CAAC,aAAa,IAAI,IAAI,CAC3B,CAAC;IACF,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAY,CAAC;IACjG,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAAY;IACpC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC,GAAG,EAAe,CAAC;IAChG,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EAAY;IAC7C,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CAAC,uEAAuE,CAAC;SAChF,GAAG,EAAe,CAAC;IACtB,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,EAAY,EAAE,QAAgB;IACpD,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC,GAAG,CAAC,QAAQ,CAC/D,CAAC;IACtB,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAY,EAAE,QAAgB;IACvD,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvF,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Task Board — execution-profile templates.
|
|
3
|
-
*
|
|
4
|
-
* The card's type seeds its execution profile so a routine card is one click,
|
|
5
|
-
* not twelve toggles (spec §4 "Type", design §2). Built-in defaults below;
|
|
6
|
-
* the operator can override per-type via ~/.remote-copilot-mcp/board-profiles.json
|
|
7
|
-
* (same shape: { "<type>": { ...ExecutionProfile } }), edited from the dashboard.
|
|
8
|
-
*/
|
|
9
|
-
import type { CardType, ExecutionProfile } from "./board-types.js";
|
|
10
|
-
/** Built-in per-type defaults. `bug` is the full-rigor path; `chore` the light
|
|
11
|
-
* one. Keyed by CardType so a new built-in type cannot silently miss a profile. */
|
|
12
|
-
export declare const BUILTIN_PROFILE_DEFAULTS: Record<CardType, ExecutionProfile>;
|
|
13
|
-
/** Effective per-type profile templates: built-ins shallow-merged with operator overrides. */
|
|
14
|
-
export declare function getProfileTemplates(): Record<string, ExecutionProfile>;
|
|
15
|
-
/** Default profile for a card type (empty profile for unknown types). */
|
|
16
|
-
export declare function getProfileForType(type: string): ExecutionProfile;
|
|
17
|
-
/** Persist operator overrides (dashboard PUT /api/board/profiles). Write-then-rename. */
|
|
18
|
-
export declare function saveProfileOverrides(overrides: Record<string, ExecutionProfile>): void;
|
|
19
|
-
//# sourceMappingURL=profile-defaults.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"profile-defaults.d.ts","sourceRoot":"","sources":["../../../src/data/board/profile-defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAInE;oFACoF;AACpF,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAwDvE,CAAC;AA2BF,8FAA8F;AAC9F,wBAAgB,mBAAmB,IAAI,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAQtE;AAED,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAEhE;AAED,yFAAyF;AACzF,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,IAAI,CAItF"}
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Task Board — execution-profile templates.
|
|
3
|
-
*
|
|
4
|
-
* The card's type seeds its execution profile so a routine card is one click,
|
|
5
|
-
* not twelve toggles (spec §4 "Type", design §2). Built-in defaults below;
|
|
6
|
-
* the operator can override per-type via ~/.remote-copilot-mcp/board-profiles.json
|
|
7
|
-
* (same shape: { "<type>": { ...ExecutionProfile } }), edited from the dashboard.
|
|
8
|
-
*/
|
|
9
|
-
import { existsSync, readFileSync, statSync, writeFileSync, renameSync } from "node:fs";
|
|
10
|
-
import { homedir } from "node:os";
|
|
11
|
-
import { join } from "node:path";
|
|
12
|
-
import { log } from "../../lib/logger.js";
|
|
13
|
-
import { errorMessage } from "../../lib/utils.js";
|
|
14
|
-
const OVERRIDES_PATH = join(homedir(), ".remote-copilot-mcp", "board-profiles.json");
|
|
15
|
-
/** Built-in per-type defaults. `bug` is the full-rigor path; `chore` the light
|
|
16
|
-
* one. Keyed by CardType so a new built-in type cannot silently miss a profile. */
|
|
17
|
-
export const BUILTIN_PROFILE_DEFAULTS = {
|
|
18
|
-
bug: {
|
|
19
|
-
createBranch: true,
|
|
20
|
-
runTests: true,
|
|
21
|
-
openPr: true,
|
|
22
|
-
expertReview: true,
|
|
23
|
-
push: true,
|
|
24
|
-
ciCheck: "github",
|
|
25
|
-
workerSplit: "single",
|
|
26
|
-
},
|
|
27
|
-
feature: {
|
|
28
|
-
createBranch: true,
|
|
29
|
-
runTests: true,
|
|
30
|
-
build: true,
|
|
31
|
-
openPr: true,
|
|
32
|
-
expertReview: true,
|
|
33
|
-
push: true,
|
|
34
|
-
ciCheck: "github",
|
|
35
|
-
workerSplit: "single",
|
|
36
|
-
},
|
|
37
|
-
"tech-debt": {
|
|
38
|
-
createBranch: true,
|
|
39
|
-
runTests: true,
|
|
40
|
-
openPr: true,
|
|
41
|
-
expertReview: false,
|
|
42
|
-
push: true,
|
|
43
|
-
ciCheck: "github",
|
|
44
|
-
workerSplit: "single",
|
|
45
|
-
},
|
|
46
|
-
chore: {
|
|
47
|
-
createBranch: false,
|
|
48
|
-
runTests: false,
|
|
49
|
-
openPr: false,
|
|
50
|
-
expertReview: false,
|
|
51
|
-
push: false,
|
|
52
|
-
ciCheck: "none",
|
|
53
|
-
workerSplit: "single",
|
|
54
|
-
},
|
|
55
|
-
research: {
|
|
56
|
-
createBranch: false,
|
|
57
|
-
runTests: false,
|
|
58
|
-
openPr: false,
|
|
59
|
-
expertReview: false,
|
|
60
|
-
push: false,
|
|
61
|
-
ciCheck: "none",
|
|
62
|
-
workerSplit: "single",
|
|
63
|
-
},
|
|
64
|
-
"recurring-ops": {
|
|
65
|
-
createBranch: false,
|
|
66
|
-
runTests: false,
|
|
67
|
-
openPr: false,
|
|
68
|
-
expertReview: false,
|
|
69
|
-
push: false,
|
|
70
|
-
ciCheck: "none",
|
|
71
|
-
workerSplit: "single",
|
|
72
|
-
},
|
|
73
|
-
};
|
|
74
|
-
// mtime-keyed cache: overrides are read on EVERY card create/validate, and the
|
|
75
|
-
// file changes only when the operator saves from the dashboard.
|
|
76
|
-
let overridesCache = null;
|
|
77
|
-
function loadOverrides() {
|
|
78
|
-
if (!existsSync(OVERRIDES_PATH)) {
|
|
79
|
-
overridesCache = null;
|
|
80
|
-
return {};
|
|
81
|
-
}
|
|
82
|
-
try {
|
|
83
|
-
const mtimeMs = statSync(OVERRIDES_PATH).mtimeMs;
|
|
84
|
-
if (overridesCache && overridesCache.mtimeMs === mtimeMs)
|
|
85
|
-
return overridesCache.data;
|
|
86
|
-
const parsed = JSON.parse(readFileSync(OVERRIDES_PATH, "utf-8"));
|
|
87
|
-
const data = typeof parsed === "object" && parsed !== null
|
|
88
|
-
? parsed
|
|
89
|
-
: {};
|
|
90
|
-
overridesCache = { mtimeMs, data };
|
|
91
|
-
return data;
|
|
92
|
-
}
|
|
93
|
-
catch (err) {
|
|
94
|
-
log.warn(`[board] Malformed board-profiles.json — ignoring overrides: ${errorMessage(err)}`);
|
|
95
|
-
return {};
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
/** Effective per-type profile templates: built-ins shallow-merged with operator overrides. */
|
|
99
|
-
export function getProfileTemplates() {
|
|
100
|
-
const overrides = loadOverrides();
|
|
101
|
-
const builtins = BUILTIN_PROFILE_DEFAULTS;
|
|
102
|
-
const merged = {};
|
|
103
|
-
for (const type of new Set([...Object.keys(builtins), ...Object.keys(overrides)])) {
|
|
104
|
-
merged[type] = { ...builtins[type], ...overrides[type] };
|
|
105
|
-
}
|
|
106
|
-
return merged;
|
|
107
|
-
}
|
|
108
|
-
/** Default profile for a card type (empty profile for unknown types). */
|
|
109
|
-
export function getProfileForType(type) {
|
|
110
|
-
return getProfileTemplates()[type] ?? {};
|
|
111
|
-
}
|
|
112
|
-
/** Persist operator overrides (dashboard PUT /api/board/profiles). Write-then-rename. */
|
|
113
|
-
export function saveProfileOverrides(overrides) {
|
|
114
|
-
const tmp = `${OVERRIDES_PATH}.tmp`;
|
|
115
|
-
writeFileSync(tmp, JSON.stringify(overrides, null, 2), "utf-8");
|
|
116
|
-
renameSync(tmp, OVERRIDES_PATH);
|
|
117
|
-
}
|
|
118
|
-
//# sourceMappingURL=profile-defaults.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"profile-defaults.js","sourceRoot":"","sources":["../../../src/data/board/profile-defaults.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Board awareness signals — exactly three kinds, one line each, no description
|
|
3
|
-
* (invariant #4). STARTED / DONE / BLOCKED go to the card's LANE thread.
|
|
4
|
-
*
|
|
5
|
-
* Delivery mode is deliberately isolated in this one function while decision
|
|
6
|
-
* #2 is with the operator (thread 1327, 2026-08-01):
|
|
7
|
-
* - "passive" (default, orchestrator's lean): rides the passive-notice
|
|
8
|
-
* channel — seen on the lane's next delivered turn, never acted on.
|
|
9
|
-
* - "mailbox": appended to the lane's pending-task mailbox (spec §3 wording)
|
|
10
|
-
* — wakes the lane agent with an FYI-framed line.
|
|
11
|
-
* Flip via BOARD_SIGNAL_DELIVERY=mailbox; no other code changes.
|
|
12
|
-
*/
|
|
13
|
-
import type { BoardCard } from "../../data/board/board-types.js";
|
|
14
|
-
export type BoardSignalKind = "STARTED" | "DONE" | "BLOCKED";
|
|
15
|
-
/** One-line, FYI-framed state transition. `detail` is used ONLY for BLOCKED
|
|
16
|
-
* (a one-line reason is what makes the ping actionable for the operator). */
|
|
17
|
-
export declare function sendBoardSignal(card: BoardCard, kind: BoardSignalKind, detail?: string): void;
|
|
18
|
-
/**
|
|
19
|
-
* Selective escalation (invariant #4): a card the operator hand-flagged
|
|
20
|
-
* "important to me" mirrors its notable updates (worker reports, block
|
|
21
|
-
* reasons) into the main thread as passive notices — aware, not commanded.
|
|
22
|
-
* Deterministic: no agent judges importance; the flag decides, always.
|
|
23
|
-
*/
|
|
24
|
-
export declare function mirrorEscalatedUpdate(card: BoardCard, text: string): void;
|
|
25
|
-
//# sourceMappingURL=board-signals.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"board-signals.d.ts","sourceRoot":"","sources":["../../../src/services/board/board-signals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAEjE,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;AAsB7D;8EAC8E;AAC9E,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAsB7F;AAQD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAczE"}
|