@shardworks/nexus-core 0.1.16 → 0.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/clockworks.d.ts +54 -0
  2. package/dist/clockworks.d.ts.map +1 -0
  3. package/dist/clockworks.js +264 -0
  4. package/dist/clockworks.js.map +1 -0
  5. package/dist/commission.d.ts +35 -0
  6. package/dist/commission.d.ts.map +1 -0
  7. package/dist/commission.js +80 -0
  8. package/dist/commission.js.map +1 -0
  9. package/dist/engine.d.ts +60 -0
  10. package/dist/engine.d.ts.map +1 -0
  11. package/dist/engine.js +45 -0
  12. package/dist/engine.js.map +1 -0
  13. package/dist/events.d.ts +49 -0
  14. package/dist/events.d.ts.map +1 -0
  15. package/dist/events.js +134 -0
  16. package/dist/events.js.map +1 -0
  17. package/dist/guild-config.d.ts +37 -3
  18. package/dist/guild-config.d.ts.map +1 -1
  19. package/dist/guild-config.js +1 -1
  20. package/dist/guild-config.js.map +1 -1
  21. package/dist/index.d.ts +6 -2
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +5 -1
  24. package/dist/index.js.map +1 -1
  25. package/dist/init-guild.d.ts.map +1 -1
  26. package/dist/init-guild.js +71 -2
  27. package/dist/init-guild.js.map +1 -1
  28. package/dist/ledger.d.ts +1 -1
  29. package/dist/ledger.d.ts.map +1 -1
  30. package/dist/ledger.js +7 -6
  31. package/dist/ledger.js.map +1 -1
  32. package/dist/rehydrate.d.ts +7 -0
  33. package/dist/rehydrate.d.ts.map +1 -1
  34. package/dist/rehydrate.js +33 -8
  35. package/dist/rehydrate.js.map +1 -1
  36. package/dist/workshop.d.ts +85 -0
  37. package/dist/workshop.d.ts.map +1 -0
  38. package/dist/workshop.js +189 -0
  39. package/dist/workshop.js.map +1 -0
  40. package/package.json +1 -1
  41. package/dist/dispatch.d.ts +0 -26
  42. package/dist/dispatch.d.ts.map +0 -1
  43. package/dist/dispatch.js +0 -55
  44. package/dist/dispatch.js.map +0 -1
@@ -0,0 +1,54 @@
1
+ import type { GuildEvent } from './engine.ts';
2
+ /**
3
+ * Callback for launching anima sessions. Provided by the CLI layer since
4
+ * the core package cannot depend on the CLI or engine-manifest directly.
5
+ *
6
+ * The Clockworks runner calls this when processing a `summon` standing order.
7
+ * The callback should: resolve the role to an anima, manifest it, launch
8
+ * a claude session, wait for exit, and return the result.
9
+ *
10
+ * If no handler is registered, summon orders are recorded but skipped.
11
+ */
12
+ export type SummonHandler = (home: string, event: GuildEvent, roleName: string, noticeType: 'summon' | 'brief') => Promise<{
13
+ animaName: string;
14
+ exitCode: number;
15
+ }>;
16
+ /**
17
+ * Register a summon handler. Called once at CLI startup to wire in the
18
+ * session launcher without creating a circular dependency.
19
+ */
20
+ export declare function registerSummonHandler(handler: SummonHandler): void;
21
+ /** Result of processing a single event. */
22
+ export interface TickResult {
23
+ eventId: number;
24
+ eventName: string;
25
+ dispatches: DispatchSummary[];
26
+ }
27
+ /** Summary of one standing order execution. */
28
+ export interface DispatchSummary {
29
+ handlerType: 'engine' | 'anima';
30
+ handlerName: string;
31
+ status: 'success' | 'error' | 'skipped';
32
+ error?: string;
33
+ }
34
+ /** Result of a full clock run. */
35
+ export interface ClockRunResult {
36
+ processed: TickResult[];
37
+ totalEvents: number;
38
+ }
39
+ /**
40
+ * Process the next pending event (or a specific event by id).
41
+ *
42
+ * @param home - Guild root path.
43
+ * @param eventId - Specific event id to process, or undefined for next pending.
44
+ * @returns Processing result, or null if no events to process.
45
+ */
46
+ export declare function clockTick(home: string, eventId?: number): Promise<TickResult | null>;
47
+ /**
48
+ * Process all pending events until the queue is empty.
49
+ *
50
+ * @param home - Guild root path.
51
+ * @returns Summary of all processing.
52
+ */
53
+ export declare function clockRun(home: string): Promise<ClockRunResult>;
54
+ //# sourceMappingURL=clockworks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clockworks.d.ts","sourceRoot":"","sources":["../src/clockworks.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI9C;;;;;;;;;GASG;AACH,MAAM,MAAM,aAAa,GAAG,CAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,QAAQ,GAAG,OAAO,KAC3B,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAItD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAElE;AAED,2CAA2C;AAC3C,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,eAAe,EAAE,CAAC;CAC/B;AAED,+CAA+C;AAC/C,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,kCAAkC;AAClC,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB;AAwOD;;;;;;GAMG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAa1F;AAED;;;;;GAKG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAkBpE"}
@@ -0,0 +1,264 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ /**
10
+ * Clockworks runner — processes the event queue by matching pending events
11
+ * to standing orders in guild.json and executing them.
12
+ *
13
+ * This is the core of Pillar 5. It reads unprocessed events from the Ledger,
14
+ * finds matching standing orders, and dispatches them (run engines, or
15
+ * summon/brief animas). Each event is marked as processed after all its
16
+ * standing orders have been dispatched.
17
+ */
18
+ import path from 'node:path';
19
+ import Database from 'better-sqlite3';
20
+ import { readGuildConfig } from "./guild-config.js";
21
+ import { readPendingEvents, readEvent, markEventProcessed, recordDispatch, signalEvent, } from "./events.js";
22
+ import { isClockworkEngine } from "./engine.js";
23
+ import { ledgerPath } from "./nexus-home.js";
24
+ import { updateCommissionStatus } from "./commission.js";
25
+ let _summonHandler = null;
26
+ /**
27
+ * Register a summon handler. Called once at CLI startup to wire in the
28
+ * session launcher without creating a circular dependency.
29
+ */
30
+ export function registerSummonHandler(handler) {
31
+ _summonHandler = handler;
32
+ }
33
+ /**
34
+ * Process a single event: find matching standing orders and execute them.
35
+ *
36
+ * @param home - Absolute path to the guild root.
37
+ * @param event - The event to process.
38
+ * @returns Summary of what was dispatched.
39
+ */
40
+ async function processEvent(home, event) {
41
+ const config = readGuildConfig(home);
42
+ const standingOrders = config.clockworks?.standingOrders ?? [];
43
+ const matching = standingOrders.filter(so => so.on === event.name);
44
+ const dispatches = [];
45
+ // Check loop guard: don't process standing-order.failed events triggered
46
+ // by other standing-order.failed events.
47
+ const isFailureEvent = event.name === 'standing-order.failed';
48
+ const isNestedFailure = isFailureEvent &&
49
+ typeof event.payload === 'object' &&
50
+ event.payload !== null &&
51
+ 'triggeringEvent' in event.payload &&
52
+ typeof event.payload.triggeringEvent === 'object' &&
53
+ event.payload.triggeringEvent !== null &&
54
+ event.payload.triggeringEvent.name === 'standing-order.failed';
55
+ if (isNestedFailure) {
56
+ // Loop guard: skip processing to prevent cascade.
57
+ markEventProcessed(home, event.id);
58
+ return { eventId: event.id, eventName: event.name, dispatches: [] };
59
+ }
60
+ for (const order of matching) {
61
+ if ('run' in order && order.run) {
62
+ const summary = await executeEngineOrder(home, event, order.run, config);
63
+ dispatches.push(summary);
64
+ // On failure, signal standing-order.failed
65
+ if (summary.status === 'error') {
66
+ signalStandingOrderFailed(home, order, event, summary.error);
67
+ }
68
+ }
69
+ else if ('summon' in order && order.summon) {
70
+ const summary = await executeAnimaOrder(home, event, order.summon, 'summon');
71
+ dispatches.push(summary);
72
+ if (summary.status === 'error') {
73
+ signalStandingOrderFailed(home, order, event, summary.error);
74
+ }
75
+ }
76
+ else if ('brief' in order && order.brief) {
77
+ const summary = await executeAnimaOrder(home, event, order.brief, 'brief');
78
+ dispatches.push(summary);
79
+ if (summary.status === 'error') {
80
+ signalStandingOrderFailed(home, order, event, summary.error);
81
+ }
82
+ }
83
+ }
84
+ markEventProcessed(home, event.id);
85
+ return { eventId: event.id, eventName: event.name, dispatches };
86
+ }
87
+ /**
88
+ * Execute a `run:` standing order — load and call a clockwork engine.
89
+ */
90
+ async function executeEngineOrder(home, event, engineName, config) {
91
+ const startedAt = new Date().toISOString();
92
+ try {
93
+ // Resolve engine entry point from guild.json
94
+ const engineEntry = config.engines?.[engineName];
95
+ if (!engineEntry) {
96
+ throw new Error(`Engine "${engineName}" not found in guild.json engines registry.`);
97
+ }
98
+ // Resolve the engine module path
99
+ const enginePkg = engineEntry.package;
100
+ if (!enginePkg) {
101
+ throw new Error(`Engine "${engineName}" has no package field — cannot resolve module.`);
102
+ }
103
+ // Import the engine module
104
+ const mod = await import(__rewriteRelativeImportExtension(enginePkg));
105
+ const engineDef = mod.default;
106
+ if (!isClockworkEngine(engineDef)) {
107
+ throw new Error(`Engine "${engineName}" does not export a clockwork engine (engine() factory). ` +
108
+ `Only clockwork engines can be used in "run:" standing orders.`);
109
+ }
110
+ await engineDef.handler(event, { home });
111
+ const endedAt = new Date().toISOString();
112
+ recordDispatch(home, {
113
+ eventId: event.id,
114
+ handlerType: 'engine',
115
+ handlerName: engineName,
116
+ startedAt,
117
+ endedAt,
118
+ status: 'success',
119
+ });
120
+ return { handlerType: 'engine', handlerName: engineName, status: 'success' };
121
+ }
122
+ catch (err) {
123
+ const endedAt = new Date().toISOString();
124
+ const errorMsg = err instanceof Error ? err.message : String(err);
125
+ recordDispatch(home, {
126
+ eventId: event.id,
127
+ handlerType: 'engine',
128
+ handlerName: engineName,
129
+ startedAt,
130
+ endedAt,
131
+ status: 'error',
132
+ error: errorMsg,
133
+ });
134
+ return { handlerType: 'engine', handlerName: engineName, status: 'error', error: errorMsg };
135
+ }
136
+ }
137
+ /**
138
+ * Execute a `summon:` or `brief:` standing order.
139
+ *
140
+ * If a summon handler is registered (by the CLI layer), delegates to it
141
+ * for full session lifecycle: resolve anima, manifest, launch claude,
142
+ * wait for exit, signal session ended.
143
+ *
144
+ * If no handler is registered, records the dispatch as skipped.
145
+ */
146
+ async function executeAnimaOrder(home, event, roleName, noticeType) {
147
+ const startedAt = new Date().toISOString();
148
+ if (!_summonHandler) {
149
+ // No handler registered — record intent but skip execution.
150
+ const endedAt = new Date().toISOString();
151
+ recordDispatch(home, {
152
+ eventId: event.id,
153
+ handlerType: 'anima',
154
+ handlerName: `(role: ${roleName})`,
155
+ targetRole: roleName,
156
+ noticeType,
157
+ startedAt,
158
+ endedAt,
159
+ status: 'success',
160
+ });
161
+ return {
162
+ handlerType: 'anima',
163
+ handlerName: `(role: ${roleName})`,
164
+ status: 'skipped',
165
+ error: 'No summon handler registered — anima session not launched.',
166
+ };
167
+ }
168
+ try {
169
+ const result = await _summonHandler(home, event, roleName, noticeType);
170
+ const endedAt = new Date().toISOString();
171
+ recordDispatch(home, {
172
+ eventId: event.id,
173
+ handlerType: 'anima',
174
+ handlerName: result.animaName,
175
+ targetRole: roleName,
176
+ noticeType,
177
+ startedAt,
178
+ endedAt,
179
+ status: 'success',
180
+ });
181
+ return {
182
+ handlerType: 'anima',
183
+ handlerName: result.animaName,
184
+ status: 'success',
185
+ };
186
+ }
187
+ catch (err) {
188
+ const endedAt = new Date().toISOString();
189
+ const errorMsg = err instanceof Error ? err.message : String(err);
190
+ recordDispatch(home, {
191
+ eventId: event.id,
192
+ handlerType: 'anima',
193
+ handlerName: `(role: ${roleName})`,
194
+ targetRole: roleName,
195
+ noticeType,
196
+ startedAt,
197
+ endedAt,
198
+ status: 'error',
199
+ error: errorMsg,
200
+ });
201
+ return {
202
+ handlerType: 'anima',
203
+ handlerName: `(role: ${roleName})`,
204
+ status: 'error',
205
+ error: errorMsg,
206
+ };
207
+ }
208
+ }
209
+ /**
210
+ * Signal standing-order.failed when a standing order execution fails.
211
+ */
212
+ function signalStandingOrderFailed(home, order, triggeringEvent, error) {
213
+ signalEvent(home, 'standing-order.failed', {
214
+ standingOrder: order,
215
+ triggeringEvent: {
216
+ id: triggeringEvent.id,
217
+ name: triggeringEvent.name,
218
+ },
219
+ error,
220
+ }, 'framework');
221
+ }
222
+ /**
223
+ * Process the next pending event (or a specific event by id).
224
+ *
225
+ * @param home - Guild root path.
226
+ * @param eventId - Specific event id to process, or undefined for next pending.
227
+ * @returns Processing result, or null if no events to process.
228
+ */
229
+ export async function clockTick(home, eventId) {
230
+ if (eventId != null) {
231
+ const event = readEvent(home, eventId);
232
+ if (!event) {
233
+ throw new Error(`Event #${eventId} not found.`);
234
+ }
235
+ return processEvent(home, event);
236
+ }
237
+ const pending = readPendingEvents(home);
238
+ if (pending.length === 0)
239
+ return null;
240
+ return processEvent(home, pending[0]);
241
+ }
242
+ /**
243
+ * Process all pending events until the queue is empty.
244
+ *
245
+ * @param home - Guild root path.
246
+ * @returns Summary of all processing.
247
+ */
248
+ export async function clockRun(home) {
249
+ const processed = [];
250
+ let totalEvents = 0;
251
+ // Process in a loop because standing order failures may generate new events
252
+ while (true) {
253
+ const pending = readPendingEvents(home);
254
+ if (pending.length === 0)
255
+ break;
256
+ totalEvents += pending.length;
257
+ for (const event of pending) {
258
+ const result = await processEvent(home, event);
259
+ processed.push(result);
260
+ }
261
+ }
262
+ return { processed, totalEvents };
263
+ }
264
+ //# sourceMappingURL=clockworks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clockworks.js","sourceRoot":"","sources":["../src/clockworks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export interface CommissionOptions {
2
+ /** Absolute path to the guild root. */
3
+ home: string;
4
+ /** Commission specification — what needs to be done. */
5
+ spec: string;
6
+ /** Target workshop for the commission. */
7
+ workshop: string;
8
+ }
9
+ export interface CommissionResult {
10
+ /** The ID of the created commission. */
11
+ commissionId: number;
12
+ }
13
+ /**
14
+ * Update a commission's status and reason in the Ledger.
15
+ */
16
+ export declare function updateCommissionStatus(home: string, commissionId: number, status: string, reason: string): void;
17
+ /**
18
+ * Read a commission record from the Ledger.
19
+ */
20
+ export declare function readCommission(home: string, commissionId: number): {
21
+ id: number;
22
+ content: string;
23
+ status: string;
24
+ workshop: string;
25
+ statusReason: string | null;
26
+ } | null;
27
+ /**
28
+ * Post a commission to the guild.
29
+ *
30
+ * Creates a commission in the Ledger with status "posted" and signals
31
+ * commission.posted for the Clockworks to pick up. Everything downstream
32
+ * is driven by standing orders.
33
+ */
34
+ export declare function commission(opts: CommissionOptions): CommissionResult;
35
+ //# sourceMappingURL=commission.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commission.d.ts","sourceRoot":"","sources":["../src/commission.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,iBAAiB;IAChC,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,IAAI,CAWN;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,GACnB;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CA2BvG;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,gBAAgB,CA2CpE"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * commission — core logic for posting commissions to the guild.
3
+ *
4
+ * Creates a commission record in the Ledger and signals commission.posted
5
+ * for the Clockworks. Everything downstream (worktree setup, anima summoning,
6
+ * post-session merge) is handled by standing orders.
7
+ */
8
+ import Database from 'better-sqlite3';
9
+ import { ledgerPath } from "./nexus-home.js";
10
+ import { readGuildConfig } from "./guild-config.js";
11
+ import { signalEvent } from "./events.js";
12
+ /**
13
+ * Update a commission's status and reason in the Ledger.
14
+ */
15
+ export function updateCommissionStatus(home, commissionId, status, reason) {
16
+ const db = new Database(ledgerPath(home));
17
+ db.pragma('foreign_keys = ON');
18
+ try {
19
+ db.prepare(`UPDATE commissions SET status = ?, status_reason = ?, updated_at = datetime('now') WHERE id = ?`).run(status, reason, commissionId);
20
+ }
21
+ finally {
22
+ db.close();
23
+ }
24
+ }
25
+ /**
26
+ * Read a commission record from the Ledger.
27
+ */
28
+ export function readCommission(home, commissionId) {
29
+ const db = new Database(ledgerPath(home));
30
+ db.pragma('foreign_keys = ON');
31
+ try {
32
+ const row = db.prepare(`SELECT id, content, status, workshop, status_reason FROM commissions WHERE id = ?`).get(commissionId);
33
+ if (!row)
34
+ return null;
35
+ return {
36
+ id: row.id,
37
+ content: row.content,
38
+ status: row.status,
39
+ workshop: row.workshop,
40
+ statusReason: row.status_reason,
41
+ };
42
+ }
43
+ finally {
44
+ db.close();
45
+ }
46
+ }
47
+ /**
48
+ * Post a commission to the guild.
49
+ *
50
+ * Creates a commission in the Ledger with status "posted" and signals
51
+ * commission.posted for the Clockworks to pick up. Everything downstream
52
+ * is driven by standing orders.
53
+ */
54
+ export function commission(opts) {
55
+ const { home, spec, workshop } = opts;
56
+ // Validate workshop exists in guild.json
57
+ const config = readGuildConfig(home);
58
+ if (!(workshop in config.workshops)) {
59
+ const available = Object.keys(config.workshops).join(', ') || '(none)';
60
+ throw new Error(`Workshop "${workshop}" not found in guild.json. Available workshops: ${available}`);
61
+ }
62
+ const db = new Database(ledgerPath(home));
63
+ db.pragma('foreign_keys = ON');
64
+ try {
65
+ const statusReason = 'posted by patron';
66
+ // Create commission
67
+ const insertCommission = db.prepare(`INSERT INTO commissions (content, status, status_reason, workshop) VALUES (?, ?, ?, ?)`);
68
+ const commissionResult = insertCommission.run(spec, 'posted', statusReason, workshop);
69
+ const commissionId = Number(commissionResult.lastInsertRowid);
70
+ // Audit log
71
+ db.prepare(`INSERT INTO audit_log (actor, action, target_type, target_id, detail) VALUES (?, ?, ?, ?, ?)`).run('patron', 'commission_posted', 'commission', commissionId, JSON.stringify({ workshop }));
72
+ // Signal for Clockworks
73
+ signalEvent(home, 'commission.posted', { commissionId, workshop }, 'framework');
74
+ return { commissionId };
75
+ }
76
+ finally {
77
+ db.close();
78
+ }
79
+ }
80
+ //# sourceMappingURL=commission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commission.js","sourceRoot":"","sources":["../src/commission.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Engine SDK — the authoring interface for clockwork engines.
3
+ *
4
+ * Use `engine()` to define a clockwork engine that responds to guild events.
5
+ * The returned definition is what the Clockworks runner imports and calls.
6
+ * Static engines (manifest, ledger-migrate, etc.) do NOT use this factory —
7
+ * they have bespoke APIs and are called directly by framework code.
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * import { engine } from '@shardworks/nexus-core';
12
+ *
13
+ * export default engine({
14
+ * handler: async (event, { home }) => {
15
+ * // event is the triggering GuildEvent when invoked by a standing order
16
+ * // event is null when invoked directly (CLI, import)
17
+ * if (event) {
18
+ * console.log(`Handling ${event.name}`, event.payload);
19
+ * }
20
+ * }
21
+ * });
22
+ * ```
23
+ */
24
+ /** An immutable fact from the event log — the input to clockwork engines. */
25
+ export interface GuildEvent {
26
+ id: number;
27
+ name: string;
28
+ payload: unknown;
29
+ emitter: string;
30
+ firedAt: string;
31
+ }
32
+ /** Framework-provided context injected into every engine handler call. */
33
+ export interface EngineContext {
34
+ /** Absolute path to the guild root. */
35
+ home: string;
36
+ }
37
+ /**
38
+ * A fully-defined clockwork engine — the return type of `engine()`.
39
+ *
40
+ * The Clockworks runner calls `.handler(event, { home })` when a standing
41
+ * order fires. The `__clockwork` brand is used at load time to distinguish
42
+ * clockwork engines from static engines.
43
+ */
44
+ export interface EngineDefinition {
45
+ readonly __clockwork: true;
46
+ readonly handler: (event: GuildEvent | null, ctx: EngineContext) => Promise<void>;
47
+ }
48
+ /**
49
+ * Define a clockwork engine.
50
+ *
51
+ * This is the SDK entry point for event-driven engines. Pass a handler
52
+ * function that receives a GuildEvent (or null for direct invocation)
53
+ * and an EngineContext.
54
+ */
55
+ export declare function engine(def: {
56
+ handler: (event: GuildEvent | null, ctx: EngineContext) => Promise<void>;
57
+ }): EngineDefinition;
58
+ /** Type guard: is this module export a clockwork engine? */
59
+ export declare function isClockworkEngine(obj: unknown): obj is EngineDefinition;
60
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,6EAA6E;AAC7E,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,0EAA0E;AAC1E,MAAM,WAAW,aAAa;IAC5B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACnF;AAED;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE;IAC1B,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1E,GAAG,gBAAgB,CAKnB;AAED,4DAA4D;AAC5D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,gBAAgB,CAQvE"}
package/dist/engine.js ADDED
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Engine SDK — the authoring interface for clockwork engines.
3
+ *
4
+ * Use `engine()` to define a clockwork engine that responds to guild events.
5
+ * The returned definition is what the Clockworks runner imports and calls.
6
+ * Static engines (manifest, ledger-migrate, etc.) do NOT use this factory —
7
+ * they have bespoke APIs and are called directly by framework code.
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * import { engine } from '@shardworks/nexus-core';
12
+ *
13
+ * export default engine({
14
+ * handler: async (event, { home }) => {
15
+ * // event is the triggering GuildEvent when invoked by a standing order
16
+ * // event is null when invoked directly (CLI, import)
17
+ * if (event) {
18
+ * console.log(`Handling ${event.name}`, event.payload);
19
+ * }
20
+ * }
21
+ * });
22
+ * ```
23
+ */
24
+ /**
25
+ * Define a clockwork engine.
26
+ *
27
+ * This is the SDK entry point for event-driven engines. Pass a handler
28
+ * function that receives a GuildEvent (or null for direct invocation)
29
+ * and an EngineContext.
30
+ */
31
+ export function engine(def) {
32
+ return {
33
+ __clockwork: true,
34
+ handler: def.handler,
35
+ };
36
+ }
37
+ /** Type guard: is this module export a clockwork engine? */
38
+ export function isClockworkEngine(obj) {
39
+ return (typeof obj === 'object' &&
40
+ obj !== null &&
41
+ '__clockwork' in obj &&
42
+ obj.__clockwork === true &&
43
+ typeof obj.handler === 'function');
44
+ }
45
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AA6BH;;;;;;GAMG;AACH,MAAM,UAAU,MAAM,CAAC,GAEtB;IACC,OAAO;QACL,WAAW,EAAE,IAAI;QACjB,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAC;AACJ,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC5C,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,aAAa,IAAI,GAAG;QACnB,GAAwB,CAAC,WAAW,KAAK,IAAI;QAC9C,OAAQ,GAAwB,CAAC,OAAO,KAAK,UAAU,CACxD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { GuildEvent } from './engine.ts';
2
+ /**
3
+ * Check if an event name is in a reserved framework namespace.
4
+ */
5
+ export declare function isFrameworkEvent(name: string): boolean;
6
+ /**
7
+ * Validate that a custom event name is declared in guild.json clockworks.events.
8
+ * Throws if the name is in a reserved namespace or not declared.
9
+ */
10
+ export declare function validateCustomEvent(home: string, name: string): void;
11
+ /**
12
+ * Signal an event — persist it to the Ledger's events table.
13
+ *
14
+ * Does not process the event. The Clockworks runner processes separately.
15
+ *
16
+ * @param home - Absolute path to the guild root.
17
+ * @param name - Event name (e.g. "commission.sealed", "code.reviewed").
18
+ * @param payload - Event-specific data (JSON-serializable).
19
+ * @param emitter - Who signaled it: anima name, engine name, or "framework".
20
+ * @returns The event id.
21
+ */
22
+ export declare function signalEvent(home: string, name: string, payload: unknown, emitter: string): number;
23
+ /**
24
+ * Read pending (unprocessed) events from the Ledger, ordered by fired_at.
25
+ */
26
+ export declare function readPendingEvents(home: string): GuildEvent[];
27
+ /**
28
+ * Read a single event by id.
29
+ */
30
+ export declare function readEvent(home: string, id: number): GuildEvent | null;
31
+ /**
32
+ * Mark an event as processed.
33
+ */
34
+ export declare function markEventProcessed(home: string, eventId: number): void;
35
+ /**
36
+ * Record an event dispatch in the event_dispatches table.
37
+ */
38
+ export declare function recordDispatch(home: string, opts: {
39
+ eventId: number;
40
+ handlerType: 'engine' | 'anima';
41
+ handlerName: string;
42
+ targetRole?: string;
43
+ noticeType?: 'summon' | 'brief';
44
+ startedAt: string;
45
+ endedAt: string;
46
+ status: 'success' | 'error';
47
+ error?: string;
48
+ }): void;
49
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAY9C;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAiBpE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,GACd,MAAM,CAaR;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAmB5D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAqBrE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAStE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IACJ,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,IAAI,CAsBN"}