@jungjaehoon/mama-os 0.59.0 → 0.60.0
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/CHANGELOG.md +19 -1
- package/README.md +1 -1
- package/dist/api/owner-message-actions.d.ts +21 -0
- package/dist/api/owner-message-actions.d.ts.map +1 -0
- package/dist/api/owner-message-actions.js +100 -0
- package/dist/api/owner-message-actions.js.map +1 -0
- package/dist/api/viewer-server.d.ts.map +1 -1
- package/dist/api/viewer-server.js +1 -14
- package/dist/api/viewer-server.js.map +1 -1
- package/dist/api/wiki-actions.d.ts.map +1 -1
- package/dist/api/wiki-actions.js +5 -3
- package/dist/api/wiki-actions.js.map +1 -1
- package/dist/api/work-actions.d.ts +13 -4
- package/dist/api/work-actions.d.ts.map +1 -1
- package/dist/api/work-actions.js +336 -17
- package/dist/api/work-actions.js.map +1 -1
- package/dist/cli/commands/daemon.d.ts.map +1 -1
- package/dist/cli/commands/daemon.js +11 -1
- package/dist/cli/commands/daemon.js.map +1 -1
- package/dist/runtime/action-surface.d.ts +4 -1
- package/dist/runtime/action-surface.d.ts.map +1 -1
- package/dist/runtime/action-surface.js +6 -0
- package/dist/runtime/action-surface.js.map +1 -1
- package/dist/runtime/config.d.ts +2 -0
- package/dist/runtime/config.d.ts.map +1 -1
- package/dist/runtime/config.js +2 -1
- package/dist/runtime/config.js.map +1 -1
- package/dist/runtime/owner-runtime.d.ts.map +1 -1
- package/dist/runtime/owner-runtime.js +10 -1
- package/dist/runtime/owner-runtime.js.map +1 -1
- package/dist/runtime/owner-system-prompt.d.ts.map +1 -1
- package/dist/runtime/owner-system-prompt.js +30 -4
- package/dist/runtime/owner-system-prompt.js.map +1 -1
- package/dist/runtime/record-orders.d.ts +32 -10
- package/dist/runtime/record-orders.d.ts.map +1 -1
- package/dist/runtime/record-orders.js +265 -59
- package/dist/runtime/record-orders.js.map +1 -1
- package/dist/runtime/report-scheduler.d.ts +8 -1
- package/dist/runtime/report-scheduler.d.ts.map +1 -1
- package/dist/runtime/report-scheduler.js +48 -17
- package/dist/runtime/report-scheduler.js.map +1 -1
- package/dist/runtime/session-start-context.d.ts +12 -0
- package/dist/runtime/session-start-context.d.ts.map +1 -1
- package/dist/runtime/session-start-context.js +22 -0
- package/dist/runtime/session-start-context.js.map +1 -1
- package/dist/runtime/stimulus-delivery.d.ts +5 -2
- package/dist/runtime/stimulus-delivery.d.ts.map +1 -1
- package/dist/runtime/stimulus-delivery.js.map +1 -1
- package/dist/runtime/turn-orders.d.ts +17 -1
- package/dist/runtime/turn-orders.d.ts.map +1 -1
- package/dist/runtime/turn-orders.js +56 -14
- package/dist/runtime/turn-orders.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,42 +1,65 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RECORD_ORDER_MAX_ATTEMPTS = void 0;
|
|
3
|
+
exports.RECORD_RETRY_DELAY_MS = exports.RECORD_ORDER_MAX_ATTEMPTS = void 0;
|
|
4
4
|
exports.batchRecorded = batchRecorded;
|
|
5
5
|
exports.createRecordOrders = createRecordOrders;
|
|
6
6
|
const turn_orders_js_1 = require("./turn-orders.js");
|
|
7
7
|
exports.RECORD_ORDER_MAX_ATTEMPTS = 3;
|
|
8
|
+
/**
|
|
9
|
+
* How long an unrecorded batch waits for its next attempt. Kagemusha leaves such a batch behind
|
|
10
|
+
* its cursor and reads it again at its next delta tick (deltaDigestIntervalMinutes: 15 by default,
|
|
11
|
+
* 5 where this was measured). On 2026-09-29 MAMA re-sent the same order at once into the same
|
|
12
|
+
* session, and both retries were answered [ack] in two seconds with no tool call.
|
|
13
|
+
*/
|
|
14
|
+
exports.RECORD_RETRY_DELAY_MS = 5 * 60 * 1000;
|
|
8
15
|
/**
|
|
9
16
|
* Kagemusha's taskboard reconcile check, read from MAMA's ledger: the batch counts as recorded
|
|
10
|
-
* when a work revision cites one of its observations, or
|
|
11
|
-
* Who wrote the revision does not matter; a revision that cites the batch is the record.
|
|
17
|
+
* when a work revision cites one of its observations, or an order that included it declared no
|
|
18
|
+
* update. Who wrote the revision does not matter; a revision that cites the batch is the record.
|
|
19
|
+
* In an order that only carried the batch, the no-update must cite one of its observations: the
|
|
20
|
+
* order may show none of its lines, and a no-update about the newer messages does not cover it.
|
|
12
21
|
*/
|
|
13
|
-
function batchRecorded(adapter,
|
|
14
|
-
if (
|
|
15
|
-
const marks =
|
|
22
|
+
function batchRecorded(adapter, batch, carryingOrders = []) {
|
|
23
|
+
if (batch.observationRefs.length > 0) {
|
|
24
|
+
const marks = batch.observationRefs.map(() => '?').join(',');
|
|
16
25
|
const revised = adapter
|
|
17
26
|
.prepare(`SELECT 1 FROM commitment_assignments ca
|
|
18
27
|
JOIN twin_edges e ON e.subject_kind = 'memory' AND e.subject_id = ca.record_id
|
|
19
28
|
WHERE e.edge_type = 'derived_from' AND e.object_kind = 'observation'
|
|
20
29
|
AND e.object_id IN (${marks})
|
|
21
30
|
LIMIT 1`)
|
|
22
|
-
.get(...
|
|
31
|
+
.get(...batch.observationRefs);
|
|
23
32
|
if (revised !== undefined)
|
|
24
33
|
return true;
|
|
25
34
|
}
|
|
26
|
-
const
|
|
27
|
-
|
|
35
|
+
const ownOrders = Array.from({ length: exports.RECORD_ORDER_MAX_ATTEMPTS }, (_, index) => (0, turn_orders_js_1.recordOrderId)(batch.deltaStimulusId, index + 1));
|
|
36
|
+
if (noUpdateIn(adapter, ownOrders, null))
|
|
37
|
+
return true;
|
|
38
|
+
const carrying = [...new Set(carryingOrders)].filter((id) => !ownOrders.includes(id));
|
|
39
|
+
return carrying.length > 0 && noUpdateIn(adapter, carrying, batch.observationRefs);
|
|
40
|
+
}
|
|
41
|
+
/** A completed work.no_update in these orders' runs, citing one of `cites` when given. */
|
|
42
|
+
function noUpdateIn(adapter, orderIds, cites) {
|
|
43
|
+
const marks = orderIds.map(() => '?').join(',');
|
|
44
|
+
const citing = cites === null
|
|
45
|
+
? ''
|
|
46
|
+
: `AND EXISTS (
|
|
47
|
+
SELECT 1 FROM json_each(CASE WHEN json_valid(t.input_summary)
|
|
48
|
+
THEN json_extract(t.input_summary, '$.observationRefs') END) ref
|
|
49
|
+
WHERE ref.value IN (${cites.map(() => '?').join(',')}))`;
|
|
50
|
+
return (adapter
|
|
28
51
|
.prepare(`SELECT 1 FROM tool_traces t
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
52
|
+
WHERE t.tool_name = 'work.no_update' AND t.execution_status = 'completed'
|
|
53
|
+
AND t.model_run_id IN (
|
|
54
|
+
SELECT r.model_run_id FROM model_runs r
|
|
55
|
+
WHERE json_extract(r.input_refs_json, '$.sourceMessageRef') IN (${marks})
|
|
56
|
+
UNION
|
|
57
|
+
SELECT c.model_run_id FROM model_runs c JOIN model_runs p ON c.parent_model_run_id = p.model_run_id
|
|
58
|
+
WHERE json_extract(p.input_refs_json, '$.sourceMessageRef') IN (${marks})
|
|
59
|
+
)
|
|
60
|
+
${citing}
|
|
61
|
+
LIMIT 1`)
|
|
62
|
+
.get(...orderIds, ...orderIds, ...(cites ?? [])) !== undefined);
|
|
40
63
|
}
|
|
41
64
|
/** Child runs of a record run that this process started and that have not ended yet. */
|
|
42
65
|
function runningChildren(adapter, modelRunId, startedAt) {
|
|
@@ -47,51 +70,222 @@ function runningChildren(adapter, modelRunId, startedAt) {
|
|
|
47
70
|
return row?.n ?? 0;
|
|
48
71
|
}
|
|
49
72
|
const RECOVERY_WINDOW_MS = 24 * 60 * 60 * 1000;
|
|
73
|
+
/**
|
|
74
|
+
* The batches of the last day of record orders, each at its latest attempt. The day ends at the
|
|
75
|
+
* latest stored order, not at now: a batch left waiting when the daemon stopped is still read
|
|
76
|
+
* after a longer stop.
|
|
77
|
+
*/
|
|
78
|
+
function storedBatches(adapter) {
|
|
79
|
+
const rows = adapter
|
|
80
|
+
.prepare(`SELECT m.stimulus_id, m.payload_json, m.status, n.state AS native_state
|
|
81
|
+
FROM mailbox_inputs m LEFT JOIN native_input_deliveries n ON n.input_id = m.id
|
|
82
|
+
WHERE m.kind = 'scheduled' AND m.channel_key = ?
|
|
83
|
+
AND m.created_at >= (SELECT max(created_at) FROM mailbox_inputs
|
|
84
|
+
WHERE kind = 'scheduled' AND channel_key = ?) - ?`)
|
|
85
|
+
.all(turn_orders_js_1.RECORD_ORDER_CHANNEL, turn_orders_js_1.RECORD_ORDER_CHANNEL, RECOVERY_WINDOW_MS);
|
|
86
|
+
const states = new Map();
|
|
87
|
+
for (const row of rows) {
|
|
88
|
+
const order = (0, turn_orders_js_1.parseRecordOrder)(JSON.parse(row.payload_json));
|
|
89
|
+
// A row parked uncertain stays claimed; its batch is settled through onLost, not left open.
|
|
90
|
+
const open = (row.status === 'pending' || row.status === 'claimed') && row.native_state !== 'uncertain';
|
|
91
|
+
for (const batch of (0, turn_orders_js_1.recordOrderBatches)(order)) {
|
|
92
|
+
const current = states.get(batch.deltaStimulusId);
|
|
93
|
+
const orders = [...(current?.orders ?? []), row.stimulus_id];
|
|
94
|
+
if (current === undefined || batch.attempt > current.batch.attempt)
|
|
95
|
+
states.set(batch.deltaStimulusId, {
|
|
96
|
+
batch,
|
|
97
|
+
source: order.source,
|
|
98
|
+
channel: order.channel,
|
|
99
|
+
open,
|
|
100
|
+
orders,
|
|
101
|
+
});
|
|
102
|
+
else
|
|
103
|
+
states.set(batch.deltaStimulusId, {
|
|
104
|
+
...current,
|
|
105
|
+
open: current.open || (batch.attempt === current.batch.attempt && open),
|
|
106
|
+
orders,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return states;
|
|
111
|
+
}
|
|
112
|
+
function orderExists(adapter, id) {
|
|
113
|
+
return (adapter.prepare(`SELECT 1 FROM mailbox_inputs WHERE stimulus_id = ? LIMIT 1`).get(id) !==
|
|
114
|
+
undefined);
|
|
115
|
+
}
|
|
116
|
+
function channelKeyOf(where) {
|
|
117
|
+
return `${where.source ?? ''}\u0000${where.channel}`;
|
|
118
|
+
}
|
|
50
119
|
function createRecordOrders(options) {
|
|
51
120
|
const sleep = options.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
52
121
|
const childWaitMs = options.childWaitMs ?? 10 * 60 * 1000;
|
|
122
|
+
const retryDelayMs = options.retryDelayMs ?? exports.RECORD_RETRY_DELAY_MS;
|
|
123
|
+
const setTimer = options.setTimer ??
|
|
124
|
+
((run, ms) => {
|
|
125
|
+
const timer = setTimeout(run, ms);
|
|
126
|
+
timer.unref?.();
|
|
127
|
+
return () => clearTimeout(timer);
|
|
128
|
+
});
|
|
129
|
+
const waiting = new Map();
|
|
53
130
|
let stopped = false;
|
|
131
|
+
/**
|
|
132
|
+
* An order id is written once: its carried batches depend on what was waiting at the time, so
|
|
133
|
+
* the stored order stands. enqueueFirst checks before it takes the channel's waiting batches (a
|
|
134
|
+
* replayed notify result enqueues its first order again); a tick relies on the check here.
|
|
135
|
+
*/
|
|
54
136
|
const enqueue = (record) => {
|
|
55
|
-
|
|
56
|
-
|
|
137
|
+
const id = (0, turn_orders_js_1.recordOrderId)(record.deltaStimulusId, record.attempt);
|
|
138
|
+
if (orderExists(options.adapter, id))
|
|
139
|
+
return false;
|
|
140
|
+
const receipt = options.accept({
|
|
141
|
+
id,
|
|
57
142
|
kind: 'scheduled',
|
|
58
143
|
channelKey: turn_orders_js_1.RECORD_ORDER_CHANNEL,
|
|
59
144
|
occurredAt: Date.now(),
|
|
60
145
|
payload: record,
|
|
61
146
|
});
|
|
147
|
+
// The mailbox remembers an id after its row is pruned.
|
|
148
|
+
if (receipt.state === 'duplicate')
|
|
149
|
+
return false;
|
|
150
|
+
for (const batch of (0, turn_orders_js_1.recordOrderBatches)(record))
|
|
151
|
+
if (batch.attempt > 1)
|
|
152
|
+
options.onEvent?.({
|
|
153
|
+
type: 'retry',
|
|
154
|
+
deltaStimulusId: batch.deltaStimulusId,
|
|
155
|
+
attempt: batch.attempt,
|
|
156
|
+
order: id,
|
|
157
|
+
});
|
|
158
|
+
return true;
|
|
159
|
+
};
|
|
160
|
+
const take = (key) => {
|
|
161
|
+
const entry = waiting.get(key);
|
|
162
|
+
waiting.delete(key);
|
|
163
|
+
entry?.cancel?.();
|
|
164
|
+
return entry;
|
|
165
|
+
};
|
|
166
|
+
const next = (batch) => ({
|
|
167
|
+
...batch,
|
|
168
|
+
attempt: batch.attempt + 1,
|
|
169
|
+
});
|
|
170
|
+
/**
|
|
171
|
+
* The waiting batches that still need an order. One that another order took up, or that was
|
|
172
|
+
* recorded while it waited (by another turn reading the channel), is left out.
|
|
173
|
+
*/
|
|
174
|
+
const dueBatches = (batches) => {
|
|
175
|
+
if (batches.length === 0)
|
|
176
|
+
return [];
|
|
177
|
+
const stored = storedBatches(options.adapter);
|
|
178
|
+
const recorded = [];
|
|
179
|
+
const due = batches.filter((batch) => {
|
|
180
|
+
const state = stored.get(batch.deltaStimulusId);
|
|
181
|
+
if (state !== undefined && (state.open || state.batch.attempt > batch.attempt))
|
|
182
|
+
return false;
|
|
183
|
+
if (batchRecorded(options.adapter, batch, state?.orders ?? [])) {
|
|
184
|
+
recorded.push(batch);
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
return true;
|
|
188
|
+
});
|
|
189
|
+
for (const batch of recorded)
|
|
190
|
+
options.onEvent?.({
|
|
191
|
+
type: 'recorded',
|
|
192
|
+
deltaStimulusId: batch.deltaStimulusId,
|
|
193
|
+
attempt: batch.attempt,
|
|
194
|
+
});
|
|
195
|
+
return due;
|
|
196
|
+
};
|
|
197
|
+
// Kagemusha's next tick: the channel's waiting batches go together in one order.
|
|
198
|
+
const tick = (key) => {
|
|
199
|
+
const entry = take(key);
|
|
200
|
+
if (entry === undefined || stopped)
|
|
201
|
+
return;
|
|
202
|
+
// The batches whose outcome is still open; a failure below reports only these as lost.
|
|
203
|
+
let unsettled = [...entry.batches.values()];
|
|
204
|
+
try {
|
|
205
|
+
const due = dueBatches(unsettled);
|
|
206
|
+
unsettled = due;
|
|
207
|
+
const [own, ...carried] = due;
|
|
208
|
+
if (own === undefined)
|
|
209
|
+
return;
|
|
210
|
+
const placed = enqueue({
|
|
211
|
+
order: 'record',
|
|
212
|
+
deltaStimulusId: own.deltaStimulusId,
|
|
213
|
+
...(entry.source === undefined ? {} : { source: entry.source }),
|
|
214
|
+
channel: entry.channel,
|
|
215
|
+
observationRefs: own.observationRefs,
|
|
216
|
+
lines: own.lines,
|
|
217
|
+
attempt: own.attempt + 1,
|
|
218
|
+
...(carried.length === 0 ? {} : { carried: carried.map(next) }),
|
|
219
|
+
});
|
|
220
|
+
// The own batch's next order is already stored, older than the day recovery reads; that
|
|
221
|
+
// order accounts for it, and the rest wait for the next tick.
|
|
222
|
+
if (!placed)
|
|
223
|
+
for (const batch of carried)
|
|
224
|
+
wait(batch, entry);
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
for (const batch of unsettled)
|
|
228
|
+
options.onEvent?.({
|
|
229
|
+
type: 'lost',
|
|
230
|
+
deltaStimulusId: batch.deltaStimulusId,
|
|
231
|
+
attempt: batch.attempt,
|
|
232
|
+
reason: `record retry failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
62
235
|
};
|
|
63
|
-
const
|
|
64
|
-
|
|
236
|
+
const wait = (batch, where) => {
|
|
237
|
+
const key = channelKeyOf(where);
|
|
238
|
+
const entry = waiting.get(key) ?? {
|
|
239
|
+
source: where.source,
|
|
240
|
+
channel: where.channel,
|
|
241
|
+
batches: new Map(),
|
|
242
|
+
};
|
|
243
|
+
const current = entry.batches.get(batch.deltaStimulusId);
|
|
244
|
+
if (current === undefined || batch.attempt > current.attempt)
|
|
245
|
+
entry.batches.set(batch.deltaStimulusId, batch);
|
|
246
|
+
entry.cancel ??= setTimer(() => tick(key), retryDelayMs);
|
|
247
|
+
waiting.set(key, entry);
|
|
248
|
+
};
|
|
249
|
+
const settle = (batch, where, orders, reason) => {
|
|
250
|
+
if (batchRecorded(options.adapter, batch, orders)) {
|
|
65
251
|
options.onEvent?.({
|
|
66
252
|
type: 'recorded',
|
|
67
|
-
deltaStimulusId:
|
|
68
|
-
attempt:
|
|
253
|
+
deltaStimulusId: batch.deltaStimulusId,
|
|
254
|
+
attempt: batch.attempt,
|
|
69
255
|
});
|
|
70
256
|
return;
|
|
71
257
|
}
|
|
72
|
-
if (
|
|
258
|
+
if (batch.attempt >= exports.RECORD_ORDER_MAX_ATTEMPTS) {
|
|
73
259
|
options.onEvent?.({
|
|
74
260
|
type: 'lost',
|
|
75
|
-
deltaStimulusId:
|
|
76
|
-
attempt:
|
|
261
|
+
deltaStimulusId: batch.deltaStimulusId,
|
|
262
|
+
attempt: batch.attempt,
|
|
77
263
|
reason,
|
|
78
264
|
});
|
|
79
265
|
return;
|
|
80
266
|
}
|
|
81
267
|
options.onEvent?.({
|
|
82
|
-
type: '
|
|
83
|
-
deltaStimulusId:
|
|
84
|
-
attempt:
|
|
268
|
+
type: 'waiting',
|
|
269
|
+
deltaStimulusId: batch.deltaStimulusId,
|
|
270
|
+
attempt: batch.attempt,
|
|
85
271
|
reason,
|
|
86
272
|
});
|
|
87
|
-
|
|
273
|
+
if (!stopped)
|
|
274
|
+
wait(batch, where);
|
|
88
275
|
};
|
|
89
276
|
return {
|
|
277
|
+
// The channel's waiting batches ride with its next delta, as Kagemusha's cursor re-reads them.
|
|
90
278
|
enqueueFirst: (row) => {
|
|
91
279
|
const record = (0, turn_orders_js_1.recordOrderPayload)(row, 1);
|
|
92
280
|
if (record.observationRefs.length === 0)
|
|
93
281
|
throw new Error(`Live delta ${row.stimulusId} carries no observation to record`);
|
|
94
|
-
|
|
282
|
+
if (orderExists(options.adapter, (0, turn_orders_js_1.recordOrderId)(record.deltaStimulusId, 1)))
|
|
283
|
+
return;
|
|
284
|
+
const key = channelKeyOf(record);
|
|
285
|
+
const carried = dueBatches([...(waiting.get(key)?.batches.values() ?? [])]).map(next);
|
|
286
|
+
enqueue(carried.length === 0 ? record : { ...record, carried });
|
|
287
|
+
// Taken only once the order is stored, so a refused accept leaves them waiting.
|
|
288
|
+
take(key);
|
|
95
289
|
},
|
|
96
290
|
// The check waits for child runs in the background so the owner's queue is never held.
|
|
97
291
|
onResult: (row, modelRunId) => {
|
|
@@ -106,46 +300,58 @@ function createRecordOrders(options) {
|
|
|
106
300
|
}
|
|
107
301
|
if (stopped)
|
|
108
302
|
return;
|
|
109
|
-
|
|
303
|
+
for (const batch of (0, turn_orders_js_1.recordOrderBatches)(record))
|
|
304
|
+
settle(batch, record, [row.stimulusId], 'the order ended without a revision citing the batch or a declared no-update');
|
|
110
305
|
})().catch((error) => {
|
|
111
306
|
// A check cut off by shutdown is not a loss: recover() runs it at the next start.
|
|
112
307
|
if (stopped)
|
|
113
308
|
return;
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
309
|
+
for (const batch of (0, turn_orders_js_1.recordOrderBatches)(record))
|
|
310
|
+
options.onEvent?.({
|
|
311
|
+
type: 'lost',
|
|
312
|
+
deltaStimulusId: batch.deltaStimulusId,
|
|
313
|
+
attempt: batch.attempt,
|
|
314
|
+
reason: `record check failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
315
|
+
});
|
|
120
316
|
});
|
|
121
317
|
},
|
|
122
318
|
onLost: (row, reason) => {
|
|
123
|
-
|
|
319
|
+
const record = (0, turn_orders_js_1.parseRecordOrder)(row.payload);
|
|
320
|
+
try {
|
|
321
|
+
const stored = storedBatches(options.adapter);
|
|
322
|
+
for (const batch of (0, turn_orders_js_1.recordOrderBatches)(record)) {
|
|
323
|
+
const state = stored.get(batch.deltaStimulusId);
|
|
324
|
+
// The runtime reports a row parked uncertain again at every start. It was settled when it
|
|
325
|
+
// was first reported: skip it once a later attempt exists, or once it is older than the
|
|
326
|
+
// day recovery reads (a lost batch would otherwise run again).
|
|
327
|
+
if (state === undefined || state.batch.attempt > batch.attempt)
|
|
328
|
+
continue;
|
|
329
|
+
settle(batch, record, [...state.orders, row.stimulusId], reason);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
catch (error) {
|
|
333
|
+
// The runtime swallows a failed report, so the loss is named here.
|
|
334
|
+
for (const batch of (0, turn_orders_js_1.recordOrderBatches)(record))
|
|
335
|
+
options.onEvent?.({
|
|
336
|
+
type: 'lost',
|
|
337
|
+
deltaStimulusId: batch.deltaStimulusId,
|
|
338
|
+
attempt: batch.attempt,
|
|
339
|
+
reason: `record check failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
340
|
+
});
|
|
341
|
+
}
|
|
124
342
|
},
|
|
125
343
|
recover: () => {
|
|
126
|
-
const
|
|
127
|
-
.
|
|
128
|
-
WHERE kind = 'scheduled' AND channel_key = ? AND created_at >= ?`)
|
|
129
|
-
.all(turn_orders_js_1.RECORD_ORDER_CHANNEL, Date.now() - RECOVERY_WINDOW_MS);
|
|
130
|
-
const latest = new Map();
|
|
131
|
-
for (const row of rows) {
|
|
132
|
-
const record = (0, turn_orders_js_1.parseRecordOrder)(JSON.parse(row.payload_json));
|
|
133
|
-
const open = row.status === 'pending' || row.status === 'claimed';
|
|
134
|
-
const current = latest.get(record.deltaStimulusId);
|
|
135
|
-
latest.set(record.deltaStimulusId, {
|
|
136
|
-
record: current && current.record.attempt > record.attempt ? current.record : record,
|
|
137
|
-
open: open || (current?.open ?? false),
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
for (const { record, open } of latest.values()) {
|
|
141
|
-
if (open || batchRecorded(options.adapter, record))
|
|
344
|
+
for (const state of storedBatches(options.adapter).values()) {
|
|
345
|
+
if (state.open || batchRecorded(options.adapter, state.batch, state.orders))
|
|
142
346
|
continue;
|
|
143
347
|
// Repeats at each start while the batch stays unrecorded; any revision citing it clears it.
|
|
144
|
-
settle(
|
|
348
|
+
settle(state.batch, state, state.orders, `still unrecorded at daemon start after attempt ${state.batch.attempt}`);
|
|
145
349
|
}
|
|
146
350
|
},
|
|
147
351
|
stop: () => {
|
|
148
352
|
stopped = true;
|
|
353
|
+
for (const key of [...waiting.keys()])
|
|
354
|
+
take(key);
|
|
149
355
|
},
|
|
150
356
|
};
|
|
151
357
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-orders.js","sourceRoot":"","sources":["../../src/runtime/record-orders.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"record-orders.js","sourceRoot":"","sources":["../../src/runtime/record-orders.ts"],"names":[],"mappings":";;;AAsDA,sCAwBC;AA2ID,gDAwPC;AA7cD,qDAQ0B;AAEb,QAAA,yBAAyB,GAAG,CAAC,CAAC;AAE3C;;;;;GAKG;AACU,QAAA,qBAAqB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAyBnD;;;;;;GAMG;AACH,SAAgB,aAAa,CAC3B,OAAwB,EACxB,KAAoE,EACpE,iBAAoC,EAAE;IAEtC,IAAI,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,OAAO;aACpB,OAAO,CACN;;;kCAG0B,KAAK;kBACrB,CACX;aACA,GAAG,CAAC,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC;QACjC,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;IACzC,CAAC;IACD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,iCAAyB,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAC/E,IAAA,8BAAa,EAAC,KAAK,CAAC,eAAe,EAAE,KAAK,GAAG,CAAC,CAAC,CAChD,CAAC;IACF,IAAI,UAAU,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACtD,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IACtF,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;AACrF,CAAC;AAED,0FAA0F;AAC1F,SAAS,UAAU,CACjB,OAAwB,EACxB,QAA2B,EAC3B,KAA+B;IAE/B,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,MAAM,GACV,KAAK,KAAK,IAAI;QACZ,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC;;;mCAG2B,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACpE,OAAO,CACL,OAAO;SACJ,OAAO,CACN;;;;iFAIyE,KAAK;;;iFAGL,KAAK;;cAExE,MAAM;kBACF,CACX;SACA,GAAG,CAAC,GAAG,QAAQ,EAAE,GAAG,QAAQ,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,KAAK,SAAS,CACjE,CAAC;AACJ,CAAC;AAED,wFAAwF;AACxF,SAAS,eAAe,CAAC,OAAwB,EAAE,UAAkB,EAAE,SAAiB;IACtF,MAAM,GAAG,GAAG,OAAO;SAChB,OAAO,CACN;oGAC8F,CAC/F;SACA,GAAG,CAAC,UAAU,EAAE,SAAS,CAA8B,CAAC;IAC3D,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC;AAaD,MAAM,kBAAkB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAiB/C;;;;GAIG;AACH,SAAS,aAAa,CAAC,OAAwB;IAC7C,MAAM,IAAI,GAAG,OAAO;SACjB,OAAO,CACN;;;;kFAI4E,CAC7E;SACA,GAAG,CAAC,qCAAoB,EAAE,qCAAoB,EAAE,kBAAkB,CAKnE,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC7C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAA,iCAAgB,EAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;QAC7D,4FAA4F;QAC5F,MAAM,IAAI,GACR,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,IAAI,GAAG,CAAC,YAAY,KAAK,WAAW,CAAC;QAC7F,KAAK,MAAM,KAAK,IAAI,IAAA,mCAAkB,EAAC,KAAK,CAAC,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;YAC7D,IAAI,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO;gBAChE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE;oBAChC,KAAK;oBACL,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,IAAI;oBACJ,MAAM;iBACP,CAAC,CAAC;;gBAEH,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE;oBAChC,GAAG,OAAO;oBACV,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC;oBACvE,MAAM;iBACP,CAAC,CAAC;QACP,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,WAAW,CAAC,OAAwB,EAAE,EAAU;IACvD,OAAO,CACL,OAAO,CAAC,OAAO,CAAC,4DAA4D,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QACrF,SAAS,CACV,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAgB;IACpC,OAAO,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,SAAS,KAAK,CAAC,OAAO,EAAE,CAAC;AACvD,CAAC;AAQD,SAAgB,kBAAkB,CAAC,OAA4B;IAC7D,MAAM,KAAK,GACT,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACvF,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC1D,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,6BAAqB,CAAC;IACnE,MAAM,QAAQ,GACZ,OAAO,CAAC,QAAQ;QAChB,CAAC,CAAC,GAAe,EAAE,EAAU,EAAE,EAAE;YAC/B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAClC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;YAChB,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,MAAM,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAClD,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB;;;;OAIG;IACH,MAAM,OAAO,GAAG,CAAC,MAA0B,EAAW,EAAE;QACtD,MAAM,EAAE,GAAG,IAAA,8BAAa,EAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACjE,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAAE,OAAO,KAAK,CAAC;QACnD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;YAC7B,EAAE;YACF,IAAI,EAAE,WAAW;YACjB,UAAU,EAAE,qCAAoB;YAChC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;YACtB,OAAO,EAAE,MAAwC;SAClD,CAAC,CAAC;QACH,uDAAuD;QACvD,IAAI,OAAO,CAAC,KAAK,KAAK,WAAW;YAAE,OAAO,KAAK,CAAC;QAChD,KAAK,MAAM,KAAK,IAAI,IAAA,mCAAkB,EAAC,MAAM,CAAC;YAC5C,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC;gBACnB,OAAO,CAAC,OAAO,EAAE,CAAC;oBAChB,IAAI,EAAE,OAAO;oBACb,eAAe,EAAE,KAAK,CAAC,eAAe;oBACtC,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,KAAK,EAAE,EAAE;iBACV,CAAC,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,CAAC,GAAW,EAA8B,EAAE;QACvD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpB,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;QAClB,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,CAAC,KAAuB,EAAoB,EAAE,CAAC,CAAC;QAC3D,GAAG,KAAK;QACR,OAAO,EAAE,KAAK,CAAC,OAAO,GAAG,CAAC;KAC3B,CAAC,CAAC;IAEH;;;OAGG;IACH,MAAM,UAAU,GAAG,CAAC,OAAoC,EAAsB,EAAE;QAC9E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAuB,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACnC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YAChD,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC7F,IAAI,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;gBAC/D,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrB,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,KAAK,MAAM,KAAK,IAAI,QAAQ;YAC1B,OAAO,CAAC,OAAO,EAAE,CAAC;gBAChB,IAAI,EAAE,UAAU;gBAChB,eAAe,EAAE,KAAK,CAAC,eAAe;gBACtC,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;QACL,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;IAEF,iFAAiF;IACjF,MAAM,IAAI,GAAG,CAAC,GAAW,EAAQ,EAAE;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO;YAAE,OAAO;QAC3C,uFAAuF;QACvF,IAAI,SAAS,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;YAClC,SAAS,GAAG,GAAG,CAAC;YAChB,MAAM,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC;YAC9B,IAAI,GAAG,KAAK,SAAS;gBAAE,OAAO;YAC9B,MAAM,MAAM,GAAG,OAAO,CAAC;gBACrB,KAAK,EAAE,QAAQ;gBACf,eAAe,EAAE,GAAG,CAAC,eAAe;gBACpC,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC/D,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,eAAe,EAAE,GAAG,CAAC,eAAe;gBACpC,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,OAAO,EAAE,GAAG,CAAC,OAAO,GAAG,CAAC;gBACxB,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;aAChE,CAAC,CAAC;YACH,wFAAwF;YACxF,8DAA8D;YAC9D,IAAI,CAAC,MAAM;gBAAE,KAAK,MAAM,KAAK,IAAI,OAAO;oBAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,MAAM,KAAK,IAAI,SAAS;gBAC3B,OAAO,CAAC,OAAO,EAAE,CAAC;oBAChB,IAAI,EAAE,MAAM;oBACZ,eAAe,EAAE,KAAK,CAAC,eAAe;oBACtC,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,MAAM,EAAE,wBAAwB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;iBACzF,CAAC,CAAC;QACP,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,CAAC,KAAuB,EAAE,KAAgB,EAAQ,EAAE;QAC/D,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI;YAChC,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,IAAI,GAAG,EAA4B;SAC7C,CAAC;QACF,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACzD,IAAI,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO;YAC1D,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QAClD,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,CACb,KAAuB,EACvB,KAAgB,EAChB,MAAyB,EACzB,MAAc,EACR,EAAE;QACR,IAAI,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;YAClD,OAAO,CAAC,OAAO,EAAE,CAAC;gBAChB,IAAI,EAAE,UAAU;gBAChB,eAAe,EAAE,KAAK,CAAC,eAAe;gBACtC,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,IAAI,iCAAyB,EAAE,CAAC;YAC/C,OAAO,CAAC,OAAO,EAAE,CAAC;gBAChB,IAAI,EAAE,MAAM;gBACZ,eAAe,EAAE,KAAK,CAAC,eAAe;gBACtC,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,MAAM;aACP,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,OAAO,CAAC,OAAO,EAAE,CAAC;YAChB,IAAI,EAAE,SAAS;YACf,eAAe,EAAE,KAAK,CAAC,eAAe;YACtC,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,MAAM;SACP,CAAC,CAAC;QACH,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC,CAAC;IAEF,OAAO;QACL,+FAA+F;QAC/F,YAAY,EAAE,CAAC,GAAG,EAAE,EAAE;YACpB,MAAM,MAAM,GAAG,IAAA,mCAAkB,EAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC1C,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC;gBACrC,MAAM,IAAI,KAAK,CAAC,cAAc,GAAG,CAAC,UAAU,mCAAmC,CAAC,CAAC;YACnF,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,IAAA,8BAAa,EAAC,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;gBAAE,OAAO;YACnF,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YACjC,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACtF,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YAChE,gFAAgF;YAChF,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC;QACD,uFAAuF;QACvF,QAAQ,EAAE,CAAC,GAAe,EAAE,UAAyB,EAAE,EAAE;YACvD,MAAM,MAAM,GAAG,IAAA,iCAAgB,EAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC7C,KAAK,CAAC,KAAK,IAAI,EAAE;gBACf,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;oBACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC;oBAC1C,OACE,CAAC,OAAO;wBACR,eAAe,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC;wBAC1E,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ;wBAErB,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;gBACvB,CAAC;gBACD,IAAI,OAAO;oBAAE,OAAO;gBACpB,KAAK,MAAM,KAAK,IAAI,IAAA,mCAAkB,EAAC,MAAM,CAAC;oBAC5C,MAAM,CACJ,KAAK,EACL,MAAM,EACN,CAAC,GAAG,CAAC,UAAU,CAAC,EAChB,6EAA6E,CAC9E,CAAC;YACN,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;gBAC5B,kFAAkF;gBAClF,IAAI,OAAO;oBAAE,OAAO;gBACpB,KAAK,MAAM,KAAK,IAAI,IAAA,mCAAkB,EAAC,MAAM,CAAC;oBAC5C,OAAO,CAAC,OAAO,EAAE,CAAC;wBAChB,IAAI,EAAE,MAAM;wBACZ,eAAe,EAAE,KAAK,CAAC,eAAe;wBACtC,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,MAAM,EAAE,wBAAwB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBACzF,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,EAAE,CAAC,GAAe,EAAE,MAAc,EAAE,EAAE;YAC1C,MAAM,MAAM,GAAG,IAAA,iCAAgB,EAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC9C,KAAK,MAAM,KAAK,IAAI,IAAA,mCAAkB,EAAC,MAAM,CAAC,EAAE,CAAC;oBAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;oBAChD,0FAA0F;oBAC1F,wFAAwF;oBACxF,+DAA+D;oBAC/D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO;wBAAE,SAAS;oBACzE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;gBACnE,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,mEAAmE;gBACnE,KAAK,MAAM,KAAK,IAAI,IAAA,mCAAkB,EAAC,MAAM,CAAC;oBAC5C,OAAO,CAAC,OAAO,EAAE,CAAC;wBAChB,IAAI,EAAE,MAAM;wBACZ,eAAe,EAAE,KAAK,CAAC,eAAe;wBACtC,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,MAAM,EAAE,wBAAwB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBACzF,CAAC,CAAC;YACP,CAAC;QACH,CAAC;QACD,OAAO,EAAE,GAAG,EAAE;YACZ,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC5D,IAAI,KAAK,CAAC,IAAI,IAAI,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC;oBAAE,SAAS;gBACtF,4FAA4F;gBAC5F,MAAM,CACJ,KAAK,CAAC,KAAK,EACX,KAAK,EACL,KAAK,CAAC,MAAM,EACZ,kDAAkD,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CACxE,CAAC;YACJ,CAAC;QACH,CAAC;QACD,IAAI,EAAE,GAAG,EAAE;YACT,OAAO,GAAG,IAAI,CAAC;YACf,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;gBAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACnD,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -8,6 +8,13 @@ export interface ReportSchedulerOptions {
|
|
|
8
8
|
timeZone: TimeZoneSetting;
|
|
9
9
|
statePath: string;
|
|
10
10
|
intake: Pick<StimulusIntake, 'acceptScheduled'>;
|
|
11
|
+
/**
|
|
12
|
+
* Write a daily wiki page at reports.daily_hour; only with the wiki enabled. `written` says
|
|
13
|
+
* whether daily/<day>.md was written at or after `since`: the day counts as done only then.
|
|
14
|
+
*/
|
|
15
|
+
dailyPages?: {
|
|
16
|
+
written(day: string, since: number): boolean;
|
|
17
|
+
};
|
|
11
18
|
/** Includes queued/retrying inputs across restarts, excludes uncertain failed turns. */
|
|
12
19
|
hasPendingReport: () => boolean;
|
|
13
20
|
sendToOwner: (text: string, idempotencyKey: string) => Promise<void>;
|
|
@@ -18,7 +25,7 @@ export declare function createReportScheduler(options: ReportSchedulerOptions):
|
|
|
18
25
|
tick: (now?: Date) => void;
|
|
19
26
|
start: () => void;
|
|
20
27
|
stop: () => void;
|
|
21
|
-
onResult: (row: Pick<MailboxRow, "stimulusId" | "payload">, result: Pick<NativeTurnResult, "response">) => Promise<void>;
|
|
28
|
+
onResult: (row: Pick<MailboxRow, "stimulusId" | "payload" | "occurredAt">, result: Pick<NativeTurnResult, "response">) => Promise<void>;
|
|
22
29
|
};
|
|
23
30
|
export type ReportScheduler = ReturnType<typeof createReportScheduler>;
|
|
24
31
|
//# sourceMappingURL=report-scheduler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report-scheduler.d.ts","sourceRoot":"","sources":["../../src/runtime/report-scheduler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAEzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"report-scheduler.d.ts","sourceRoot":"","sources":["../../src/runtime/report-scheduler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAEzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AASrD,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,eAAe,CAAC;IACxB,QAAQ,EAAE,eAAe,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;IAChD;;;OAGG;IACH,UAAU,CAAC,EAAE;QAAE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IAC9D,wFAAwF;IACxF,gBAAgB,EAAE,MAAM,OAAO,CAAC;IAChC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACnC;AAyBD,mFAAmF;AACnF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB;0BAGlC,IAAI;;;oBA6E5B,IAAI,CAAC,UAAU,EAAE,YAAY,GAAG,SAAS,GAAG,YAAY,CAAC,UACtD,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,KACzC,OAAO,CAAC,IAAI,CAAC;EA0BnB;AAED,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
|
|
@@ -14,7 +14,11 @@ function loadState(path) {
|
|
|
14
14
|
!['lastFullKey', 'lastReminderKey'].every((key) => {
|
|
15
15
|
const value = state[key];
|
|
16
16
|
return (value === null || (typeof value === 'string' && /^\d{4}-\d{2}-\d{2}:\d{2}$/.test(value)));
|
|
17
|
-
})
|
|
17
|
+
}) ||
|
|
18
|
+
!(state.lastDailyKey === undefined ||
|
|
19
|
+
state.lastDailyKey === null ||
|
|
20
|
+
(typeof state.lastDailyKey === 'string' &&
|
|
21
|
+
/^\d{4}-\d{2}-\d{2}$/.test(state.lastDailyKey))))
|
|
18
22
|
throw new Error('Invalid report schedule state');
|
|
19
23
|
return state;
|
|
20
24
|
}
|
|
@@ -35,22 +39,43 @@ function createReportScheduler(options) {
|
|
|
35
39
|
}).formatToParts(now);
|
|
36
40
|
const part = (type) => parts.find((entry) => entry.type === type).value;
|
|
37
41
|
const hour = Number(part('hour'));
|
|
38
|
-
const
|
|
42
|
+
const day = `${part('year')}-${part('month')}-${part('day')}`;
|
|
43
|
+
const hourKey = `${day}:${part('hour')}`;
|
|
39
44
|
const full = options.config.full_report_hours.includes(hour);
|
|
40
|
-
|
|
41
|
-
? state.lastFullKey
|
|
42
|
-
: hour
|
|
43
|
-
hour
|
|
44
|
-
state.lastReminderKey
|
|
45
|
+
const reportDue = full
|
|
46
|
+
? state.lastFullKey !== hourKey
|
|
47
|
+
: hour >= options.config.reminder_start_hour &&
|
|
48
|
+
hour <= options.config.reminder_end_hour &&
|
|
49
|
+
state.lastReminderKey !== hourKey &&
|
|
45
50
|
// A full report already sent this hour covers it, even if the hour is no longer a
|
|
46
51
|
// full-report hour after a config change.
|
|
47
|
-
state.lastFullKey
|
|
52
|
+
state.lastFullKey !== hourKey;
|
|
53
|
+
// The day's page is due from its hour on; a day missed while the daemon was down or a report
|
|
54
|
+
// was pending is written at the next tick after midnight. A first start waits for the hour.
|
|
55
|
+
// At hour 0 the page is for the day that just ended, not the one that began.
|
|
56
|
+
const [year, month, date] = day.split('-').map(Number);
|
|
57
|
+
const yesterday = new Date(Date.UTC(year, month - 1, date - 1)).toISOString().slice(0, 10);
|
|
58
|
+
const dailyDay = options.config.daily_hour === 0
|
|
59
|
+
? yesterday
|
|
60
|
+
: hour >= options.config.daily_hour
|
|
61
|
+
? day
|
|
62
|
+
: state.lastDailyKey
|
|
63
|
+
? yesterday
|
|
64
|
+
: null;
|
|
65
|
+
// A report due in the same hour goes first.
|
|
66
|
+
const dailyDue = !reportDue &&
|
|
67
|
+
options.dailyPages !== undefined &&
|
|
68
|
+
dailyDay !== null &&
|
|
69
|
+
(state.lastDailyKey ?? '') < dailyDay;
|
|
70
|
+
if (!reportDue && !dailyDue)
|
|
48
71
|
return;
|
|
49
|
-
const payload =
|
|
50
|
-
report:
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
72
|
+
const payload = dailyDue
|
|
73
|
+
? { report: 'daily', hourKey, day: dailyDay }
|
|
74
|
+
: {
|
|
75
|
+
report: full ? 'full' : 'reminder',
|
|
76
|
+
hourKey,
|
|
77
|
+
...(full ? { previousFullReportAt: state.lastFullKey } : {}),
|
|
78
|
+
};
|
|
54
79
|
options.intake.acceptScheduled({
|
|
55
80
|
id: `report:${hourKey}:${(0, node_crypto_1.randomUUID)()}`,
|
|
56
81
|
channelKey: turn_orders_js_1.REPORT_CHANNEL,
|
|
@@ -79,16 +104,22 @@ function createReportScheduler(options) {
|
|
|
79
104
|
timer = undefined;
|
|
80
105
|
},
|
|
81
106
|
onResult: async (row, result) => {
|
|
82
|
-
const { report, hourKey } = (0, turn_orders_js_1.scheduledReport)(row.payload);
|
|
107
|
+
const { report, hourKey, day } = (0, turn_orders_js_1.scheduledReport)(row.payload);
|
|
83
108
|
const text = result.response.trim();
|
|
84
109
|
if (!text)
|
|
85
110
|
throw new Error('Scheduled report returned empty output');
|
|
111
|
+
// An [ack] without the page would leave the day unwritten for good; failing the turn retries it.
|
|
112
|
+
if (report === 'daily' && options.dailyPages?.written(day, row.occurredAt) !== true)
|
|
113
|
+
throw new Error(`The daily order ended without writing daily/${day}.md`);
|
|
86
114
|
// A reminder with nothing that needs the owner ends with [ack] and is not sent; the last
|
|
87
|
-
// marker decides, as for delta replies.
|
|
115
|
+
// marker decides, as for delta replies. A daily page goes to the wiki, never to the owner.
|
|
88
116
|
const lastMarker = text.slice(Math.max(text.lastIndexOf('[notify]'), text.lastIndexOf('[ack]')));
|
|
89
|
-
if (
|
|
117
|
+
if (report === 'full' || (report === 'reminder' && !lastMarker.startsWith('[ack]')))
|
|
90
118
|
await options.sendToOwner(text, `report:${hourKey}:${report}`);
|
|
91
|
-
|
|
119
|
+
// A daily page rewritten for an earlier day leaves the latest day in place.
|
|
120
|
+
const next = report === 'daily'
|
|
121
|
+
? { ...state, lastDailyKey: [state.lastDailyKey ?? '', day].sort().at(-1) }
|
|
122
|
+
: { ...state, [report === 'full' ? 'lastFullKey' : 'lastReminderKey']: hourKey };
|
|
92
123
|
(0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(options.statePath), { recursive: true });
|
|
93
124
|
const temporary = `${options.statePath}.tmp`;
|
|
94
125
|
(0, node_fs_1.writeFileSync)(temporary, JSON.stringify(next, null, 2), 'utf8');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report-scheduler.js","sourceRoot":"","sources":["../../src/runtime/report-scheduler.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"report-scheduler.js","sourceRoot":"","sources":["../../src/runtime/report-scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,8 +4,20 @@
|
|
|
4
4
|
* Owner exchanges count only once the transport delivered them.
|
|
5
5
|
*/
|
|
6
6
|
import type { MemoryRecord } from '@jungjaehoon/mama-core';
|
|
7
|
+
import type { DatabaseAdapter } from '@jungjaehoon/mama-core/db-manager';
|
|
7
8
|
import type { Mailbox, MailboxRow } from '@jungjaehoon/mama-core/runtime/mailbox';
|
|
8
9
|
import type { SessionStartInput } from './turn-orders.js';
|
|
10
|
+
/**
|
|
11
|
+
* How long the mailbox keeps an acknowledged owner message (mama-core prunes acked rows after
|
|
12
|
+
* seven days); owner.messages says so when asked for older days.
|
|
13
|
+
*/
|
|
14
|
+
export declare const OWNER_MESSAGE_RETENTION_MS: number;
|
|
15
|
+
/** The owner's messages in [since, before), oldest first, each with the reply the turn produced. */
|
|
16
|
+
export declare function ownerExchangesBetween(mailbox: Mailbox, adapter: DatabaseAdapter, principalId: string, since: number, before: number): Array<{
|
|
17
|
+
at: number;
|
|
18
|
+
owner: string;
|
|
19
|
+
reply: string | null;
|
|
20
|
+
}>;
|
|
9
21
|
export declare function readSessionStartInput(ports: {
|
|
10
22
|
mailbox: Mailbox;
|
|
11
23
|
deliveredRefs: readonly string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-start-context.d.ts","sourceRoot":"","sources":["../../src/runtime/session-start-context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,KAAK,EAAwB,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-start-context.d.ts","sourceRoot":"","sources":["../../src/runtime/session-start-context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,KAAK,EAAwB,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAsBhF;;;GAGG;AACH,eAAO,MAAM,0BAA0B,QAAiB,CAAC;AAEzD,oGAAoG;AACpG,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,eAAe,EACxB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAe5D;AA4BD,wBAAsB,qBAAqB,CAAC,KAAK,EAAE;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,OAAO,EAAE,UAAU,CAAC;IACpB,uDAAuD;IACvD,OAAO,EAAE,MAAM,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC,CAAC;IAChD,sFAAsF;IACtF,UAAU,EAAE,MAAM,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAC5F,GAAG,EAAE,MAAM,CAAC;CACb,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAwB7B"}
|