@agentshouse/mdruntime 0.1.0-c8eac46931574 → 0.1.0-c8f07dbee1c62
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/README.md +1 -1
- package/dist/acceptance.d.ts +6 -0
- package/dist/acceptance.d.ts.map +1 -0
- package/dist/acceptance.js +389 -0
- package/dist/actions.d.ts +20 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +250 -0
- package/dist/adapter.d.ts +23 -25
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +3 -10
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +21 -56
- package/dist/bootstrap.d.ts +8 -4
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +209 -78
- package/dist/cell.d.ts +6 -0
- package/dist/cell.d.ts.map +1 -0
- package/dist/cell.js +9 -0
- package/dist/chain.d.ts +2 -1
- package/dist/chain.d.ts.map +1 -1
- package/dist/change.d.ts +1 -0
- package/dist/change.d.ts.map +1 -1
- package/dist/chat-types.d.ts +5 -0
- package/dist/chat-types.d.ts.map +1 -0
- package/dist/chat-types.js +13 -0
- package/dist/client.d.ts +17 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +3 -0
- package/dist/collection.d.ts +2 -1
- package/dist/collection.d.ts.map +1 -1
- package/dist/compile.d.ts +7 -7
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +229 -301
- package/dist/connection.d.ts +5 -141
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +98 -5279
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +7 -0
- package/dist/conversation-row.d.ts +33 -0
- package/dist/conversation-row.d.ts.map +1 -0
- package/dist/conversation-row.js +53 -0
- package/dist/conversation.d.ts +16 -6
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +364 -212
- package/dist/discovery.d.ts +10 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +175 -0
- package/dist/durability.d.ts +15 -0
- package/dist/durability.d.ts.map +1 -1
- package/dist/entry.d.ts +2 -2
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +17 -8
- package/dist/figures.d.ts +48 -0
- package/dist/figures.d.ts.map +1 -0
- package/dist/figures.js +197 -0
- package/dist/holdings.d.ts +29 -0
- package/dist/holdings.d.ts.map +1 -0
- package/dist/holdings.js +95 -0
- package/dist/host.d.ts +2 -2
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +13 -13
- package/dist/identity.d.ts +0 -1
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +0 -3
- package/dist/index.d.ts +19 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/install.d.ts +56 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +560 -0
- package/dist/job.d.ts +26 -1
- package/dist/job.d.ts.map +1 -1
- package/dist/job.js +41 -0
- package/dist/lifecycle.d.ts +7 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +267 -0
- package/dist/listing.d.ts +53 -0
- package/dist/listing.d.ts.map +1 -0
- package/dist/listing.js +175 -0
- package/dist/live.d.ts +4 -4
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +53 -15
- package/dist/locks.d.ts +9 -0
- package/dist/locks.d.ts.map +1 -0
- package/dist/locks.js +61 -0
- package/dist/log.d.ts +1 -0
- package/dist/log.d.ts.map +1 -1
- package/dist/lost.d.ts +5 -0
- package/dist/lost.d.ts.map +1 -0
- package/dist/lost.js +61 -0
- package/dist/memory.d.ts +4 -1
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +43 -4
- package/dist/messages.d.ts +25 -1
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +84 -5
- package/dist/model.d.ts +2 -9
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +0 -9
- package/dist/models.d.ts +14 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +193 -0
- package/dist/opening.d.ts +4 -0
- package/dist/opening.d.ts.map +1 -0
- package/dist/opening.js +56 -0
- package/dist/outcome.d.ts +4 -1
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +3 -0
- package/dist/overlay.d.ts +1 -0
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +11 -0
- package/dist/parts.d.ts +59 -0
- package/dist/parts.d.ts.map +1 -0
- package/dist/parts.js +118 -0
- package/dist/preparation.d.ts +20 -0
- package/dist/preparation.d.ts.map +1 -0
- package/dist/preparation.js +226 -0
- package/dist/queries.d.ts +16 -0
- package/dist/queries.d.ts.map +1 -0
- package/dist/queries.js +272 -0
- package/dist/query.d.ts +13 -212
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +3 -524
- package/dist/questions.d.ts +34 -0
- package/dist/questions.d.ts.map +1 -0
- package/dist/questions.js +122 -0
- package/dist/reach.d.ts +9 -8
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +160 -107
- package/dist/react.d.ts +9 -2
- package/dist/react.d.ts.map +1 -1
- package/dist/read.d.ts +7 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/read.js +17 -0
- package/dist/reads.d.ts +36 -0
- package/dist/reads.d.ts.map +1 -0
- package/dist/reads.js +150 -0
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +9 -1
- package/dist/refresh.d.ts +1 -1
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +8 -20
- package/dist/refusal.d.ts +5 -0
- package/dist/refusal.d.ts.map +1 -0
- package/dist/refusal.js +56 -0
- package/dist/replica.d.ts +8 -8
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +52 -19
- package/dist/room-draft.d.ts +2 -2
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-drafts.d.ts +24 -0
- package/dist/room-drafts.d.ts.map +1 -0
- package/dist/room-drafts.js +216 -0
- package/dist/rows.d.ts +14 -22
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +48 -189
- package/dist/runtime.d.ts +42 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1 -0
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +13 -10
- package/dist/saves.d.ts +70 -0
- package/dist/saves.d.ts.map +1 -0
- package/dist/saves.js +1004 -0
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +1 -1
- package/dist/seed.d.ts +11 -2
- package/dist/seed.d.ts.map +1 -1
- package/dist/seed.js +71 -0
- package/dist/shared.d.ts +1 -1
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +9 -5
- package/dist/shown.d.ts +31 -0
- package/dist/shown.d.ts.map +1 -0
- package/dist/shown.js +294 -0
- package/dist/socket/admission.d.ts +7 -0
- package/dist/socket/admission.d.ts.map +1 -0
- package/dist/socket/admission.js +39 -0
- package/dist/socket/answers.d.ts +6 -0
- package/dist/socket/answers.d.ts.map +1 -0
- package/dist/socket/answers.js +20 -0
- package/dist/socket/lanes.d.ts +20 -0
- package/dist/socket/lanes.d.ts.map +1 -0
- package/dist/socket/lanes.js +77 -0
- package/dist/socket/reads.d.ts +10 -0
- package/dist/socket/reads.d.ts.map +1 -0
- package/dist/socket/reads.js +31 -0
- package/dist/socket/rooms.d.ts +43 -0
- package/dist/socket/rooms.d.ts.map +1 -0
- package/dist/socket/rooms.js +90 -0
- package/dist/socket/session.d.ts +39 -0
- package/dist/socket/session.d.ts.map +1 -0
- package/dist/socket/session.js +23 -0
- package/dist/socket.d.ts +70 -0
- package/dist/socket.d.ts.map +1 -0
- package/dist/socket.js +175 -0
- package/dist/source.d.ts +61 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +81 -0
- package/dist/status.d.ts +0 -2
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +0 -6
- package/dist/store/fences.d.ts +16 -0
- package/dist/store/fences.d.ts.map +1 -0
- package/dist/store/fences.js +26 -0
- package/dist/store/installs.d.ts +30 -0
- package/dist/store/installs.d.ts.map +1 -0
- package/dist/store/installs.js +34 -0
- package/dist/store/readiness.d.ts +10 -0
- package/dist/store/readiness.d.ts.map +1 -0
- package/dist/store/readiness.js +52 -0
- package/dist/store/records.d.ts +212 -0
- package/dist/store/records.d.ts.map +1 -0
- package/dist/store/records.js +408 -0
- package/dist/store/room-held.d.ts +8 -0
- package/dist/store/room-held.d.ts.map +1 -0
- package/dist/store/room-held.js +17 -0
- package/dist/store/space.d.ts +11 -0
- package/dist/store/space.d.ts.map +1 -0
- package/dist/store/space.js +43 -0
- package/dist/store/watchers.d.ts +17 -0
- package/dist/store/watchers.d.ts.map +1 -0
- package/dist/store/watchers.js +57 -0
- package/dist/store/writes.d.ts +24 -0
- package/dist/store/writes.d.ts.map +1 -0
- package/dist/store/writes.js +125 -0
- package/dist/store.d.ts +107 -153
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +143 -396
- package/dist/stored.d.ts +58 -64
- package/dist/stored.d.ts.map +1 -1
- package/dist/stored.js +244 -156
- package/dist/surface.d.ts +88 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +222 -0
- package/dist/sync.d.ts +20 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +531 -0
- package/dist/tables.d.ts +111 -49
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +209 -54
- package/dist/tallies.d.ts +18 -0
- package/dist/tallies.d.ts.map +1 -0
- package/dist/tallies.js +129 -0
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +7 -4
- package/dist/windows.d.ts +1 -12
- package/dist/windows.d.ts.map +1 -1
- package/dist/windows.js +2 -75
- package/dist/wire.d.ts +16 -1
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +6 -0
- package/package.json +2 -2
- package/dist/fence.d.ts +0 -6
- package/dist/fence.d.ts.map +0 -1
- package/dist/fence.js +0 -10
- package/dist/phrase.d.ts +0 -3
- package/dist/phrase.d.ts.map +0 -1
- package/dist/phrase.js +0 -8
package/dist/reads.js
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { refusedForSpace } from './durability.js';
|
|
2
|
+
import { answeredResult, UNCERTAIN } from './outcome.js';
|
|
3
|
+
export const READ_TABLES = [
|
|
4
|
+
'CREATE TABLE read_answers (name TEXT NOT NULL, input TEXT NOT NULL, build TEXT NOT NULL, answer TEXT NOT NULL, PRIMARY KEY (name, input)) WITHOUT ROWID',
|
|
5
|
+
];
|
|
6
|
+
export function storedRead(connection, { name, input, build }) {
|
|
7
|
+
const [held] = connection.rows('SELECT answer FROM read_answers WHERE name = ? AND input = ? AND build = ?', [name, input, build]);
|
|
8
|
+
return held === undefined ? null : String(held.answer);
|
|
9
|
+
}
|
|
10
|
+
export function keptRead(connection, { name, input, build }, answer) {
|
|
11
|
+
connection.run('INSERT OR REPLACE INTO read_answers (name, input, build, answer) VALUES (?, ?, ?, ?)', [name, input, build, answer]);
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
export function readsOfOtherBuildsForgotten(connection, build) {
|
|
15
|
+
connection.run('DELETE FROM read_answers WHERE build <> ?', [build]);
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
function answered(result) {
|
|
19
|
+
return result.kind === 'action' && answeredResult(result.result);
|
|
20
|
+
}
|
|
21
|
+
export function readAnswers(options) {
|
|
22
|
+
const { database, build, recovery } = options;
|
|
23
|
+
const unkept = new Set(options.unkept);
|
|
24
|
+
const leading = new Set(options.leading);
|
|
25
|
+
const reads = new Map();
|
|
26
|
+
function leads(read) {
|
|
27
|
+
return leading.has(read.at.name);
|
|
28
|
+
}
|
|
29
|
+
function show(read, shown) {
|
|
30
|
+
read.shown = shown;
|
|
31
|
+
for (const deliver of read.observers)
|
|
32
|
+
deliver(shown);
|
|
33
|
+
}
|
|
34
|
+
async function kept(read, answer) {
|
|
35
|
+
if (!read.shown.kept || options.full())
|
|
36
|
+
return;
|
|
37
|
+
await database.ask({ kind: 'read.keep', ...read.at, answer }).catch((error) => {
|
|
38
|
+
if (refusedForSpace(error))
|
|
39
|
+
options.filled();
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
async function asked(read, led) {
|
|
43
|
+
if (!options.online()) {
|
|
44
|
+
read.owed = true;
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const result = await options.call(read.at.name, read.asked).catch(() => UNCERTAIN);
|
|
48
|
+
if (options.closed())
|
|
49
|
+
return;
|
|
50
|
+
read.owed = !answered(result);
|
|
51
|
+
if (read.owed) {
|
|
52
|
+
show(read, { ...read.shown, failure: result });
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const answer = result.result;
|
|
56
|
+
const text = JSON.stringify(answer);
|
|
57
|
+
if (text === read.text && read.shown.failure === null)
|
|
58
|
+
return;
|
|
59
|
+
read.text = text;
|
|
60
|
+
await kept(read, text);
|
|
61
|
+
await led;
|
|
62
|
+
if (!options.closed())
|
|
63
|
+
show(read, { ...read.shown, answer, failure: null });
|
|
64
|
+
}
|
|
65
|
+
function forgotten(read) {
|
|
66
|
+
read.text = null;
|
|
67
|
+
read.shown = { ...read.shown, answer: null, failure: null };
|
|
68
|
+
}
|
|
69
|
+
function ask(read, led) {
|
|
70
|
+
read.asking = true;
|
|
71
|
+
return recovery
|
|
72
|
+
.attempt(read.key, async () => {
|
|
73
|
+
await asked(read, led);
|
|
74
|
+
return 'done';
|
|
75
|
+
})
|
|
76
|
+
.finally(() => {
|
|
77
|
+
const unanswered = read.joined && read.owed;
|
|
78
|
+
read.asking = false;
|
|
79
|
+
read.joined = false;
|
|
80
|
+
if (unanswered)
|
|
81
|
+
void ask(read);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
function opened(name, input, key) {
|
|
85
|
+
const held = !unkept.has(name);
|
|
86
|
+
const read = {
|
|
87
|
+
key,
|
|
88
|
+
at: { name, input: JSON.stringify(input ?? null), build },
|
|
89
|
+
asked: input,
|
|
90
|
+
observers: new Set(),
|
|
91
|
+
stored: Promise.resolve(),
|
|
92
|
+
text: null,
|
|
93
|
+
shown: { answer: null, failure: null, kept: held },
|
|
94
|
+
owed: false,
|
|
95
|
+
asking: false,
|
|
96
|
+
joined: false,
|
|
97
|
+
};
|
|
98
|
+
if (held) {
|
|
99
|
+
read.stored = database.ask({ kind: 'read.stored', ...read.at }).then((text) => {
|
|
100
|
+
if (text === null || read.text !== null)
|
|
101
|
+
return;
|
|
102
|
+
read.text = text;
|
|
103
|
+
read.shown = { ...read.shown, answer: JSON.parse(text) };
|
|
104
|
+
}, () => { });
|
|
105
|
+
}
|
|
106
|
+
reads.set(key, read);
|
|
107
|
+
return read;
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
watch(name, input, deliver) {
|
|
111
|
+
const key = JSON.stringify([name, input ?? null]);
|
|
112
|
+
const read = reads.get(key) ?? opened(name, input, key);
|
|
113
|
+
read.observers.add(deliver);
|
|
114
|
+
void read.stored.then(() => {
|
|
115
|
+
if (!read.observers.has(deliver))
|
|
116
|
+
return;
|
|
117
|
+
if (!read.shown.kept)
|
|
118
|
+
forgotten(read);
|
|
119
|
+
deliver(read.shown);
|
|
120
|
+
if (read.asking)
|
|
121
|
+
read.joined = true;
|
|
122
|
+
else
|
|
123
|
+
void ask(read);
|
|
124
|
+
});
|
|
125
|
+
return () => {
|
|
126
|
+
read.observers.delete(deliver);
|
|
127
|
+
if (read.observers.size === 0 && reads.get(key) === read)
|
|
128
|
+
reads.delete(key);
|
|
129
|
+
};
|
|
130
|
+
},
|
|
131
|
+
again() {
|
|
132
|
+
const all = [...reads.values()];
|
|
133
|
+
const led = Promise.all(all.filter(leads).map((read) => ask(read)));
|
|
134
|
+
for (const read of all)
|
|
135
|
+
if (!leads(read))
|
|
136
|
+
void ask(read, led);
|
|
137
|
+
},
|
|
138
|
+
reopened() {
|
|
139
|
+
for (const read of reads.values()) {
|
|
140
|
+
if (read.text === null) {
|
|
141
|
+
if (read.owed)
|
|
142
|
+
void ask(read);
|
|
143
|
+
}
|
|
144
|
+
else if (read.shown.failure?.kind === 'transport-uncertainty') {
|
|
145
|
+
show(read, { ...read.shown, failure: null });
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
}
|
package/dist/recovery.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../src/recovery.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;AAElE,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEhF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClF,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,MAAM,IAAI,IAAI,CAAC;IACf,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IACnC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB,CAAC;AAsBF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAW,EAAE,KAAK,SAAS,GAAG,MAAM,CAGpF;AAED,wBAAsB,aAAa,CAAC,CAAC,EACnC,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACrB,MAAM,EAAE,WAAW,EACnB,QAAQ,GAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAoB,GAC5C,OAAO,CAAC,CAAC,CAAC,CAsBZ;
|
|
1
|
+
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../src/recovery.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;AAElE,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEhF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClF,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,MAAM,IAAI,IAAI,CAAC;IACf,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IACnC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB,CAAC;AAsBF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAW,EAAE,KAAK,SAAS,GAAG,MAAM,CAGpF;AAED,wBAAsB,aAAa,CAAC,CAAC,EACnC,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACrB,MAAM,EAAE,WAAW,EACnB,QAAQ,GAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAoB,GAC5C,OAAO,CAAC,CAAC,CAAC,CAsBZ;AA8KD,wBAAgB,cAAc,CAAC,OAAO,GAAE,eAAoB,GAAG,QAAQ,CAStE"}
|
package/dist/recovery.js
CHANGED
|
@@ -106,7 +106,15 @@ function owner(backoff, inFlight, release = () => { }) {
|
|
|
106
106
|
}
|
|
107
107
|
intent.tries += 1;
|
|
108
108
|
if (intent.tries >= backoff.attempts) {
|
|
109
|
-
|
|
109
|
+
if (again === null) {
|
|
110
|
+
finish(key, intent, false);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
intent.tries = 0;
|
|
114
|
+
if (again === 'now')
|
|
115
|
+
launch(key, intent);
|
|
116
|
+
else
|
|
117
|
+
wait(key, intent, again, true);
|
|
110
118
|
return;
|
|
111
119
|
}
|
|
112
120
|
if (result === 'again') {
|
package/dist/refresh.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export type Refreshing = {
|
|
|
20
20
|
later(paths: readonly string[], roomVersion: string): Promise<ReadonlySet<string>>;
|
|
21
21
|
stage(page: RefreshedPage): Promise<boolean>;
|
|
22
22
|
};
|
|
23
|
-
type PageContent = Pick<RefreshPage, 'documents' | '
|
|
23
|
+
type PageContent = Pick<RefreshPage, 'documents' | 'facts' | 'revisions' | 'fileIds' | 'created' | 'changes' | 'binaryFiles'>;
|
|
24
24
|
export declare function pageEntries(page: PageContent, removals: readonly string[], roomVersion: string, prior: (paths: readonly string[]) => Promise<ReadonlyMap<string, HeldEntry>>): Promise<StoredEntry[]>;
|
|
25
25
|
export declare function advancement(refresh: Refresher, authorization: Authorization, held: ReplicaRecord, remodel: Remodel, continuing: () => boolean, staging: Refreshing): Promise<Advancement>;
|
|
26
26
|
export {};
|
package/dist/refresh.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,WAAW,EACX,cAAc,EACd,aAAa,EACb,gBAAgB,EACjB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAG9D,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B,gBAAgB,GAChB,WAAW,GACX,cAAc,CAAC;AAEnB,MAAM,MAAM,SAAS,GAAG,CACtB,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,cAAc,KACpB,OAAO,CAAC,aAAa,CAAC,CAAC;AAE5B,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,IAAI,IAAI,CAAC;IACb,KAAK,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACzE,KAAK,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IACnF,KAAK,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9C,CAAC;
|
|
1
|
+
{"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,WAAW,EACX,cAAc,EACd,aAAa,EACb,gBAAgB,EACjB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAG9D,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B,gBAAgB,GAChB,WAAW,GACX,cAAc,CAAC;AAEnB,MAAM,MAAM,SAAS,GAAG,CACtB,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,cAAc,KACpB,OAAO,CAAC,aAAa,CAAC,CAAC;AAE5B,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,IAAI,IAAI,CAAC;IACb,KAAK,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACzE,KAAK,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IACnF,KAAK,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9C,CAAC;AASF,KAAK,WAAW,GAAG,IAAI,CACrB,WAAW,EACX,WAAW,GAAG,OAAO,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,CACxF,CAAC;AAwFF,wBAAsB,WAAW,CAC/B,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,GAC3E,OAAO,CAAC,WAAW,EAAE,CAAC,CAKxB;AAgDD,wBAAsB,WAAW,CAC/B,OAAO,EAAE,SAAS,EAClB,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,OAAO,EACzB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,WAAW,CAAC,CA8CtB"}
|
package/dist/refresh.js
CHANGED
|
@@ -7,13 +7,11 @@ function* listing(page, removals) {
|
|
|
7
7
|
yield ROW_WEIGHT;
|
|
8
8
|
}
|
|
9
9
|
const documents = [];
|
|
10
|
-
const outlined = [];
|
|
11
10
|
const binaries = [];
|
|
12
11
|
const asked = [];
|
|
13
12
|
const written = new Set();
|
|
14
13
|
for (const [kept, named] of [
|
|
15
14
|
[documents, page.documents],
|
|
16
|
-
[outlined, page.outlines ?? {}],
|
|
17
15
|
[binaries, page.binaryFiles],
|
|
18
16
|
]) {
|
|
19
17
|
for (const path of Object.keys(named)) {
|
|
@@ -38,7 +36,7 @@ function* listing(page, removals) {
|
|
|
38
36
|
others.push(path);
|
|
39
37
|
}
|
|
40
38
|
}
|
|
41
|
-
return { documents,
|
|
39
|
+
return { documents, binaries, others, asked: [...asked, ...others] };
|
|
42
40
|
}
|
|
43
41
|
function* entering(page, roomVersion, listed, prior) {
|
|
44
42
|
const entries = [];
|
|
@@ -47,23 +45,11 @@ function* entering(page, roomVersion, listed, prior) {
|
|
|
47
45
|
entries.push({
|
|
48
46
|
path,
|
|
49
47
|
content: page.documents[path],
|
|
50
|
-
|
|
51
|
-
binary: null,
|
|
52
|
-
revision: page.revisions[path] ?? prior.get(path)?.revision ?? null,
|
|
53
|
-
fileId: page.fileIds?.[path] ?? null,
|
|
54
|
-
change: page.changes[path] ?? null,
|
|
55
|
-
written: roomVersion,
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
for (const path of listed.outlined) {
|
|
59
|
-
yield ROW_WEIGHT;
|
|
60
|
-
entries.push({
|
|
61
|
-
path,
|
|
62
|
-
content: null,
|
|
63
|
-
outline: page.outlines[path],
|
|
48
|
+
facts: page.facts[path] ?? null,
|
|
64
49
|
binary: null,
|
|
65
50
|
revision: page.revisions[path] ?? prior.get(path)?.revision ?? null,
|
|
66
51
|
fileId: page.fileIds?.[path] ?? null,
|
|
52
|
+
created: page.created?.[path] ?? null,
|
|
67
53
|
change: page.changes[path] ?? null,
|
|
68
54
|
written: roomVersion,
|
|
69
55
|
});
|
|
@@ -73,10 +59,11 @@ function* entering(page, roomVersion, listed, prior) {
|
|
|
73
59
|
entries.push({
|
|
74
60
|
path,
|
|
75
61
|
content: null,
|
|
76
|
-
|
|
62
|
+
facts: null,
|
|
77
63
|
binary: { state: 'accepted', ...page.binaryFiles[path] },
|
|
78
64
|
revision: page.revisions[path] ?? prior.get(path)?.revision ?? null,
|
|
79
65
|
fileId: page.fileIds?.[path] ?? null,
|
|
66
|
+
created: page.created?.[path] ?? null,
|
|
80
67
|
change: page.changes[path] ?? null,
|
|
81
68
|
written: null,
|
|
82
69
|
});
|
|
@@ -91,6 +78,7 @@ function* entering(page, roomVersion, listed, prior) {
|
|
|
91
78
|
...kept,
|
|
92
79
|
revision: page.revisions[path] ?? held.revision,
|
|
93
80
|
fileId: page.fileIds?.[path] ?? held.fileId,
|
|
81
|
+
created: page.created?.[path] ?? held.created,
|
|
94
82
|
change: page.changes[path] ?? held.change,
|
|
95
83
|
});
|
|
96
84
|
}
|
|
@@ -111,9 +99,10 @@ function unwritten(page, kept) {
|
|
|
111
99
|
return {
|
|
112
100
|
...page,
|
|
113
101
|
documents: without(page.documents, kept),
|
|
114
|
-
|
|
102
|
+
facts: without(page.facts, kept),
|
|
115
103
|
revisions: without(page.revisions, kept),
|
|
116
104
|
...(page.fileIds === undefined ? {} : { fileIds: without(page.fileIds, kept) }),
|
|
105
|
+
...(page.created === undefined ? {} : { created: without(page.created, kept) }),
|
|
117
106
|
changes: without(page.changes, kept),
|
|
118
107
|
binaryFiles: without(page.binaryFiles, kept),
|
|
119
108
|
removals: page.removals.filter((path) => !kept.has(path)),
|
|
@@ -122,7 +111,6 @@ function unwritten(page, kept) {
|
|
|
122
111
|
async function pageOf(answered, roomVersion, staging) {
|
|
123
112
|
const page = unwritten(answered, await staging.later([
|
|
124
113
|
...Object.keys(answered.documents),
|
|
125
|
-
...Object.keys(answered.outlines ?? {}),
|
|
126
114
|
...Object.keys(answered.binaryFiles),
|
|
127
115
|
...answered.removals,
|
|
128
116
|
], roomVersion));
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ProviderRefusal } from './adapter.js';
|
|
2
|
+
import type { Runtime } from './runtime.js';
|
|
3
|
+
import type { RefusalReason } from './socket.js';
|
|
4
|
+
export declare function refuse(runtime: Runtime, reason: RefusalReason, provider?: ProviderRefusal | null): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=refusal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refusal.d.ts","sourceRoot":"","sources":["../src/refusal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAOpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,wBAAsB,MAAM,CAC1B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,aAAa,EACrB,QAAQ,GAAE,eAAe,GAAG,IAAW,iBAmDxC"}
|
package/dist/refusal.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { changeSet, mergeChangeSets } from './change-set.js';
|
|
2
|
+
import { composedOf } from './collection.js';
|
|
3
|
+
import { listedLocators } from './listing.js';
|
|
4
|
+
import { prepare } from './preparation.js';
|
|
5
|
+
import { storedRecord } from './replica.js';
|
|
6
|
+
import { emitRefusal } from './shown.js';
|
|
7
|
+
export async function refuse(runtime, reason, provider = null) {
|
|
8
|
+
const { store, socket, journal } = runtime;
|
|
9
|
+
socket.session.set({ paused: true });
|
|
10
|
+
socket.abortReads();
|
|
11
|
+
try {
|
|
12
|
+
if (reason === 'revoked-authorization') {
|
|
13
|
+
await store.exclusive(async () => {
|
|
14
|
+
const revoked = { status: 'unavailable', reason: 'revoked' };
|
|
15
|
+
let held = new Map();
|
|
16
|
+
try {
|
|
17
|
+
const local = await store.open();
|
|
18
|
+
held = await store.rooms();
|
|
19
|
+
await local.commit({
|
|
20
|
+
rooms: [...held.values()].map(({ record: kept }) => {
|
|
21
|
+
const record = { ...kept, model: revoked };
|
|
22
|
+
return {
|
|
23
|
+
locator: record.locator,
|
|
24
|
+
key: record.key,
|
|
25
|
+
record: storedRecord(record),
|
|
26
|
+
composed: composedOf(store.composed(record)),
|
|
27
|
+
};
|
|
28
|
+
}),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
journal.record('model revocation persistence failed');
|
|
33
|
+
}
|
|
34
|
+
const listedNow = listedLocators(runtime, held);
|
|
35
|
+
for (const locator of listedNow) {
|
|
36
|
+
if (!held.has(locator))
|
|
37
|
+
socket.rooms.stand(locator, { unheldModel: revoked });
|
|
38
|
+
}
|
|
39
|
+
store.changed(mergeChangeSets(listedNow.map((locator) => changeSet(locator, { documents: null, room: true }))));
|
|
40
|
+
prepare(runtime);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
socket.session.set({
|
|
46
|
+
refusal: {
|
|
47
|
+
code: reason,
|
|
48
|
+
retryable: false,
|
|
49
|
+
reauthorizationOffered: reason === 'revoked-authorization',
|
|
50
|
+
refusal: provider,
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
journal.record(`connection refused ${reason}`);
|
|
54
|
+
emitRefusal(runtime);
|
|
55
|
+
}
|
|
56
|
+
}
|
package/dist/replica.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { type TypedPath } from '@agentshouse/mdmodel';
|
|
2
|
+
import type { BootstrapInventory, SavedFacts, MutationResult, OperationScopes, ReplicaAdmission, TypedSelection } from './adapter.js';
|
|
2
3
|
import { type ChangeBatch, type Precondition } from './change.js';
|
|
3
4
|
import { type Collection, type Composition } from './collection.js';
|
|
4
5
|
import { type ModelState } from './model.js';
|
|
@@ -22,23 +23,22 @@ export type HeldReplica = {
|
|
|
22
23
|
readonly record: ReplicaRecord;
|
|
23
24
|
readonly queue: readonly ChangeBatch[];
|
|
24
25
|
readonly overlaid: ReadonlySet<string>;
|
|
25
|
-
readonly count: number;
|
|
26
|
-
readonly confirmed: number;
|
|
27
|
-
readonly indexed: boolean;
|
|
28
26
|
};
|
|
29
27
|
export type VisibleLayer = Layer & {
|
|
30
28
|
readonly collection: Collection;
|
|
31
29
|
};
|
|
32
30
|
export type Slice = Layer & {
|
|
33
31
|
readonly written: Readonly<Record<string, string>>;
|
|
32
|
+
readonly facts: Readonly<Record<string, SavedFacts>>;
|
|
34
33
|
readonly held: ReadonlySet<string>;
|
|
35
34
|
};
|
|
36
|
-
export declare function compositionOf(record: Pick<ReplicaRecord, 'model' | 'typedSelection'>, builtIn: ModelState): Composition;
|
|
35
|
+
export declare function compositionOf(record: Pick<ReplicaRecord, 'model' | 'typedSelection'>, builtIn: ModelState, typedPaths: readonly TypedPath[]): Composition;
|
|
37
36
|
export declare function storedRecord(record: ReplicaRecord): string;
|
|
38
37
|
export declare function slicing(entries: readonly HeldEntry[], paths: Iterable<string>): Generator<number, Slice, void>;
|
|
38
|
+
export type LayerEntry = Omit<StoredEntry, 'facts'>;
|
|
39
39
|
export declare function entryAt(layer: Layer & {
|
|
40
40
|
readonly written?: Readonly<Record<string, string>>;
|
|
41
|
-
}, path: string):
|
|
41
|
+
}, path: string): LayerEntry | null;
|
|
42
42
|
export declare function slicingWith(slice: Slice, set: readonly StoredEntry[], removed: readonly string[]): Generator<number, Slice, void>;
|
|
43
43
|
export declare function touchedBy(queue: readonly ChangeBatch[]): Set<string>;
|
|
44
44
|
export declare function movedBy(queue: readonly ChangeBatch[], locator: string): Set<string>;
|
|
@@ -47,7 +47,7 @@ export type Replayed = {
|
|
|
47
47
|
readonly touched: ReadonlySet<string>;
|
|
48
48
|
};
|
|
49
49
|
export declare function replaying(confirmed: Slice, queue: readonly ChangeBatch[], locator: string, composition: Composition): Generator<number, Replayed, void>;
|
|
50
|
-
export declare function overlayOf(visible:
|
|
50
|
+
export declare function overlayOf(visible: VisibleLayer, touched: Iterable<string>): Generator<number, OverlayEntry[], void>;
|
|
51
51
|
export declare function holds(layer: Layer, preconditions: readonly Precondition[]): boolean;
|
|
52
52
|
export declare function landed(batch: ChangeBatch, confirmed: Layer, current?: Readonly<Record<string, string>>): boolean;
|
|
53
53
|
export type Standing = {
|
|
@@ -63,6 +63,6 @@ export type Returned = {
|
|
|
63
63
|
readonly removed: readonly string[];
|
|
64
64
|
};
|
|
65
65
|
export declare function returnedPaths(submitted: ChangeBatch, accepted: Accepted): Set<string>;
|
|
66
|
-
export declare function returning(confirmed: Slice, submitted: ChangeBatch, accepted: Accepted, writtenAt: string): Generator<number, Returned, void>;
|
|
66
|
+
export declare function returning(confirmed: Slice, submitted: ChangeBatch, accepted: Accepted, writtenAt: string, composition: Composition): Generator<number, Returned, void>;
|
|
67
67
|
export {};
|
|
68
68
|
//# sourceMappingURL=replica.d.ts.map
|
package/dist/replica.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replica.d.ts","sourceRoot":"","sources":["../src/replica.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"replica.d.ts","sourceRoot":"","sources":["../src/replica.ts"],"names":[],"mappings":"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"}
|
package/dist/replica.js
CHANGED
|
@@ -3,14 +3,17 @@ import { immutable, landing } from './change.js';
|
|
|
3
3
|
import { collectionOf } from './collection.js';
|
|
4
4
|
import { storedModel } from './model.js';
|
|
5
5
|
import { acceptedBinaries, overlaying } from './overlay.js';
|
|
6
|
+
import { writtenFacts } from './rows.js';
|
|
6
7
|
import { effectiveIn, rewriting } from './save.js';
|
|
8
|
+
import { guarding } from './shared.js';
|
|
7
9
|
import { ROW_WEIGHT } from './turn.js';
|
|
8
|
-
export function compositionOf(record, builtIn) {
|
|
10
|
+
export function compositionOf(record, builtIn, typedPaths) {
|
|
9
11
|
return {
|
|
10
12
|
model: record.model,
|
|
11
13
|
selection: record.typedSelection === null
|
|
12
14
|
? null
|
|
13
15
|
: { roots: record.typedSelection.roots, model: builtIn },
|
|
16
|
+
typedPaths,
|
|
14
17
|
};
|
|
15
18
|
}
|
|
16
19
|
export function storedRecord(record) {
|
|
@@ -35,7 +38,7 @@ function strict(values, held) {
|
|
|
35
38
|
throw new UnreadPath(property);
|
|
36
39
|
}
|
|
37
40
|
};
|
|
38
|
-
return
|
|
41
|
+
return guarding(values, {
|
|
39
42
|
get(target, property, receiver) {
|
|
40
43
|
guard(property);
|
|
41
44
|
return Reflect.get(target, property, receiver);
|
|
@@ -58,9 +61,13 @@ export function* slicing(entries, paths) {
|
|
|
58
61
|
const binaries = {};
|
|
59
62
|
const revisions = {};
|
|
60
63
|
const fileIds = {};
|
|
64
|
+
const created = {};
|
|
61
65
|
const changes = {};
|
|
62
66
|
const written = {};
|
|
67
|
+
const facts = {};
|
|
63
68
|
for (const entry of entries) {
|
|
69
|
+
if (entry.facts !== null)
|
|
70
|
+
facts[entry.path] = entry.facts;
|
|
64
71
|
if (entry.binary !== null)
|
|
65
72
|
binaries[entry.path] = entry.binary;
|
|
66
73
|
else if (entry.content !== null)
|
|
@@ -69,6 +76,8 @@ export function* slicing(entries, paths) {
|
|
|
69
76
|
revisions[entry.path] = entry.revision;
|
|
70
77
|
if (entry.fileId !== null)
|
|
71
78
|
fileIds[entry.path] = entry.fileId;
|
|
79
|
+
if (entry.created !== null)
|
|
80
|
+
created[entry.path] = entry.created;
|
|
72
81
|
if (entry.change !== null)
|
|
73
82
|
changes[entry.path] = entry.change;
|
|
74
83
|
if (entry.written !== null)
|
|
@@ -80,8 +89,10 @@ export function* slicing(entries, paths) {
|
|
|
80
89
|
binaries: strict(binaries, held),
|
|
81
90
|
revisions: strict(revisions, held),
|
|
82
91
|
fileIds: strict(fileIds, held),
|
|
92
|
+
created: strict(created, held),
|
|
83
93
|
changes: strict(changes, held),
|
|
84
94
|
written: strict(written, held),
|
|
95
|
+
facts: strict(facts, held),
|
|
85
96
|
held,
|
|
86
97
|
};
|
|
87
98
|
}
|
|
@@ -93,10 +104,10 @@ export function entryAt(layer, path) {
|
|
|
93
104
|
return {
|
|
94
105
|
path,
|
|
95
106
|
content: content ?? null,
|
|
96
|
-
outline: null,
|
|
97
107
|
binary: binary ?? null,
|
|
98
108
|
revision: layer.revisions[path] ?? null,
|
|
99
109
|
fileId: layer.fileIds[path] ?? null,
|
|
110
|
+
created: layer.created[path] ?? null,
|
|
100
111
|
change: layer.changes[path] ?? null,
|
|
101
112
|
written: layer.written?.[path] ?? null,
|
|
102
113
|
};
|
|
@@ -105,8 +116,9 @@ export function* slicingWith(slice, set, removed) {
|
|
|
105
116
|
const entries = new Map();
|
|
106
117
|
for (const path of slice.held) {
|
|
107
118
|
const entry = entryAt(slice, path);
|
|
108
|
-
if (entry !== null)
|
|
109
|
-
entries.set(path, { ...entry, type: null });
|
|
119
|
+
if (entry !== null) {
|
|
120
|
+
entries.set(path, { ...entry, type: null, facts: slice.facts[path] ?? null });
|
|
121
|
+
}
|
|
110
122
|
yield ROW_WEIGHT;
|
|
111
123
|
}
|
|
112
124
|
for (const path of removed)
|
|
@@ -170,21 +182,28 @@ export function* replaying(confirmed, queue, locator, composition) {
|
|
|
170
182
|
export function* overlayOf(visible, touched) {
|
|
171
183
|
const rows = [];
|
|
172
184
|
for (const path of touched) {
|
|
173
|
-
yield ROW_WEIGHT;
|
|
174
185
|
const entry = entryAt(visible, path);
|
|
186
|
+
yield ROW_WEIGHT + (entry?.content?.length ?? 0);
|
|
187
|
+
const text = entry?.binary === null ? entry.content : null;
|
|
175
188
|
rows.push(entry === null
|
|
176
189
|
? {
|
|
177
190
|
path,
|
|
178
191
|
present: false,
|
|
179
192
|
content: null,
|
|
180
|
-
outline: null,
|
|
181
193
|
binary: null,
|
|
182
194
|
revision: null,
|
|
183
195
|
fileId: null,
|
|
196
|
+
created: null,
|
|
184
197
|
change: null,
|
|
185
198
|
written: null,
|
|
199
|
+
facts: null,
|
|
186
200
|
}
|
|
187
|
-
: {
|
|
201
|
+
: {
|
|
202
|
+
...entry,
|
|
203
|
+
written: null,
|
|
204
|
+
present: true,
|
|
205
|
+
facts: text === null ? null : writtenFacts(path, text, visible.collection.composition),
|
|
206
|
+
});
|
|
188
207
|
}
|
|
189
208
|
return rows;
|
|
190
209
|
}
|
|
@@ -349,17 +368,20 @@ export function returnedPaths(submitted, accepted) {
|
|
|
349
368
|
}
|
|
350
369
|
return paths;
|
|
351
370
|
}
|
|
352
|
-
export function* returning(confirmed, submitted, accepted, writtenAt) {
|
|
371
|
+
export function* returning(confirmed, submitted, accepted, writtenAt, composition) {
|
|
353
372
|
const documents = new Map();
|
|
354
373
|
const binaries = new Map();
|
|
355
374
|
const revisions = new Map();
|
|
356
375
|
const fileIds = new Map();
|
|
376
|
+
const created = new Map();
|
|
357
377
|
const changes = new Map();
|
|
358
378
|
const written = new Map();
|
|
379
|
+
const facts = new Map();
|
|
359
380
|
const read = (changed, held, path) => (changed.has(path) ? changed.get(path) : held[path]);
|
|
360
381
|
for (const [path, content] of Object.entries(accepted.documents)) {
|
|
361
|
-
yield ROW_WEIGHT;
|
|
382
|
+
yield ROW_WEIGHT + content.length;
|
|
362
383
|
documents.set(path, content);
|
|
384
|
+
facts.set(path, writtenFacts(path, content, composition));
|
|
363
385
|
fileIds.set(path, undefined);
|
|
364
386
|
written.set(path, writtenAt);
|
|
365
387
|
}
|
|
@@ -382,49 +404,60 @@ export function* returning(confirmed, submitted, accepted, writtenAt) {
|
|
|
382
404
|
written.set(path, undefined);
|
|
383
405
|
}
|
|
384
406
|
for (const change of submitted.changes) {
|
|
385
|
-
if (change.kind === 'arrival'
|
|
386
|
-
if (accepted.revisions[change.path]
|
|
407
|
+
if (change.kind === 'arrival') {
|
|
408
|
+
if (accepted.revisions[change.path] === undefined)
|
|
409
|
+
continue;
|
|
410
|
+
created.set(change.path, change.created);
|
|
411
|
+
if ('binary' in change)
|
|
387
412
|
binaries.set(change.path, { state: 'accepted', ...change.binary });
|
|
388
|
-
}
|
|
389
413
|
continue;
|
|
390
414
|
}
|
|
391
|
-
if (change.kind !== 'move')
|
|
415
|
+
if (change.kind !== 'move' || accepted.revisions[change.to] === undefined)
|
|
392
416
|
continue;
|
|
417
|
+
created.set(change.to, read(created, confirmed.created, change.path));
|
|
418
|
+
created.set(change.path, undefined);
|
|
393
419
|
const moved = read(binaries, confirmed.binaries, change.path);
|
|
394
|
-
if (moved === undefined
|
|
420
|
+
if (moved === undefined)
|
|
395
421
|
continue;
|
|
396
422
|
binaries.set(change.to, moved);
|
|
397
423
|
binaries.set(change.path, undefined);
|
|
398
424
|
}
|
|
399
425
|
for (const [path, binary] of acceptedBinaries(accepted.binaryFiles ?? {}))
|
|
400
426
|
binaries.set(path, binary);
|
|
401
|
-
for (const path of accepted.removals)
|
|
427
|
+
for (const path of accepted.removals) {
|
|
402
428
|
binaries.set(path, undefined);
|
|
429
|
+
created.set(path, undefined);
|
|
430
|
+
}
|
|
403
431
|
const paths = new Set([
|
|
404
432
|
...documents.keys(),
|
|
405
433
|
...binaries.keys(),
|
|
406
434
|
...revisions.keys(),
|
|
407
435
|
...fileIds.keys(),
|
|
436
|
+
...created.keys(),
|
|
408
437
|
...changes.keys(),
|
|
409
438
|
...written.keys(),
|
|
410
439
|
]);
|
|
411
440
|
const set = [];
|
|
412
441
|
const removed = [];
|
|
413
442
|
for (const path of paths) {
|
|
414
|
-
yield ROW_WEIGHT;
|
|
415
443
|
const content = read(documents, confirmed.documents, path);
|
|
416
444
|
const binary = read(binaries, confirmed.binaries, path);
|
|
445
|
+
yield ROW_WEIGHT;
|
|
417
446
|
if (content === undefined && binary === undefined) {
|
|
418
447
|
removed.push(path);
|
|
419
448
|
continue;
|
|
420
449
|
}
|
|
450
|
+
const text = binary === undefined ? (content ?? null) : null;
|
|
451
|
+
const fresh = confirmed.documents[path] === undefined && confirmed.binaries[path] === undefined;
|
|
421
452
|
set.push({
|
|
422
453
|
path,
|
|
423
|
-
content:
|
|
424
|
-
|
|
454
|
+
content: text,
|
|
455
|
+
facts: text === null ? null : (read(facts, confirmed.facts, path) ?? null),
|
|
425
456
|
binary: binary ?? null,
|
|
426
457
|
revision: read(revisions, confirmed.revisions, path) ?? null,
|
|
427
458
|
fileId: read(fileIds, confirmed.fileIds, path) ?? null,
|
|
459
|
+
created: read(created, confirmed.created, path) ??
|
|
460
|
+
(fresh ? (read(changes, confirmed.changes, path)?.time ?? null) : null),
|
|
428
461
|
change: read(changes, confirmed.changes, path) ?? null,
|
|
429
462
|
written: read(written, confirmed.written, path) ?? null,
|
|
430
463
|
});
|
package/dist/room-draft.d.ts
CHANGED
|
@@ -90,9 +90,9 @@ type ChangedUnderneath = {
|
|
|
90
90
|
readonly file?: string | null;
|
|
91
91
|
};
|
|
92
92
|
export type ReturnReason = ProviderRefusal & {
|
|
93
|
-
readonly kind: Open<'conflicted' | 'rejected' | '
|
|
93
|
+
readonly kind: Open<'conflicted' | 'rejected' | 'withdrawn'>;
|
|
94
94
|
};
|
|
95
|
-
export declare function returnedBy(kind: '
|
|
95
|
+
export declare function returnedBy(kind: 'withdrawn'): ReturnReason;
|
|
96
96
|
export type RoomDraft = {
|
|
97
97
|
readonly room: string;
|
|
98
98
|
readonly path: string;
|