@jungjaehoon/mama-os 0.61.2 → 0.62.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 +72 -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/work-actions.d.ts +1 -0
- package/dist/api/work-actions.d.ts.map +1 -1
- package/dist/api/work-actions.js +20 -11
- 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 +27 -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/package.json +2 -2
- package/public/viewer/log-viewer.html +7 -3
- package/public/viewer/operator/operator.css +1 -1
- package/public/viewer/operator/operator.js +5428 -5685
|
@@ -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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"}
|