@shardworks/nexus-core 0.1.60 → 0.1.61
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/clockworks.d.ts.map +1 -1
- package/dist/clockworks.js +76 -59
- package/dist/clockworks.js.map +1 -1
- package/dist/commission.d.ts +8 -3
- package/dist/commission.d.ts.map +1 -1
- package/dist/commission.js +36 -21
- package/dist/commission.js.map +1 -1
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +2 -4
- package/dist/events.js.map +1 -1
- package/dist/guild-config.d.ts +8 -0
- package/dist/guild-config.d.ts.map +1 -1
- package/dist/guild-config.js.map +1 -1
- package/dist/index.d.ts +2 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -4
- package/dist/index.js.map +1 -1
- package/dist/session.d.ts +4 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +5 -3
- package/dist/session.js.map +1 -1
- package/dist/writ.d.ts +100 -0
- package/dist/writ.d.ts.map +1 -0
- package/dist/writ.js +489 -0
- package/dist/writ.js.map +1 -0
- package/package.json +1 -1
- package/dist/job.d.ts +0 -53
- package/dist/job.d.ts.map +0 -1
- package/dist/job.js +0 -175
- package/dist/job.js.map +0 -1
- package/dist/piece.d.ts +0 -49
- package/dist/piece.d.ts.map +0 -1
- package/dist/piece.js +0 -164
- package/dist/piece.js.map +0 -1
- package/dist/stroke.d.ts +0 -27
- package/dist/stroke.d.ts.map +0 -1
- package/dist/stroke.js +0 -101
- package/dist/stroke.js.map +0 -1
- package/dist/work.d.ts +0 -48
- package/dist/work.d.ts.map +0 -1
- package/dist/work.js +0 -157
- package/dist/work.js.map +0 -1
package/dist/writ.js
ADDED
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Writ — the unified work tracking primitive.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the rigid four-level hierarchy (work, piece, job, stroke) with
|
|
5
|
+
* a single typed, tree-structured model. Every summon gets a writ. Writs
|
|
6
|
+
* are the system's memory of outstanding obligations.
|
|
7
|
+
*
|
|
8
|
+
* Status lifecycle:
|
|
9
|
+
* ready → active → completed
|
|
10
|
+
* → failed
|
|
11
|
+
* → pending → ready (cycle)
|
|
12
|
+
* → cancelled
|
|
13
|
+
*
|
|
14
|
+
* See docs/writs.md for the full design.
|
|
15
|
+
*/
|
|
16
|
+
import Database from 'better-sqlite3';
|
|
17
|
+
import { booksPath } from "./nexus-home.js";
|
|
18
|
+
import { readGuildConfig } from "./guild-config.js";
|
|
19
|
+
import { generateId } from "./id.js";
|
|
20
|
+
import { signalEvent } from "./events.js";
|
|
21
|
+
// ── Constants ──────────────────────────────────────────────────────────
|
|
22
|
+
/** Built-in writ types that don't need guild.json declaration. */
|
|
23
|
+
export const BUILTIN_WRIT_TYPES = ['mandate', 'summon'];
|
|
24
|
+
function rowToRecord(row) {
|
|
25
|
+
return {
|
|
26
|
+
id: row.id,
|
|
27
|
+
type: row.type,
|
|
28
|
+
title: row.title,
|
|
29
|
+
description: row.description,
|
|
30
|
+
status: row.status,
|
|
31
|
+
parentId: row.parent_id,
|
|
32
|
+
sessionId: row.session_id,
|
|
33
|
+
createdAt: row.created_at,
|
|
34
|
+
updatedAt: row.updated_at,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const SELECT_COLS = `id, type, title, description, status, parent_id, session_id, created_at, updated_at`;
|
|
38
|
+
function readWritById(db, writId) {
|
|
39
|
+
const row = db.prepare(`SELECT ${SELECT_COLS} FROM writs WHERE id = ?`).get(writId);
|
|
40
|
+
return row ? rowToRecord(row) : null;
|
|
41
|
+
}
|
|
42
|
+
// ── Type Validation ────────────────────────────────────────────────────
|
|
43
|
+
/**
|
|
44
|
+
* Validate that a writ type is declared in guild.json or is a built-in type.
|
|
45
|
+
* Throws if the type is unknown.
|
|
46
|
+
*/
|
|
47
|
+
export function validateWritType(home, type) {
|
|
48
|
+
if (BUILTIN_WRIT_TYPES.includes(type))
|
|
49
|
+
return;
|
|
50
|
+
const config = readGuildConfig(home);
|
|
51
|
+
const declared = config.writTypes ?? {};
|
|
52
|
+
if (!Object.hasOwn(declared, type)) {
|
|
53
|
+
const available = [
|
|
54
|
+
...BUILTIN_WRIT_TYPES,
|
|
55
|
+
...Object.keys(declared),
|
|
56
|
+
];
|
|
57
|
+
throw new Error(`Writ type "${type}" is not declared in guild.json writTypes. ` +
|
|
58
|
+
`Available types: ${available.join(', ')}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// ── CRUD ───────────────────────────────────────────────────────────────
|
|
62
|
+
/**
|
|
63
|
+
* Create a writ. Validates type against guild.json. Fires `<type>.ready`.
|
|
64
|
+
*/
|
|
65
|
+
export function createWrit(home, opts) {
|
|
66
|
+
validateWritType(home, opts.type);
|
|
67
|
+
const db = new Database(booksPath(home));
|
|
68
|
+
db.pragma('foreign_keys = ON');
|
|
69
|
+
try {
|
|
70
|
+
const id = generateId('wrt');
|
|
71
|
+
db.prepare(`INSERT INTO writs (id, type, title, description, parent_id) VALUES (?, ?, ?, ?, ?)`).run(id, opts.type, opts.title, opts.description ?? null, opts.parentId ?? null);
|
|
72
|
+
db.prepare(`INSERT INTO audit_log (id, actor, action, target_type, target_id, detail) VALUES (?, ?, ?, ?, ?, ?)`).run(generateId('aud'), 'framework', 'writ_created', 'writ', id, JSON.stringify(opts));
|
|
73
|
+
const record = readWritById(db, id);
|
|
74
|
+
signalEvent(home, `${opts.type}.ready`, {
|
|
75
|
+
writId: id,
|
|
76
|
+
parentId: opts.parentId ?? null,
|
|
77
|
+
type: opts.type,
|
|
78
|
+
}, 'framework');
|
|
79
|
+
return record;
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
db.close();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Read a single writ by ID.
|
|
87
|
+
*/
|
|
88
|
+
export function readWrit(home, writId) {
|
|
89
|
+
const db = new Database(booksPath(home));
|
|
90
|
+
db.pragma('foreign_keys = ON');
|
|
91
|
+
try {
|
|
92
|
+
return readWritById(db, writId);
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
db.close();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* List writs with optional filters.
|
|
100
|
+
*/
|
|
101
|
+
export function listWrits(home, opts = {}) {
|
|
102
|
+
const db = new Database(booksPath(home));
|
|
103
|
+
db.pragma('foreign_keys = ON');
|
|
104
|
+
try {
|
|
105
|
+
let query = `SELECT ${SELECT_COLS} FROM writs`;
|
|
106
|
+
const conditions = [];
|
|
107
|
+
const params = [];
|
|
108
|
+
if (opts.parentId !== undefined) {
|
|
109
|
+
if (opts.parentId === null) {
|
|
110
|
+
conditions.push(`parent_id IS NULL`);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
conditions.push(`parent_id = ?`);
|
|
114
|
+
params.push(opts.parentId);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (opts.type) {
|
|
118
|
+
conditions.push(`type = ?`);
|
|
119
|
+
params.push(opts.type);
|
|
120
|
+
}
|
|
121
|
+
if (opts.status) {
|
|
122
|
+
conditions.push(`status = ?`);
|
|
123
|
+
params.push(opts.status);
|
|
124
|
+
}
|
|
125
|
+
if (conditions.length > 0)
|
|
126
|
+
query += ` WHERE ${conditions.join(' AND ')}`;
|
|
127
|
+
query += ` ORDER BY created_at DESC`;
|
|
128
|
+
const rows = db.prepare(query).all(...params);
|
|
129
|
+
return rows.map(rowToRecord);
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
db.close();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// ── Status Transitions ─────────────────────────────────────────────────
|
|
136
|
+
/**
|
|
137
|
+
* Activate a writ: ready → active. Sets session_id. No event fired.
|
|
138
|
+
*/
|
|
139
|
+
export function activateWrit(home, writId, sessionId) {
|
|
140
|
+
const db = new Database(booksPath(home));
|
|
141
|
+
db.pragma('foreign_keys = ON');
|
|
142
|
+
try {
|
|
143
|
+
const current = readWritById(db, writId);
|
|
144
|
+
if (!current)
|
|
145
|
+
throw new Error(`Writ "${writId}" not found.`);
|
|
146
|
+
if (current.status !== 'ready') {
|
|
147
|
+
throw new Error(`Cannot activate writ "${writId}" — status is "${current.status}", expected "ready".`);
|
|
148
|
+
}
|
|
149
|
+
db.prepare(`UPDATE writs SET status = 'active', session_id = ?, updated_at = datetime('now') WHERE id = ?`).run(sessionId, writId);
|
|
150
|
+
db.prepare(`INSERT INTO audit_log (id, actor, action, target_type, target_id, detail) VALUES (?, ?, ?, ?, ?, ?)`).run(generateId('aud'), 'framework', 'writ_activated', 'writ', writId, JSON.stringify({ sessionId }));
|
|
151
|
+
return readWritById(db, writId);
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
db.close();
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Complete a writ. Called by complete-session.
|
|
159
|
+
* - No children or all children complete → completed, fires <type>.completed, triggers rollup.
|
|
160
|
+
* - Incomplete children exist → pending. No event fired.
|
|
161
|
+
*/
|
|
162
|
+
export function completeWrit(home, writId) {
|
|
163
|
+
const db = new Database(booksPath(home));
|
|
164
|
+
db.pragma('foreign_keys = ON');
|
|
165
|
+
try {
|
|
166
|
+
const current = readWritById(db, writId);
|
|
167
|
+
if (!current)
|
|
168
|
+
throw new Error(`Writ "${writId}" not found.`);
|
|
169
|
+
if (current.status !== 'active') {
|
|
170
|
+
throw new Error(`Cannot complete writ "${writId}" — status is "${current.status}", expected "active".`);
|
|
171
|
+
}
|
|
172
|
+
// Check children
|
|
173
|
+
const children = db.prepare(`SELECT status FROM writs WHERE parent_id = ?`).all(writId);
|
|
174
|
+
const hasIncomplete = children.some(c => c.status !== 'completed' && c.status !== 'cancelled');
|
|
175
|
+
if (children.length > 0 && hasIncomplete) {
|
|
176
|
+
// Incomplete children → pending
|
|
177
|
+
db.prepare(`UPDATE writs SET status = 'pending', session_id = NULL, updated_at = datetime('now') WHERE id = ?`).run(writId);
|
|
178
|
+
db.prepare(`INSERT INTO audit_log (id, actor, action, target_type, target_id, detail) VALUES (?, ?, ?, ?, ?, ?)`).run(generateId('aud'), 'framework', 'writ_pending', 'writ', writId, JSON.stringify({ reason: 'incomplete children', childCount: children.length }));
|
|
179
|
+
return readWritById(db, writId);
|
|
180
|
+
}
|
|
181
|
+
// No children or all complete → completed
|
|
182
|
+
db.prepare(`UPDATE writs SET status = 'completed', session_id = NULL, updated_at = datetime('now') WHERE id = ?`).run(writId);
|
|
183
|
+
db.prepare(`INSERT INTO audit_log (id, actor, action, target_type, target_id, detail) VALUES (?, ?, ?, ?, ?, ?)`).run(generateId('aud'), 'framework', 'writ_completed', 'writ', writId, null);
|
|
184
|
+
// Fire completion event
|
|
185
|
+
signalEvent(home, `${current.type}.completed`, {
|
|
186
|
+
writId,
|
|
187
|
+
parentId: current.parentId,
|
|
188
|
+
type: current.type,
|
|
189
|
+
}, 'framework');
|
|
190
|
+
// Handle mandate → commission completion
|
|
191
|
+
if (current.type === 'mandate') {
|
|
192
|
+
completeMandateCommission(db, home, writId);
|
|
193
|
+
}
|
|
194
|
+
// Trigger rollup on parent
|
|
195
|
+
if (current.parentId) {
|
|
196
|
+
rollupParent(home, current.parentId);
|
|
197
|
+
}
|
|
198
|
+
return readWritById(db, writId);
|
|
199
|
+
}
|
|
200
|
+
finally {
|
|
201
|
+
db.close();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Fail a writ. Terminal. Cascades cancellation to incomplete children.
|
|
206
|
+
*/
|
|
207
|
+
export function failWrit(home, writId) {
|
|
208
|
+
const db = new Database(booksPath(home));
|
|
209
|
+
db.pragma('foreign_keys = ON');
|
|
210
|
+
try {
|
|
211
|
+
const current = readWritById(db, writId);
|
|
212
|
+
if (!current)
|
|
213
|
+
throw new Error(`Writ "${writId}" not found.`);
|
|
214
|
+
if (current.status !== 'active') {
|
|
215
|
+
throw new Error(`Cannot fail writ "${writId}" — status is "${current.status}", expected "active".`);
|
|
216
|
+
}
|
|
217
|
+
db.prepare(`UPDATE writs SET status = 'failed', session_id = NULL, updated_at = datetime('now') WHERE id = ?`).run(writId);
|
|
218
|
+
db.prepare(`INSERT INTO audit_log (id, actor, action, target_type, target_id, detail) VALUES (?, ?, ?, ?, ?, ?)`).run(generateId('aud'), 'framework', 'writ_failed', 'writ', writId, null);
|
|
219
|
+
// Fire failure event
|
|
220
|
+
signalEvent(home, `${current.type}.failed`, {
|
|
221
|
+
writId,
|
|
222
|
+
parentId: current.parentId,
|
|
223
|
+
type: current.type,
|
|
224
|
+
}, 'framework');
|
|
225
|
+
// Cascade: cancel incomplete children (not active ones — let them finish)
|
|
226
|
+
cascadeCancelChildren(db, home, writId);
|
|
227
|
+
return readWritById(db, writId);
|
|
228
|
+
}
|
|
229
|
+
finally {
|
|
230
|
+
db.close();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Cancel a writ. Cascades cancellation to incomplete children.
|
|
235
|
+
*/
|
|
236
|
+
export function cancelWrit(home, writId) {
|
|
237
|
+
const db = new Database(booksPath(home));
|
|
238
|
+
db.pragma('foreign_keys = ON');
|
|
239
|
+
try {
|
|
240
|
+
const current = readWritById(db, writId);
|
|
241
|
+
if (!current)
|
|
242
|
+
throw new Error(`Writ "${writId}" not found.`);
|
|
243
|
+
if (current.status === 'completed' || current.status === 'failed' || current.status === 'cancelled') {
|
|
244
|
+
throw new Error(`Cannot cancel writ "${writId}" — status is "${current.status}" (terminal).`);
|
|
245
|
+
}
|
|
246
|
+
db.prepare(`UPDATE writs SET status = 'cancelled', session_id = NULL, updated_at = datetime('now') WHERE id = ?`).run(writId);
|
|
247
|
+
db.prepare(`INSERT INTO audit_log (id, actor, action, target_type, target_id, detail) VALUES (?, ?, ?, ?, ?, ?)`).run(generateId('aud'), 'framework', 'writ_cancelled', 'writ', writId, null);
|
|
248
|
+
signalEvent(home, `${current.type}.cancelled`, {
|
|
249
|
+
writId,
|
|
250
|
+
parentId: current.parentId,
|
|
251
|
+
type: current.type,
|
|
252
|
+
}, 'framework');
|
|
253
|
+
cascadeCancelChildren(db, home, writId);
|
|
254
|
+
return readWritById(db, writId);
|
|
255
|
+
}
|
|
256
|
+
finally {
|
|
257
|
+
db.close();
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Interrupt a writ: active → ready. Session ended without complete-session
|
|
262
|
+
* or fail-writ. Fires <type>.ready for re-dispatch.
|
|
263
|
+
*/
|
|
264
|
+
export function interruptWrit(home, writId) {
|
|
265
|
+
const db = new Database(booksPath(home));
|
|
266
|
+
db.pragma('foreign_keys = ON');
|
|
267
|
+
try {
|
|
268
|
+
const current = readWritById(db, writId);
|
|
269
|
+
if (!current)
|
|
270
|
+
throw new Error(`Writ "${writId}" not found.`);
|
|
271
|
+
if (current.status !== 'active') {
|
|
272
|
+
throw new Error(`Cannot interrupt writ "${writId}" — status is "${current.status}", expected "active".`);
|
|
273
|
+
}
|
|
274
|
+
db.prepare(`UPDATE writs SET status = 'ready', session_id = NULL, updated_at = datetime('now') WHERE id = ?`).run(writId);
|
|
275
|
+
db.prepare(`INSERT INTO audit_log (id, actor, action, target_type, target_id, detail) VALUES (?, ?, ?, ?, ?, ?)`).run(generateId('aud'), 'framework', 'writ_interrupted', 'writ', writId, null);
|
|
276
|
+
// Fire ready event for re-dispatch
|
|
277
|
+
signalEvent(home, `${current.type}.ready`, {
|
|
278
|
+
writId,
|
|
279
|
+
parentId: current.parentId,
|
|
280
|
+
type: current.type,
|
|
281
|
+
}, 'framework');
|
|
282
|
+
return readWritById(db, writId);
|
|
283
|
+
}
|
|
284
|
+
finally {
|
|
285
|
+
db.close();
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
// ── Completion Rollup ──────────────────────────────────────────────────
|
|
289
|
+
/**
|
|
290
|
+
* Completion rollup. When a child completes, check the parent:
|
|
291
|
+
* - Parent is pending and all siblings complete → parent transitions to ready
|
|
292
|
+
* (if standing order exists for <type>.ready) or auto-completes (if not).
|
|
293
|
+
* - Parent is pending and siblings remain incomplete → no action.
|
|
294
|
+
*/
|
|
295
|
+
export function rollupParent(home, parentId) {
|
|
296
|
+
const db = new Database(booksPath(home));
|
|
297
|
+
db.pragma('foreign_keys = ON');
|
|
298
|
+
try {
|
|
299
|
+
const parent = readWritById(db, parentId);
|
|
300
|
+
if (!parent)
|
|
301
|
+
return;
|
|
302
|
+
if (parent.status !== 'pending')
|
|
303
|
+
return;
|
|
304
|
+
// Check if all children are complete
|
|
305
|
+
const children = db.prepare(`SELECT status FROM writs WHERE parent_id = ?`).all(parentId);
|
|
306
|
+
const hasIncomplete = children.some(c => c.status !== 'completed' && c.status !== 'cancelled');
|
|
307
|
+
if (hasIncomplete)
|
|
308
|
+
return;
|
|
309
|
+
// All children complete. Check if a standing order exists for <type>.ready
|
|
310
|
+
const config = readGuildConfig(home);
|
|
311
|
+
const standingOrders = config.clockworks?.standingOrders ?? [];
|
|
312
|
+
const hasStandingOrder = standingOrders.some(so => so.on === `${parent.type}.ready`);
|
|
313
|
+
if (hasStandingOrder) {
|
|
314
|
+
// Transition to ready for re-dispatch (final integration pass)
|
|
315
|
+
db.prepare(`UPDATE writs SET status = 'ready', updated_at = datetime('now') WHERE id = ?`).run(parentId);
|
|
316
|
+
db.prepare(`INSERT INTO audit_log (id, actor, action, target_type, target_id, detail) VALUES (?, ?, ?, ?, ?, ?)`).run(generateId('aud'), 'framework', 'writ_rollup_ready', 'writ', parentId, JSON.stringify({ reason: 'all children complete, standing order exists' }));
|
|
317
|
+
signalEvent(home, `${parent.type}.ready`, {
|
|
318
|
+
writId: parentId,
|
|
319
|
+
parentId: parent.parentId,
|
|
320
|
+
type: parent.type,
|
|
321
|
+
}, 'framework');
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
// Container auto-complete: no standing order, so auto-complete
|
|
325
|
+
db.prepare(`UPDATE writs SET status = 'completed', updated_at = datetime('now') WHERE id = ?`).run(parentId);
|
|
326
|
+
db.prepare(`INSERT INTO audit_log (id, actor, action, target_type, target_id, detail) VALUES (?, ?, ?, ?, ?, ?)`).run(generateId('aud'), 'framework', 'writ_auto_completed', 'writ', parentId, JSON.stringify({ reason: 'all children complete, no standing order for type' }));
|
|
327
|
+
signalEvent(home, `${parent.type}.completed`, {
|
|
328
|
+
writId: parentId,
|
|
329
|
+
parentId: parent.parentId,
|
|
330
|
+
type: parent.type,
|
|
331
|
+
}, 'framework');
|
|
332
|
+
// Handle mandate → commission completion
|
|
333
|
+
if (parent.type === 'mandate') {
|
|
334
|
+
completeMandateCommission(db, home, parentId);
|
|
335
|
+
}
|
|
336
|
+
// Continue rollup up the tree
|
|
337
|
+
if (parent.parentId) {
|
|
338
|
+
// Close this db before recursing (avoids holding multiple connections)
|
|
339
|
+
db.close();
|
|
340
|
+
rollupParent(home, parent.parentId);
|
|
341
|
+
return; // db already closed
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
finally {
|
|
346
|
+
try {
|
|
347
|
+
db.close();
|
|
348
|
+
}
|
|
349
|
+
catch { /* already closed in recursive case */ }
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
// ── Children & Progress ────────────────────────────────────────────────
|
|
353
|
+
/**
|
|
354
|
+
* Get direct children of a writ with nested child counts.
|
|
355
|
+
*/
|
|
356
|
+
export function getWritChildren(home, writId) {
|
|
357
|
+
const db = new Database(booksPath(home));
|
|
358
|
+
db.pragma('foreign_keys = ON');
|
|
359
|
+
try {
|
|
360
|
+
const rows = db.prepare(`SELECT w.id, w.type, w.title, w.status,
|
|
361
|
+
(SELECT COUNT(*) FROM writs c WHERE c.parent_id = w.id) as child_count,
|
|
362
|
+
(SELECT COUNT(*) FROM writs c WHERE c.parent_id = w.id AND c.status IN ('completed', 'cancelled')) as completed_count
|
|
363
|
+
FROM writs w
|
|
364
|
+
WHERE w.parent_id = ?
|
|
365
|
+
ORDER BY w.created_at ASC`).all(writId);
|
|
366
|
+
return rows.map(r => ({
|
|
367
|
+
id: r.id,
|
|
368
|
+
type: r.type,
|
|
369
|
+
title: r.title,
|
|
370
|
+
status: r.status,
|
|
371
|
+
childCount: r.child_count,
|
|
372
|
+
completedCount: r.completed_count,
|
|
373
|
+
}));
|
|
374
|
+
}
|
|
375
|
+
finally {
|
|
376
|
+
db.close();
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Build a markdown progress appendix for resumed sessions.
|
|
381
|
+
* Returns null if the writ has no children.
|
|
382
|
+
*/
|
|
383
|
+
export function buildProgressAppendix(home, writId) {
|
|
384
|
+
const children = getWritChildren(home, writId);
|
|
385
|
+
if (children.length === 0)
|
|
386
|
+
return null;
|
|
387
|
+
const lines = [
|
|
388
|
+
'## Prior Progress',
|
|
389
|
+
'This is a continuation of prior work. Current state of sub-items:',
|
|
390
|
+
'',
|
|
391
|
+
];
|
|
392
|
+
for (const child of children) {
|
|
393
|
+
let icon;
|
|
394
|
+
switch (child.status) {
|
|
395
|
+
case 'completed':
|
|
396
|
+
icon = '✓';
|
|
397
|
+
break;
|
|
398
|
+
case 'failed':
|
|
399
|
+
icon = '✗';
|
|
400
|
+
break;
|
|
401
|
+
case 'cancelled':
|
|
402
|
+
icon = '⊘';
|
|
403
|
+
break;
|
|
404
|
+
case 'active':
|
|
405
|
+
icon = '→';
|
|
406
|
+
break;
|
|
407
|
+
default:
|
|
408
|
+
icon = '○';
|
|
409
|
+
break; // ready, pending
|
|
410
|
+
}
|
|
411
|
+
let suffix = `(${child.status})`;
|
|
412
|
+
if (child.childCount > 0) {
|
|
413
|
+
suffix = `(${child.childCount} ${child.type}s: ${child.completedCount} completed, ${child.childCount - child.completedCount} remaining)`;
|
|
414
|
+
}
|
|
415
|
+
lines.push(`- ${icon} ${child.title} ${suffix}`);
|
|
416
|
+
}
|
|
417
|
+
return lines.join('\n');
|
|
418
|
+
}
|
|
419
|
+
// ── Prompt Template Hydration ──────────────────────────────────────────
|
|
420
|
+
/**
|
|
421
|
+
* Hydrate a prompt template by substituting variables from event payload
|
|
422
|
+
* and writ fields. Returns null if no template provided.
|
|
423
|
+
*
|
|
424
|
+
* Scopes:
|
|
425
|
+
* {{field}} — event payload
|
|
426
|
+
* {{writ.field}} — bound writ (camelCase)
|
|
427
|
+
* {{writ.parent.field}} — parent writ (one level up)
|
|
428
|
+
*/
|
|
429
|
+
export function hydratePromptTemplate(home, template, payload, writId) {
|
|
430
|
+
if (!template)
|
|
431
|
+
return null;
|
|
432
|
+
const writ = readWrit(home, writId);
|
|
433
|
+
const parent = writ?.parentId ? readWrit(home, writ.parentId) : null;
|
|
434
|
+
return template.replace(/\{\{([^}]+)\}\}/g, (_, key) => {
|
|
435
|
+
const k = key.trim();
|
|
436
|
+
if (k.startsWith('writ.parent.')) {
|
|
437
|
+
const field = k.slice('writ.parent.'.length);
|
|
438
|
+
if (!parent)
|
|
439
|
+
return '';
|
|
440
|
+
return String(parent[field] ?? '');
|
|
441
|
+
}
|
|
442
|
+
if (k.startsWith('writ.')) {
|
|
443
|
+
const field = k.slice('writ.'.length);
|
|
444
|
+
if (!writ)
|
|
445
|
+
return '';
|
|
446
|
+
return String(writ[field] ?? '');
|
|
447
|
+
}
|
|
448
|
+
// Direct payload field
|
|
449
|
+
return String(payload[k] ?? '');
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
// ── Internal Helpers ───────────────────────────────────────────────────
|
|
453
|
+
/**
|
|
454
|
+
* Cancel all non-terminal children of a writ (recursive).
|
|
455
|
+
* Active children are left alone — they'll be cancelled when their session reports back.
|
|
456
|
+
*/
|
|
457
|
+
function cascadeCancelChildren(db, home, parentId) {
|
|
458
|
+
const children = db.prepare(`SELECT id, type, status FROM writs WHERE parent_id = ?`).all(parentId);
|
|
459
|
+
for (const child of children) {
|
|
460
|
+
if (child.status === 'completed' || child.status === 'failed' || child.status === 'cancelled') {
|
|
461
|
+
continue; // terminal — leave it
|
|
462
|
+
}
|
|
463
|
+
if (child.status === 'active') {
|
|
464
|
+
continue; // let active sessions finish; they'll be cancelled on report-back
|
|
465
|
+
}
|
|
466
|
+
// Cancel ready or pending children
|
|
467
|
+
db.prepare(`UPDATE writs SET status = 'cancelled', session_id = NULL, updated_at = datetime('now') WHERE id = ?`).run(child.id);
|
|
468
|
+
db.prepare(`INSERT INTO audit_log (id, actor, action, target_type, target_id, detail) VALUES (?, ?, ?, ?, ?, ?)`).run(generateId('aud'), 'framework', 'writ_cascade_cancelled', 'writ', child.id, JSON.stringify({ reason: 'parent failed/cancelled' }));
|
|
469
|
+
signalEvent(home, `${child.type}.cancelled`, {
|
|
470
|
+
writId: child.id,
|
|
471
|
+
parentId,
|
|
472
|
+
type: child.type,
|
|
473
|
+
}, 'framework');
|
|
474
|
+
// Recurse into this child's children
|
|
475
|
+
cascadeCancelChildren(db, home, child.id);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* When a mandate writ completes, mark its commission as completed.
|
|
480
|
+
*/
|
|
481
|
+
function completeMandateCommission(db, home, writId) {
|
|
482
|
+
const row = db.prepare(`SELECT id FROM commissions WHERE writ_id = ?`).get(writId);
|
|
483
|
+
if (row) {
|
|
484
|
+
db.prepare(`UPDATE commissions SET status = 'completed', status_reason = 'mandate completed', updated_at = datetime('now') WHERE id = ?`).run(row.id);
|
|
485
|
+
db.prepare(`INSERT INTO audit_log (id, actor, action, target_type, target_id, detail) VALUES (?, ?, ?, ?, ?, ?)`).run(generateId('aud'), 'framework', 'commission_completed', 'commission', row.id, JSON.stringify({ mandateWritId: writId }));
|
|
486
|
+
signalEvent(home, 'commission.completed', { commissionId: row.id }, 'framework');
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
//# sourceMappingURL=writ.js.map
|
package/dist/writ.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writ.js","sourceRoot":"","sources":["../src/writ.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/dist/job.d.ts
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
export interface CompletionCheck {
|
|
2
|
-
complete: boolean;
|
|
3
|
-
total: number;
|
|
4
|
-
done: number;
|
|
5
|
-
pending: number;
|
|
6
|
-
failed: number;
|
|
7
|
-
}
|
|
8
|
-
export interface CompletionResult {
|
|
9
|
-
changed: boolean;
|
|
10
|
-
newStatus: string;
|
|
11
|
-
}
|
|
12
|
-
export interface JobRecord {
|
|
13
|
-
id: string;
|
|
14
|
-
pieceId: string | null;
|
|
15
|
-
title: string;
|
|
16
|
-
description: string | null;
|
|
17
|
-
status: string;
|
|
18
|
-
assignee: string | null;
|
|
19
|
-
createdAt: string;
|
|
20
|
-
updatedAt: string;
|
|
21
|
-
}
|
|
22
|
-
export interface CreateJobOptions {
|
|
23
|
-
title: string;
|
|
24
|
-
description?: string;
|
|
25
|
-
pieceId?: string;
|
|
26
|
-
assignee?: string;
|
|
27
|
-
}
|
|
28
|
-
export interface ListJobsOptions {
|
|
29
|
-
status?: string;
|
|
30
|
-
pieceId?: string;
|
|
31
|
-
assignee?: string;
|
|
32
|
-
}
|
|
33
|
-
export interface UpdateJobOptions {
|
|
34
|
-
title?: string;
|
|
35
|
-
description?: string;
|
|
36
|
-
status?: string;
|
|
37
|
-
assignee?: string;
|
|
38
|
-
}
|
|
39
|
-
export declare function createJob(home: string, opts: CreateJobOptions): JobRecord;
|
|
40
|
-
export declare function listJobs(home: string, opts?: ListJobsOptions): JobRecord[];
|
|
41
|
-
export declare function showJob(home: string, jobId: string): JobRecord | null;
|
|
42
|
-
export declare function updateJob(home: string, jobId: string, opts: UpdateJobOptions): JobRecord;
|
|
43
|
-
/**
|
|
44
|
-
* Check job completion — counts child strokes.
|
|
45
|
-
*/
|
|
46
|
-
export declare function checkJobCompletion(home: string, jobId: string): CompletionCheck;
|
|
47
|
-
/**
|
|
48
|
-
* Complete a job if all strokes are done (complete or failed, none pending).
|
|
49
|
-
* Sets job to 'completed' if no strokes failed, 'failed' if any failed.
|
|
50
|
-
* Signals job.completed or job.failed on transition.
|
|
51
|
-
*/
|
|
52
|
-
export declare function completeJobIfReady(home: string, jobId: string): CompletionResult;
|
|
53
|
-
//# sourceMappingURL=job.d.ts.map
|
package/dist/job.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"job.d.ts","sourceRoot":"","sources":["../src/job.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,SAAS,CA2BzE;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,eAAoB,GAAG,SAAS,EAAE,CAyB9E;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAmBrE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,SAAS,CAsCxF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,CAqB/E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAiChF"}
|