@jungjaehoon/mama-os 0.61.2 → 0.63.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 +106 -0
- package/README.md +1 -1
- package/dist/api/drive-actions.d.ts +12 -0
- package/dist/api/drive-actions.d.ts.map +1 -0
- package/dist/api/drive-actions.js +322 -0
- package/dist/api/drive-actions.js.map +1 -0
- package/dist/api/report-source-actions.d.ts.map +1 -1
- package/dist/api/report-source-actions.js +15 -7
- package/dist/api/report-source-actions.js.map +1 -1
- package/dist/api/security-events.d.ts +26 -0
- package/dist/api/security-events.d.ts.map +1 -1
- package/dist/api/security-events.js +107 -24
- package/dist/api/security-events.js.map +1 -1
- package/dist/api/source-actions.d.ts.map +1 -1
- package/dist/api/source-actions.js +7 -7
- package/dist/api/source-actions.js.map +1 -1
- package/dist/api/stored-source-reader.d.ts.map +1 -1
- package/dist/api/stored-source-reader.js +3 -0
- package/dist/api/stored-source-reader.js.map +1 -1
- package/dist/api/trello-actions.d.ts +15 -0
- package/dist/api/trello-actions.d.ts.map +1 -0
- package/dist/api/trello-actions.js +130 -0
- package/dist/api/trello-actions.js.map +1 -0
- package/dist/api/viewer-data.d.ts +77 -0
- package/dist/api/viewer-data.d.ts.map +1 -1
- package/dist/api/viewer-data.js +116 -0
- package/dist/api/viewer-data.js.map +1 -1
- package/dist/api/viewer-server.d.ts +1 -1
- package/dist/api/viewer-server.d.ts.map +1 -1
- package/dist/api/viewer-server.js +87 -3
- package/dist/api/viewer-server.js.map +1 -1
- package/dist/api/work-actions.d.ts +3 -0
- package/dist/api/work-actions.d.ts.map +1 -1
- package/dist/api/work-actions.js +23 -15
- package/dist/api/work-actions.js.map +1 -1
- package/dist/backfill/format.d.ts +105 -0
- package/dist/backfill/format.d.ts.map +1 -0
- package/dist/backfill/format.js +314 -0
- package/dist/backfill/format.js.map +1 -0
- package/dist/backfill/push.d.ts +63 -0
- package/dist/backfill/push.d.ts.map +1 -0
- package/dist/backfill/push.js +221 -0
- package/dist/backfill/push.js.map +1 -0
- package/dist/cli/commands/backfill.d.ts +12 -0
- package/dist/cli/commands/backfill.d.ts.map +1 -0
- package/dist/cli/commands/backfill.js +67 -0
- package/dist/cli/commands/backfill.js.map +1 -0
- package/dist/cli/commands/daemon.d.ts +2 -1
- package/dist/cli/commands/daemon.d.ts.map +1 -1
- package/dist/cli/commands/daemon.js +55 -14
- package/dist/cli/commands/daemon.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +4 -2
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/index.js +18 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/runtime/claude-caller-config.d.ts +6 -1
- package/dist/cli/runtime/claude-caller-config.d.ts.map +1 -1
- package/dist/cli/runtime/claude-caller-config.js +3 -1
- package/dist/cli/runtime/claude-caller-config.js.map +1 -1
- package/dist/connectors/framework/gws-utils.d.ts +6 -3
- package/dist/connectors/framework/gws-utils.d.ts.map +1 -1
- package/dist/connectors/framework/gws-utils.js +35 -6
- package/dist/connectors/framework/gws-utils.js.map +1 -1
- package/dist/connectors/index.d.ts +0 -1
- package/dist/connectors/index.d.ts.map +1 -1
- package/dist/connectors/index.js +1 -5
- package/dist/connectors/index.js.map +1 -1
- package/dist/connectors/slack/index.d.ts +2 -0
- package/dist/connectors/slack/index.d.ts.map +1 -1
- package/dist/connectors/slack/index.js +83 -39
- package/dist/connectors/slack/index.js.map +1 -1
- package/dist/connectors/trello/action-line.d.ts +13 -0
- package/dist/connectors/trello/action-line.d.ts.map +1 -0
- package/dist/connectors/trello/action-line.js +118 -0
- package/dist/connectors/trello/action-line.js.map +1 -0
- package/dist/connectors/trello/actions.d.ts +27 -0
- package/dist/connectors/trello/actions.d.ts.map +1 -0
- package/dist/connectors/trello/actions.js +35 -0
- package/dist/connectors/trello/actions.js.map +1 -0
- package/dist/connectors/trello/api.d.ts +23 -0
- package/dist/connectors/trello/api.d.ts.map +1 -0
- package/dist/connectors/trello/api.js +102 -0
- package/dist/connectors/trello/api.js.map +1 -0
- package/dist/connectors/trello/index.d.ts +63 -31
- package/dist/connectors/trello/index.d.ts.map +1 -1
- package/dist/connectors/trello/index.js +165 -246
- package/dist/connectors/trello/index.js.map +1 -1
- package/dist/gateways/discord.d.ts +4 -0
- package/dist/gateways/discord.d.ts.map +1 -1
- package/dist/gateways/discord.js +7 -3
- package/dist/gateways/discord.js.map +1 -1
- package/dist/gateways/slack.d.ts +4 -0
- package/dist/gateways/slack.d.ts.map +1 -1
- package/dist/gateways/slack.js +7 -3
- package/dist/gateways/slack.js.map +1 -1
- package/dist/gateways/telegram-message-ledger.d.ts +5 -0
- package/dist/gateways/telegram-message-ledger.d.ts.map +1 -1
- package/dist/gateways/telegram-message-ledger.js +8 -1
- package/dist/gateways/telegram-message-ledger.js.map +1 -1
- package/dist/gateways/telegram.d.ts +4 -0
- package/dist/gateways/telegram.d.ts.map +1 -1
- package/dist/gateways/telegram.js +7 -5
- package/dist/gateways/telegram.js.map +1 -1
- package/dist/replay/replay-source-catalog.d.ts.map +1 -1
- package/dist/replay/replay-source-catalog.js +5 -45
- package/dist/replay/replay-source-catalog.js.map +1 -1
- package/dist/replay/trello-import.d.ts +1 -8
- package/dist/replay/trello-import.d.ts.map +1 -1
- package/dist/replay/trello-import.js +16 -103
- package/dist/replay/trello-import.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 +30 -1
- package/dist/runtime/action-surface.js.map +1 -1
- package/dist/runtime/config.d.ts +5 -0
- package/dist/runtime/config.d.ts.map +1 -1
- package/dist/runtime/config.js +10 -1
- package/dist/runtime/config.js.map +1 -1
- package/dist/runtime/connectors.d.ts +0 -1
- package/dist/runtime/connectors.d.ts.map +1 -1
- package/dist/runtime/connectors.js +0 -1
- package/dist/runtime/connectors.js.map +1 -1
- package/dist/runtime/egress-proxy.d.ts +15 -0
- package/dist/runtime/egress-proxy.d.ts.map +1 -0
- package/dist/runtime/egress-proxy.js +176 -0
- package/dist/runtime/egress-proxy.js.map +1 -0
- package/dist/runtime/native-session.d.ts +7 -0
- package/dist/runtime/native-session.d.ts.map +1 -1
- package/dist/runtime/native-session.js +8 -1
- package/dist/runtime/native-session.js.map +1 -1
- package/dist/runtime/outbound-attempts.d.ts +18 -0
- package/dist/runtime/outbound-attempts.d.ts.map +1 -0
- package/dist/runtime/outbound-attempts.js +98 -0
- package/dist/runtime/outbound-attempts.js.map +1 -0
- package/dist/runtime/owner-runtime.d.ts +9 -0
- package/dist/runtime/owner-runtime.d.ts.map +1 -1
- package/dist/runtime/owner-runtime.js +8 -0
- 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 +6 -1
- package/dist/runtime/owner-system-prompt.js.map +1 -1
- package/dist/runtime/record-orders.d.ts.map +1 -1
- package/dist/runtime/record-orders.js +33 -13
- package/dist/runtime/record-orders.js.map +1 -1
- package/dist/runtime/stimulus-delivery.d.ts +15 -0
- package/dist/runtime/stimulus-delivery.d.ts.map +1 -1
- package/dist/runtime/stimulus-delivery.js +29 -2
- package/dist/runtime/stimulus-delivery.js.map +1 -1
- package/dist/runtime/turn-orders.d.ts.map +1 -1
- package/dist/runtime/turn-orders.js +6 -2
- package/dist/runtime/turn-orders.js.map +1 -1
- package/package.json +2 -2
- package/public/viewer/js/modules/graph.js +169 -957
- package/public/viewer/js/modules/memory-timeline.js +215 -0
- package/public/viewer/js/utils/api.js +7 -26
- package/public/viewer/log-viewer.html +7 -3
- package/public/viewer/operator/operator.css +1 -1
- package/public/viewer/operator/operator.js +5428 -5685
- package/public/viewer/src/modules/graph.ts +185 -1132
- package/public/viewer/src/modules/memory-timeline.ts +272 -0
- package/public/viewer/src/types/global.d.ts +1 -1
- package/public/viewer/src/utils/api.ts +43 -47
- package/public/viewer/viewer.css +257 -7
- package/public/viewer/viewer.html +68 -292
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BACKFILL_FORMAT = void 0;
|
|
4
|
+
exports.parseBackfillFile = parseBackfillFile;
|
|
5
|
+
/**
|
|
6
|
+
* The backfill file: what a reader concluded about one period of raw, in a form a push can
|
|
7
|
+
* write without judging anything.
|
|
8
|
+
*
|
|
9
|
+
* The reader (an agent) reads the whole period, decides the pieces of work and writes each one
|
|
10
|
+
* complete, like a history: its revisions in event order, each at the time of the message that
|
|
11
|
+
* shows the change and citing it. The push turns the file into the owner's own actions, so the
|
|
12
|
+
* same write contract checks every row. Sources are named by their exact
|
|
13
|
+
* `connector_event_index.source_id`; the push resolves them to observation refs after import.
|
|
14
|
+
*
|
|
15
|
+
* Lines judged not to be work stay in the file (`noUpdate`): `work.no_update` keeps nothing
|
|
16
|
+
* outside a model turn, so this is the one part of the reader's coverage that MAMA does not hold.
|
|
17
|
+
*/
|
|
18
|
+
const work_actions_js_1 = require("../api/work-actions.js");
|
|
19
|
+
exports.BACKFILL_FORMAT = 'mama-backfill/1';
|
|
20
|
+
/** Parse and check a backfill file. Every problem is listed at once; nothing is guessed. */
|
|
21
|
+
function parseBackfillFile(raw) {
|
|
22
|
+
const errors = [];
|
|
23
|
+
const fail = (where, message) => {
|
|
24
|
+
errors.push(`${where}: ${message}`);
|
|
25
|
+
return undefined;
|
|
26
|
+
};
|
|
27
|
+
const object = (value, where, keys) => {
|
|
28
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
29
|
+
return fail(where, 'must be an object');
|
|
30
|
+
// A field the format does not know is refused, so `recordedAt` and the like cannot slip in.
|
|
31
|
+
for (const key of Object.keys(value))
|
|
32
|
+
if (!keys.includes(key))
|
|
33
|
+
fail(where, `unknown field ${key}`);
|
|
34
|
+
return value;
|
|
35
|
+
};
|
|
36
|
+
const text = (value, where) => typeof value === 'string' && value.trim() !== '' ? value : fail(where, 'must be nonblank text');
|
|
37
|
+
const time = (value, where) => (0, work_actions_js_1.offsetIsoTime)(value) ?? fail(where, 'must be an ISO time with its offset');
|
|
38
|
+
const list = (value, where, min = 1) => Array.isArray(value) && value.length >= min
|
|
39
|
+
? value
|
|
40
|
+
: fail(where, `must be a list of at least ${min}`);
|
|
41
|
+
const sources = (value, where) => {
|
|
42
|
+
const entries = list(value, where) ?? [];
|
|
43
|
+
return entries.flatMap((entry, index) => text(entry, `${where}[${index}]`) ?? []);
|
|
44
|
+
};
|
|
45
|
+
const ref = (value, where) => {
|
|
46
|
+
const target = object(value, where, ['item', 'commitmentId']);
|
|
47
|
+
if (!target)
|
|
48
|
+
return undefined;
|
|
49
|
+
if ((target.item === undefined) === (target.commitmentId === undefined))
|
|
50
|
+
return fail(where, 'must name exactly one of item or commitmentId');
|
|
51
|
+
if (target.item !== undefined) {
|
|
52
|
+
const key = text(target.item, `${where}.item`);
|
|
53
|
+
return key === undefined ? undefined : { item: key };
|
|
54
|
+
}
|
|
55
|
+
const id = text(target.commitmentId, `${where}.commitmentId`);
|
|
56
|
+
return id === undefined ? undefined : { commitmentId: id };
|
|
57
|
+
};
|
|
58
|
+
const file = object(raw, 'file', [
|
|
59
|
+
'format',
|
|
60
|
+
'period',
|
|
61
|
+
'items',
|
|
62
|
+
'lessons',
|
|
63
|
+
'wiki',
|
|
64
|
+
'noUpdate',
|
|
65
|
+
'links',
|
|
66
|
+
]);
|
|
67
|
+
if (!file)
|
|
68
|
+
throw new Error(errors.join('\n'));
|
|
69
|
+
if (file.format !== exports.BACKFILL_FORMAT)
|
|
70
|
+
fail('format', `must be ${exports.BACKFILL_FORMAT}`);
|
|
71
|
+
const period = object(file.period, 'period', ['from', 'until']);
|
|
72
|
+
const from = time(period?.from, 'period.from');
|
|
73
|
+
const until = time(period?.until, 'period.until');
|
|
74
|
+
if (from !== undefined && until !== undefined && from >= until)
|
|
75
|
+
fail('period', 'from must come before until');
|
|
76
|
+
const inPeriod = (at, where) => {
|
|
77
|
+
if (at !== undefined && from !== undefined && until !== undefined && (at < from || at >= until))
|
|
78
|
+
fail(where, 'is outside the period');
|
|
79
|
+
};
|
|
80
|
+
const keys = new Set();
|
|
81
|
+
const items = (list(file.items, 'items') ?? []).flatMap((value, index) => {
|
|
82
|
+
const where = `items[${index}]`;
|
|
83
|
+
const item = object(value, where, [
|
|
84
|
+
'key',
|
|
85
|
+
'commitmentId',
|
|
86
|
+
'appliesUntil',
|
|
87
|
+
'topic',
|
|
88
|
+
'revisions',
|
|
89
|
+
'mentions',
|
|
90
|
+
'links',
|
|
91
|
+
]);
|
|
92
|
+
if (!item)
|
|
93
|
+
return [];
|
|
94
|
+
const key = text(item.key, `${where}.key`) ?? where;
|
|
95
|
+
if (keys.has(key))
|
|
96
|
+
fail(`${where}.key`, `repeats ${key}`);
|
|
97
|
+
keys.add(key);
|
|
98
|
+
const at = `item ${key}`;
|
|
99
|
+
const commitmentId = item.commitmentId === undefined ? undefined : text(item.commitmentId, `${at}.commitmentId`);
|
|
100
|
+
if (commitmentId === undefined && item.appliesUntil !== undefined)
|
|
101
|
+
fail(`${at}.appliesUntil`, 'belongs only to existing work (commitmentId)');
|
|
102
|
+
if (commitmentId !== undefined && item.topic !== undefined)
|
|
103
|
+
fail(`${at}.topic`, 'belongs only to new work');
|
|
104
|
+
const appliesUntil = item.appliesUntil === undefined ? undefined : time(item.appliesUntil, `${at}.appliesUntil`);
|
|
105
|
+
const revisions = (list(item.revisions, `${at}.revisions`) ?? []).flatMap((entry, n) => {
|
|
106
|
+
const rw = `${at}.revisions[${n}]`;
|
|
107
|
+
const revision = object(entry, rw, ['at', 'summary', 'set', 'clear', 'sources']);
|
|
108
|
+
if (!revision)
|
|
109
|
+
return [];
|
|
110
|
+
const when = time(revision.at, `${rw}.at`);
|
|
111
|
+
inPeriod(when, `${rw}.at`);
|
|
112
|
+
// The work fields are the ledger's to check; here the patch only has to be an object.
|
|
113
|
+
const set = revision.set === undefined
|
|
114
|
+
? undefined
|
|
115
|
+
: typeof revision.set === 'object' &&
|
|
116
|
+
revision.set !== null &&
|
|
117
|
+
!Array.isArray(revision.set)
|
|
118
|
+
? revision.set
|
|
119
|
+
: fail(`${rw}.set`, 'must be an object');
|
|
120
|
+
const clear = revision.clear === undefined
|
|
121
|
+
? undefined
|
|
122
|
+
: (list(revision.clear, `${rw}.clear`) ?? []).flatMap((field, c) => text(field, `${rw}.clear[${c}]`) ?? []);
|
|
123
|
+
return [
|
|
124
|
+
{
|
|
125
|
+
at: when ?? 0,
|
|
126
|
+
summary: text(revision.summary, `${rw}.summary`) ?? '',
|
|
127
|
+
...(set === undefined ? {} : { set }),
|
|
128
|
+
...(clear === undefined ? {} : { clear }),
|
|
129
|
+
sources: sources(revision.sources, `${rw}.sources`),
|
|
130
|
+
},
|
|
131
|
+
];
|
|
132
|
+
});
|
|
133
|
+
for (let n = 1; n < revisions.length; n++)
|
|
134
|
+
if (revisions[n].at < revisions[n - 1].at)
|
|
135
|
+
fail(`${at}.revisions[${n}].at`, 'is earlier than the revision before it');
|
|
136
|
+
// At a time inside the period the fold starts from these revisions alone, so the first one
|
|
137
|
+
// must say what the work is.
|
|
138
|
+
if (revisions[0] && typeof revisions[0].set?.title !== 'string')
|
|
139
|
+
fail(`${at}.revisions[0].set.title`, 'the first revision must state the title');
|
|
140
|
+
const last = revisions[revisions.length - 1];
|
|
141
|
+
if (appliesUntil !== undefined && last && appliesUntil <= last.at)
|
|
142
|
+
fail(`${at}.appliesUntil`, 'must follow every revision of the period');
|
|
143
|
+
const mentions = (item.mentions === undefined ? [] : (list(item.mentions, `${at}.mentions`) ?? [])).flatMap((entry, n) => {
|
|
144
|
+
const mw = `${at}.mentions[${n}]`;
|
|
145
|
+
const m = object(entry, mw, ['reason', 'sources']);
|
|
146
|
+
return m
|
|
147
|
+
? [
|
|
148
|
+
{
|
|
149
|
+
reason: text(m.reason, `${mw}.reason`) ?? '',
|
|
150
|
+
sources: sources(m.sources, `${mw}.sources`),
|
|
151
|
+
},
|
|
152
|
+
]
|
|
153
|
+
: [];
|
|
154
|
+
});
|
|
155
|
+
const links = (item.links === undefined ? [] : (list(item.links, `${at}.links`) ?? [])).flatMap((entry, n) => {
|
|
156
|
+
const lw = `${at}.links[${n}]`;
|
|
157
|
+
const link = object(entry, lw, ['to', 'relation', 'reason', 'sources']);
|
|
158
|
+
if (!link)
|
|
159
|
+
return [];
|
|
160
|
+
const to = ref(link.to, `${lw}.to`);
|
|
161
|
+
if (!work_actions_js_1.LINK_RELATIONS.includes(link.relation))
|
|
162
|
+
fail(`${lw}.relation`, `must be one of ${work_actions_js_1.LINK_RELATIONS.join(', ')}`);
|
|
163
|
+
if (!to)
|
|
164
|
+
return [];
|
|
165
|
+
return [
|
|
166
|
+
{
|
|
167
|
+
to,
|
|
168
|
+
relation: link.relation,
|
|
169
|
+
reason: text(link.reason, `${lw}.reason`) ?? '',
|
|
170
|
+
...(link.sources === undefined
|
|
171
|
+
? {}
|
|
172
|
+
: { sources: sources(link.sources, `${lw}.sources`) }),
|
|
173
|
+
},
|
|
174
|
+
];
|
|
175
|
+
});
|
|
176
|
+
return [
|
|
177
|
+
{
|
|
178
|
+
key,
|
|
179
|
+
...(commitmentId === undefined ? {} : { commitmentId }),
|
|
180
|
+
...(appliesUntil === undefined ? {} : { appliesUntil }),
|
|
181
|
+
...(item.topic === undefined ? {} : { topic: text(item.topic, `${at}.topic`) ?? '' }),
|
|
182
|
+
revisions,
|
|
183
|
+
...(mentions.length === 0 ? {} : { mentions }),
|
|
184
|
+
...(links.length === 0 ? {} : { links }),
|
|
185
|
+
},
|
|
186
|
+
];
|
|
187
|
+
});
|
|
188
|
+
for (const item of items)
|
|
189
|
+
for (const link of item.links ?? [])
|
|
190
|
+
if ('item' in link.to && (!keys.has(link.to.item) || link.to.item === item.key))
|
|
191
|
+
fail(`item ${item.key}.links`, `names no other item ${link.to.item}`);
|
|
192
|
+
const lessonKeys = new Set();
|
|
193
|
+
const lessons = (file.lessons === undefined ? [] : (list(file.lessons, 'lessons', 0) ?? [])).flatMap((value, index) => {
|
|
194
|
+
const where = `lessons[${index}]`;
|
|
195
|
+
const lesson = object(value, where, [
|
|
196
|
+
'key',
|
|
197
|
+
'at',
|
|
198
|
+
'topic',
|
|
199
|
+
'summary',
|
|
200
|
+
'details',
|
|
201
|
+
'appliesWhen',
|
|
202
|
+
'sources',
|
|
203
|
+
]);
|
|
204
|
+
if (!lesson)
|
|
205
|
+
return [];
|
|
206
|
+
const key = text(lesson.key, `${where}.key`) ?? where;
|
|
207
|
+
if (lessonKeys.has(key))
|
|
208
|
+
fail(`${where}.key`, `repeats ${key}`);
|
|
209
|
+
lessonKeys.add(key);
|
|
210
|
+
const at = time(lesson.at, `${where}.at`);
|
|
211
|
+
inPeriod(at, `${where}.at`);
|
|
212
|
+
return [
|
|
213
|
+
{
|
|
214
|
+
key,
|
|
215
|
+
at: at ?? 0,
|
|
216
|
+
topic: text(lesson.topic, `${where}.topic`) ?? '',
|
|
217
|
+
summary: text(lesson.summary, `${where}.summary`) ?? '',
|
|
218
|
+
details: text(lesson.details, `${where}.details`) ?? '',
|
|
219
|
+
appliesWhen: text(lesson.appliesWhen, `${where}.appliesWhen`) ?? '',
|
|
220
|
+
sources: sources(lesson.sources, `${where}.sources`),
|
|
221
|
+
},
|
|
222
|
+
];
|
|
223
|
+
});
|
|
224
|
+
const paths = new Set();
|
|
225
|
+
const wiki = (file.wiki === undefined ? [] : (list(file.wiki, 'wiki', 0) ?? [])).flatMap((value, index) => {
|
|
226
|
+
const where = `wiki[${index}]`;
|
|
227
|
+
const page = object(value, where, ['path', 'title', 'content', 'append', 'sources']);
|
|
228
|
+
if (!page)
|
|
229
|
+
return [];
|
|
230
|
+
const path = text(page.path, `${where}.path`) ?? '';
|
|
231
|
+
if (path.startsWith('/') || path.split('/').includes('..') || !path.endsWith('.md'))
|
|
232
|
+
fail(`${where}.path`, 'must be a relative .md path inside the wiki');
|
|
233
|
+
if (paths.has(path))
|
|
234
|
+
fail(`${where}.path`, `repeats ${path}`);
|
|
235
|
+
paths.add(path);
|
|
236
|
+
const pageSources = page.sources === undefined ? {} : { sources: sources(page.sources, `${where}.sources`) };
|
|
237
|
+
if (page.append === undefined) {
|
|
238
|
+
return [
|
|
239
|
+
{
|
|
240
|
+
path,
|
|
241
|
+
title: text(page.title, `${where}.title`) ?? '',
|
|
242
|
+
content: text(page.content, `${where}.content`) ?? '',
|
|
243
|
+
...pageSources,
|
|
244
|
+
},
|
|
245
|
+
];
|
|
246
|
+
}
|
|
247
|
+
if (page.title !== undefined || page.content !== undefined)
|
|
248
|
+
fail(where, 'carries either title and content (a new page) or append (an existing page)');
|
|
249
|
+
const append = (list(page.append, `${where}.append`) ?? []).flatMap((entry, n) => {
|
|
250
|
+
const edit = object(entry, `${where}.append[${n}]`, ['section', 'text']);
|
|
251
|
+
if (!edit)
|
|
252
|
+
return [];
|
|
253
|
+
const section = text(edit.section, `${where}.append[${n}].section`) ?? '';
|
|
254
|
+
if (!/^#{1,6}\s/.test(section))
|
|
255
|
+
fail(`${where}.append[${n}].section`, 'must be a Markdown heading line');
|
|
256
|
+
return [{ section, text: text(edit.text, `${where}.append[${n}].text`) ?? '' }];
|
|
257
|
+
});
|
|
258
|
+
return [{ path, append, ...pageSources }];
|
|
259
|
+
});
|
|
260
|
+
const noUpdate = (file.noUpdate === undefined ? [] : (list(file.noUpdate, 'noUpdate', 0) ?? [])).flatMap((value, index) => {
|
|
261
|
+
const entry = object(value, `noUpdate[${index}]`, ['reason', 'sources']);
|
|
262
|
+
if (!entry)
|
|
263
|
+
return [];
|
|
264
|
+
return [
|
|
265
|
+
{
|
|
266
|
+
reason: text(entry.reason, `noUpdate[${index}].reason`) ?? '',
|
|
267
|
+
sources: sources(entry.sources, `noUpdate[${index}].sources`),
|
|
268
|
+
},
|
|
269
|
+
];
|
|
270
|
+
});
|
|
271
|
+
const workRef = (value, where) => {
|
|
272
|
+
const found = ref(value, where);
|
|
273
|
+
if (found && 'item' in found && !keys.has(found.item))
|
|
274
|
+
fail(`${where}.item`, `names no item ${found.item}`);
|
|
275
|
+
return found;
|
|
276
|
+
};
|
|
277
|
+
const links = (file.links === undefined ? [] : (list(file.links, 'links', 0) ?? [])).flatMap((value, index) => {
|
|
278
|
+
const where = `links[${index}]`;
|
|
279
|
+
const link = object(value, where, ['from', 'to', 'relation', 'reason', 'sources']);
|
|
280
|
+
if (!link)
|
|
281
|
+
return [];
|
|
282
|
+
const from = workRef(link.from, `${where}.from`);
|
|
283
|
+
const to = workRef(link.to, `${where}.to`);
|
|
284
|
+
if (from && to && JSON.stringify(from) === JSON.stringify(to))
|
|
285
|
+
fail(where, 'links work to itself');
|
|
286
|
+
if (!work_actions_js_1.LINK_RELATIONS.includes(link.relation))
|
|
287
|
+
fail(`${where}.relation`, `must be one of ${work_actions_js_1.LINK_RELATIONS.join(', ')}`);
|
|
288
|
+
if (!from || !to)
|
|
289
|
+
return [];
|
|
290
|
+
return [
|
|
291
|
+
{
|
|
292
|
+
from,
|
|
293
|
+
to,
|
|
294
|
+
relation: link.relation,
|
|
295
|
+
reason: text(link.reason, `${where}.reason`) ?? '',
|
|
296
|
+
...(link.sources === undefined
|
|
297
|
+
? {}
|
|
298
|
+
: { sources: sources(link.sources, `${where}.sources`) }),
|
|
299
|
+
},
|
|
300
|
+
];
|
|
301
|
+
});
|
|
302
|
+
if (errors.length > 0)
|
|
303
|
+
throw new Error(`Backfill file is invalid:\n${errors.join('\n')}`);
|
|
304
|
+
return {
|
|
305
|
+
format: exports.BACKFILL_FORMAT,
|
|
306
|
+
period: { from: from, until: until },
|
|
307
|
+
items,
|
|
308
|
+
lessons,
|
|
309
|
+
wiki,
|
|
310
|
+
noUpdate,
|
|
311
|
+
links,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/backfill/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Push a checked backfill file through the owner's own actions. It judges nothing: every work
|
|
3
|
+
* item, revision, link, lesson and page is the reader's, written as the file states it.
|
|
4
|
+
*
|
|
5
|
+
* Each call carries a deterministic operation id, `backfill:<period start>:<key>:...`, which the
|
|
6
|
+
* ledger keeps as the command id. That is the provenance of a backfill write, and it makes a
|
|
7
|
+
* re-run resume: work, link and memory writes replay their first receipt, and a changed payload
|
|
8
|
+
* under the same id is refused rather than written twice. Wiki pages are not command-idempotent,
|
|
9
|
+
* so the pages already published are passed in and skipped.
|
|
10
|
+
*/
|
|
11
|
+
import type { BackfillFile } from './format.js';
|
|
12
|
+
export interface BackfillSource {
|
|
13
|
+
observationRef: string;
|
|
14
|
+
connector: string;
|
|
15
|
+
}
|
|
16
|
+
export interface BackfillPushPorts {
|
|
17
|
+
/** One owner action under the period's ceiling; returns its data or throws with the failure. */
|
|
18
|
+
callAction(name: string, input: Record<string, unknown>, operationId: string): Promise<unknown>;
|
|
19
|
+
/** Exact `connector_event_index.source_id`s to observations; throws naming every unresolved id. */
|
|
20
|
+
resolveSources(sourceIds: readonly string[]): ReadonlyMap<string, BackfillSource>;
|
|
21
|
+
/** The earliest event time of existing work at or after `after` (the period's end): the period's bound. */
|
|
22
|
+
firstEventAt(commitmentId: string, after: number): number;
|
|
23
|
+
/** Wiki pages an earlier run already published, by operation id. */
|
|
24
|
+
publishedPages: ReadonlySet<string>;
|
|
25
|
+
/** Called after a wiki page is published, so a later run skips it. */
|
|
26
|
+
pagePublished(operationId: string): void;
|
|
27
|
+
}
|
|
28
|
+
export interface BackfillPushResult {
|
|
29
|
+
created: number;
|
|
30
|
+
revised: number;
|
|
31
|
+
mentions: number;
|
|
32
|
+
links: number;
|
|
33
|
+
lessons: number;
|
|
34
|
+
pagesPublished: number;
|
|
35
|
+
pagesSkipped: number;
|
|
36
|
+
/** Lines the reader judged not to be work; they stay in the file only. */
|
|
37
|
+
notWork: number;
|
|
38
|
+
}
|
|
39
|
+
export declare function pushBackfill(file: BackfillFile, ports: BackfillPushPorts): Promise<BackfillPushResult>;
|
|
40
|
+
/** Resolve exact source ids through the connector index; every id must name one observation. */
|
|
41
|
+
export declare function indexSourceResolver(adapter: {
|
|
42
|
+
prepare(sql: string): {
|
|
43
|
+
all(...params: unknown[]): unknown[];
|
|
44
|
+
};
|
|
45
|
+
}): BackfillPushPorts['resolveSources'];
|
|
46
|
+
/**
|
|
47
|
+
* The earliest event time of existing work at or after the period's end, read through the ledger.
|
|
48
|
+
* Revisions of the period itself (a re-run finds its own) fall before it; a later period's
|
|
49
|
+
* revisions count whether or not an earlier backfill bounded them.
|
|
50
|
+
*/
|
|
51
|
+
export declare function ledgerFirstEventAt(readWork: (query: {
|
|
52
|
+
commitmentId: string;
|
|
53
|
+
history: 'all';
|
|
54
|
+
}) => {
|
|
55
|
+
items: Array<{
|
|
56
|
+
history?: Array<{
|
|
57
|
+
eventDatetime: number | null;
|
|
58
|
+
appliesUntil: number | null;
|
|
59
|
+
createdAt: number;
|
|
60
|
+
}>;
|
|
61
|
+
}>;
|
|
62
|
+
}): BackfillPushPorts['firstEventAt'];
|
|
63
|
+
//# sourceMappingURL=push.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/backfill/push.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,aAAa,CAAC;AAE9D,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,gGAAgG;IAChG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChG,mGAAmG;IACnG,cAAc,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAClF,2GAA2G;IAC3G,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1D,oEAAoE;IACpE,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,sEAAsE;IACtE,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1C;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC;CACjB;AAyBD,wBAAsB,YAAY,CAChC,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAgM7B;AAQD,gGAAgG;AAChG,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAA;KAAE,CAAC;CAChE,GAAG,iBAAiB,CAAC,gBAAgB,CAAC,CAkCtC;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,CAAC,KAAK,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAA;CAAE,KAAK;IAC7D,KAAK,EAAE,KAAK,CAAC;QACX,OAAO,CAAC,EAAE,KAAK,CAAC;YACd,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;YAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;YAC5B,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC,CAAC;KACJ,CAAC,CAAC;CACJ,GACA,iBAAiB,CAAC,cAAc,CAAC,CAUnC"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pushBackfill = pushBackfill;
|
|
4
|
+
exports.indexSourceResolver = indexSourceResolver;
|
|
5
|
+
exports.ledgerFirstEventAt = ledgerFirstEventAt;
|
|
6
|
+
function allSources(file) {
|
|
7
|
+
const ids = new Set();
|
|
8
|
+
const add = (sources) => sources?.forEach((id) => ids.add(id));
|
|
9
|
+
for (const item of file.items) {
|
|
10
|
+
item.revisions.forEach((revision) => add(revision.sources));
|
|
11
|
+
item.mentions?.forEach((group) => add(group.sources));
|
|
12
|
+
item.links?.forEach((link) => add(link.sources));
|
|
13
|
+
}
|
|
14
|
+
file.lessons.forEach((lesson) => add(lesson.sources));
|
|
15
|
+
file.wiki.forEach((page) => add(page.sources));
|
|
16
|
+
file.links.forEach((link) => add(link.sources));
|
|
17
|
+
// Not-work lines are resolved too: a period is pushed only when all of it was imported.
|
|
18
|
+
file.noUpdate.forEach((entry) => add(entry.sources));
|
|
19
|
+
return [...ids];
|
|
20
|
+
}
|
|
21
|
+
function commitmentIdOf(data, operationId) {
|
|
22
|
+
const id = data?.commitmentId;
|
|
23
|
+
if (typeof id !== 'string' || id === '')
|
|
24
|
+
throw new Error(`${operationId} returned no commitmentId`);
|
|
25
|
+
return id;
|
|
26
|
+
}
|
|
27
|
+
async function pushBackfill(file, ports) {
|
|
28
|
+
const sources = ports.resolveSources(allSources(file));
|
|
29
|
+
const observations = (ids) => (ids ?? []).map((id) => sources.get(id).observationRef);
|
|
30
|
+
const evidence = (ids) => observations(ids).map((id) => ({
|
|
31
|
+
relation: 'derived_from',
|
|
32
|
+
target: { kind: 'observation', id },
|
|
33
|
+
}));
|
|
34
|
+
const prefix = `backfill:${file.period.from}:`;
|
|
35
|
+
const result = {
|
|
36
|
+
created: 0,
|
|
37
|
+
revised: 0,
|
|
38
|
+
mentions: 0,
|
|
39
|
+
links: 0,
|
|
40
|
+
lessons: 0,
|
|
41
|
+
pagesPublished: 0,
|
|
42
|
+
pagesSkipped: 0,
|
|
43
|
+
notWork: file.noUpdate.reduce((sum, entry) => sum + entry.sources.length, 0),
|
|
44
|
+
};
|
|
45
|
+
// Every bound is settled before anything is written.
|
|
46
|
+
const bounds = new Map();
|
|
47
|
+
for (const item of file.items) {
|
|
48
|
+
if (item.commitmentId === undefined)
|
|
49
|
+
continue;
|
|
50
|
+
bounds.set(item.key, item.appliesUntil ?? ports.firstEventAt(item.commitmentId, file.period.until));
|
|
51
|
+
}
|
|
52
|
+
// Each piece of work goes in complete, its revisions in event order.
|
|
53
|
+
const ids = new Map();
|
|
54
|
+
for (const item of file.items)
|
|
55
|
+
ids.set(item.key, await pushItem(item));
|
|
56
|
+
async function pushItem(item) {
|
|
57
|
+
let commitmentId = item.commitmentId;
|
|
58
|
+
const appliesUntil = bounds.get(item.key);
|
|
59
|
+
for (const [n, revision] of item.revisions.entries()) {
|
|
60
|
+
const operationId = `${prefix}${item.key}:r${n}`;
|
|
61
|
+
const fields = {
|
|
62
|
+
summary: revision.summary,
|
|
63
|
+
...(revision.set === undefined ? {} : { set: revision.set }),
|
|
64
|
+
eventDatetime: revision.at,
|
|
65
|
+
links: evidence(revision.sources),
|
|
66
|
+
};
|
|
67
|
+
if (commitmentId === undefined) {
|
|
68
|
+
commitmentId = commitmentIdOf(await ports.callAction('work.create', { topic: item.topic ?? item.key, ...fields }, operationId), operationId);
|
|
69
|
+
result.created += 1;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
await ports.callAction('work.revise', {
|
|
73
|
+
commitmentId,
|
|
74
|
+
...fields,
|
|
75
|
+
...(revision.clear === undefined ? {} : { clear: revision.clear }),
|
|
76
|
+
...(appliesUntil === undefined ? {} : { appliesUntil }),
|
|
77
|
+
}, operationId);
|
|
78
|
+
result.revised += 1;
|
|
79
|
+
}
|
|
80
|
+
return commitmentId;
|
|
81
|
+
}
|
|
82
|
+
for (const item of file.items) {
|
|
83
|
+
const from = ids.get(item.key);
|
|
84
|
+
for (const [g, group] of (item.mentions ?? []).entries()) {
|
|
85
|
+
for (const [n, observation] of observations(group.sources).entries()) {
|
|
86
|
+
await ports.callAction('work.link', {
|
|
87
|
+
from,
|
|
88
|
+
to: { kind: 'observation', id: observation },
|
|
89
|
+
relation: 'mentions',
|
|
90
|
+
reason: group.reason,
|
|
91
|
+
}, `${prefix}${item.key}:m${g}.${n}`);
|
|
92
|
+
result.mentions += 1;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
for (const [n, link] of (item.links ?? []).entries()) {
|
|
96
|
+
const to = 'item' in link.to ? ids.get(link.to.item) : link.to.commitmentId;
|
|
97
|
+
await ports.callAction('work.link', {
|
|
98
|
+
from,
|
|
99
|
+
to: { kind: 'work', id: to },
|
|
100
|
+
relation: link.relation,
|
|
101
|
+
reason: link.reason,
|
|
102
|
+
...(link.sources === undefined ? {} : { evidenceRefs: observations(link.sources) }),
|
|
103
|
+
}, `${prefix}${item.key}:l${n}`);
|
|
104
|
+
result.links += 1;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const workId = (ref) => 'item' in ref ? ids.get(ref.item) : ref.commitmentId;
|
|
108
|
+
for (const [n, link] of file.links.entries()) {
|
|
109
|
+
await ports.callAction('work.link', {
|
|
110
|
+
from: workId(link.from),
|
|
111
|
+
to: { kind: 'work', id: workId(link.to) },
|
|
112
|
+
relation: link.relation,
|
|
113
|
+
reason: link.reason,
|
|
114
|
+
...(link.sources === undefined ? {} : { evidenceRefs: observations(link.sources) }),
|
|
115
|
+
}, `${prefix}link:${n}`);
|
|
116
|
+
result.links += 1;
|
|
117
|
+
}
|
|
118
|
+
for (const lesson of file.lessons) {
|
|
119
|
+
await ports.callAction('memory.save', {
|
|
120
|
+
topic: lesson.topic,
|
|
121
|
+
kind: 'lesson',
|
|
122
|
+
summary: lesson.summary,
|
|
123
|
+
details: lesson.details,
|
|
124
|
+
appliesWhen: lesson.appliesWhen,
|
|
125
|
+
source: { package: 'mama-backfill', source_type: 'backfill' },
|
|
126
|
+
eventDateTime: lesson.at,
|
|
127
|
+
links: evidence(lesson.sources),
|
|
128
|
+
}, `${prefix}lesson:${lesson.key}`);
|
|
129
|
+
result.lessons += 1;
|
|
130
|
+
}
|
|
131
|
+
for (const page of file.wiki) {
|
|
132
|
+
const operationId = `${prefix}wiki:${page.path}`;
|
|
133
|
+
if (ports.publishedPages.has(operationId)) {
|
|
134
|
+
result.pagesSkipped += 1;
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
const refs = (page.sources ?? []).map((id) => sources.get(id));
|
|
138
|
+
if ('append' in page) {
|
|
139
|
+
// Section appends keep the page's title, metadata and earlier evidence ids.
|
|
140
|
+
await ports.callAction('manage.wiki.update', {
|
|
141
|
+
path: page.path,
|
|
142
|
+
edits: page.append.map((edit) => ({ section: edit.section, append: edit.text })),
|
|
143
|
+
...(page.sources === undefined
|
|
144
|
+
? {}
|
|
145
|
+
: { sourceIds: refs.map((ref) => ref.observationRef) }),
|
|
146
|
+
}, operationId);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
await ports.callAction('manage.wiki.publish', {
|
|
150
|
+
pages: [
|
|
151
|
+
{
|
|
152
|
+
path: page.path,
|
|
153
|
+
title: page.title,
|
|
154
|
+
content: page.content,
|
|
155
|
+
// A new page only: one that already exists is refused, not overwritten.
|
|
156
|
+
expectedContentVersion: null,
|
|
157
|
+
...(page.sources === undefined
|
|
158
|
+
? {}
|
|
159
|
+
: {
|
|
160
|
+
sourceRefs: refs.map((ref) => ({
|
|
161
|
+
kind: 'raw',
|
|
162
|
+
connector: ref.connector,
|
|
163
|
+
id: ref.observationRef,
|
|
164
|
+
})),
|
|
165
|
+
}),
|
|
166
|
+
},
|
|
167
|
+
],
|
|
168
|
+
}, operationId);
|
|
169
|
+
}
|
|
170
|
+
ports.pagePublished(operationId);
|
|
171
|
+
result.pagesPublished += 1;
|
|
172
|
+
}
|
|
173
|
+
return result;
|
|
174
|
+
}
|
|
175
|
+
/** Resolve exact source ids through the connector index; every id must name one observation. */
|
|
176
|
+
function indexSourceResolver(adapter) {
|
|
177
|
+
return (sourceIds) => {
|
|
178
|
+
const found = new Map();
|
|
179
|
+
const problems = [];
|
|
180
|
+
for (let start = 0; start < sourceIds.length; start += 500) {
|
|
181
|
+
const batch = sourceIds.slice(start, start + 500);
|
|
182
|
+
const rows = adapter
|
|
183
|
+
.prepare(`SELECT source_id, source_connector, current_observation_id FROM connector_event_index
|
|
184
|
+
WHERE source_id IN (${batch.map(() => '?').join(', ')})`)
|
|
185
|
+
.all(...batch);
|
|
186
|
+
const bySource = new Map();
|
|
187
|
+
for (const row of rows)
|
|
188
|
+
bySource.set(row.source_id, [...(bySource.get(row.source_id) ?? []), row]);
|
|
189
|
+
for (const id of batch) {
|
|
190
|
+
const matches = bySource.get(id) ?? [];
|
|
191
|
+
if (matches.length !== 1 || !matches[0].current_observation_id)
|
|
192
|
+
problems.push(`${id} (${matches.length === 0 ? 'not imported' : `${matches.length} rows`})`);
|
|
193
|
+
else
|
|
194
|
+
found.set(id, {
|
|
195
|
+
observationRef: matches[0].current_observation_id,
|
|
196
|
+
connector: matches[0].source_connector,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (problems.length > 0)
|
|
201
|
+
throw new Error(`Backfill sources do not resolve; import them first:\n${problems.join('\n')}`);
|
|
202
|
+
return found;
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* The earliest event time of existing work at or after the period's end, read through the ledger.
|
|
207
|
+
* Revisions of the period itself (a re-run finds its own) fall before it; a later period's
|
|
208
|
+
* revisions count whether or not an earlier backfill bounded them.
|
|
209
|
+
*/
|
|
210
|
+
function ledgerFirstEventAt(readWork) {
|
|
211
|
+
return (commitmentId, after) => {
|
|
212
|
+
const history = readWork({ commitmentId, history: 'all' }).items[0]?.history ?? [];
|
|
213
|
+
const later = history
|
|
214
|
+
.map((revision) => revision.eventDatetime ?? revision.createdAt)
|
|
215
|
+
.filter((time) => time >= after);
|
|
216
|
+
if (later.length === 0)
|
|
217
|
+
throw new Error(`Existing work ${commitmentId} has no revision after the period`);
|
|
218
|
+
return Math.min(...later);
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=push.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/backfill/push.ts"],"names":[],"mappings":"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"}
|