@agentshouse/mdruntime 0.1.0-c4ca57eefb98a → 0.1.0-c4ef58fbdca7b

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/README.md +2 -2
  2. package/dist/acceptance.d.ts +6 -0
  3. package/dist/acceptance.d.ts.map +1 -0
  4. package/dist/acceptance.js +389 -0
  5. package/dist/actions.d.ts +20 -0
  6. package/dist/actions.d.ts.map +1 -0
  7. package/dist/actions.js +251 -0
  8. package/dist/adapter.d.ts +85 -67
  9. package/dist/adapter.d.ts.map +1 -1
  10. package/dist/attached-model.d.ts +3 -10
  11. package/dist/attached-model.d.ts.map +1 -1
  12. package/dist/attached-model.js +21 -56
  13. package/dist/bootstrap.d.ts +11 -10
  14. package/dist/bootstrap.d.ts.map +1 -1
  15. package/dist/bootstrap.js +218 -82
  16. package/dist/cell.d.ts +6 -0
  17. package/dist/cell.d.ts.map +1 -0
  18. package/dist/cell.js +9 -0
  19. package/dist/chain.d.ts +2 -1
  20. package/dist/chain.d.ts.map +1 -1
  21. package/dist/chain.js +3 -7
  22. package/dist/change.d.ts +1 -0
  23. package/dist/change.d.ts.map +1 -1
  24. package/dist/chat-types.d.ts +5 -0
  25. package/dist/chat-types.d.ts.map +1 -0
  26. package/dist/chat-types.js +13 -0
  27. package/dist/client.d.ts +21 -6
  28. package/dist/client.d.ts.map +1 -1
  29. package/dist/client.js +3 -1
  30. package/dist/collection.d.ts +2 -4
  31. package/dist/collection.d.ts.map +1 -1
  32. package/dist/collection.js +1 -17
  33. package/dist/compile.d.ts +6 -6
  34. package/dist/compile.d.ts.map +1 -1
  35. package/dist/compile.js +263 -319
  36. package/dist/connection.d.ts +5 -143
  37. package/dist/connection.d.ts.map +1 -1
  38. package/dist/connection.js +102 -5311
  39. package/dist/context.d.ts +2 -0
  40. package/dist/context.d.ts.map +1 -0
  41. package/dist/context.js +7 -0
  42. package/dist/conversation-live.d.ts +136 -0
  43. package/dist/conversation-live.d.ts.map +1 -0
  44. package/dist/conversation-live.js +248 -0
  45. package/dist/conversation-row.d.ts +33 -0
  46. package/dist/conversation-row.d.ts.map +1 -0
  47. package/dist/conversation-row.js +53 -0
  48. package/dist/conversation.d.ts +41 -45
  49. package/dist/conversation.d.ts.map +1 -1
  50. package/dist/conversation.js +860 -869
  51. package/dist/discovery.d.ts +10 -0
  52. package/dist/discovery.d.ts.map +1 -0
  53. package/dist/discovery.js +175 -0
  54. package/dist/durability.d.ts +15 -1
  55. package/dist/durability.d.ts.map +1 -1
  56. package/dist/entry.d.ts +2 -2
  57. package/dist/entry.d.ts.map +1 -1
  58. package/dist/entry.js +17 -7
  59. package/dist/figures.d.ts +49 -0
  60. package/dist/figures.d.ts.map +1 -0
  61. package/dist/figures.js +197 -0
  62. package/dist/holdings.d.ts +29 -0
  63. package/dist/holdings.d.ts.map +1 -0
  64. package/dist/holdings.js +95 -0
  65. package/dist/host.d.ts +4 -7
  66. package/dist/host.d.ts.map +1 -1
  67. package/dist/host.js +29 -31
  68. package/dist/identity.d.ts +0 -1
  69. package/dist/identity.d.ts.map +1 -1
  70. package/dist/identity.js +0 -3
  71. package/dist/index.d.ts +25 -8
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +7 -1
  74. package/dist/install.d.ts +56 -0
  75. package/dist/install.d.ts.map +1 -0
  76. package/dist/install.js +556 -0
  77. package/dist/job.d.ts +33 -0
  78. package/dist/job.d.ts.map +1 -0
  79. package/dist/job.js +54 -0
  80. package/dist/lifecycle.d.ts +7 -0
  81. package/dist/lifecycle.d.ts.map +1 -0
  82. package/dist/lifecycle.js +268 -0
  83. package/dist/listing.d.ts +53 -0
  84. package/dist/listing.d.ts.map +1 -0
  85. package/dist/listing.js +175 -0
  86. package/dist/live.d.ts +5 -4
  87. package/dist/live.d.ts.map +1 -1
  88. package/dist/live.js +63 -22
  89. package/dist/locks.d.ts +9 -0
  90. package/dist/locks.d.ts.map +1 -0
  91. package/dist/locks.js +61 -0
  92. package/dist/log.d.ts +1 -0
  93. package/dist/log.d.ts.map +1 -1
  94. package/dist/lost.d.ts +5 -0
  95. package/dist/lost.d.ts.map +1 -0
  96. package/dist/lost.js +61 -0
  97. package/dist/media.d.ts +1 -1
  98. package/dist/media.d.ts.map +1 -1
  99. package/dist/media.js +19 -9
  100. package/dist/memory.d.ts +11 -4
  101. package/dist/memory.d.ts.map +1 -1
  102. package/dist/memory.js +171 -82
  103. package/dist/messages.d.ts +27 -3
  104. package/dist/messages.d.ts.map +1 -1
  105. package/dist/messages.js +97 -19
  106. package/dist/model.d.ts +2 -10
  107. package/dist/model.d.ts.map +1 -1
  108. package/dist/model.js +0 -18
  109. package/dist/models.d.ts +14 -0
  110. package/dist/models.d.ts.map +1 -0
  111. package/dist/models.js +193 -0
  112. package/dist/observation.d.ts +2 -2
  113. package/dist/observation.d.ts.map +1 -1
  114. package/dist/observation.js +7 -2
  115. package/dist/opening.d.ts +4 -0
  116. package/dist/opening.d.ts.map +1 -0
  117. package/dist/opening.js +57 -0
  118. package/dist/outcome.d.ts +4 -4
  119. package/dist/outcome.d.ts.map +1 -1
  120. package/dist/outcome.js +3 -0
  121. package/dist/overlay.d.ts +1 -0
  122. package/dist/overlay.d.ts.map +1 -1
  123. package/dist/overlay.js +11 -0
  124. package/dist/parts.d.ts +59 -0
  125. package/dist/parts.d.ts.map +1 -0
  126. package/dist/parts.js +118 -0
  127. package/dist/preparation.d.ts +20 -0
  128. package/dist/preparation.d.ts.map +1 -0
  129. package/dist/preparation.js +226 -0
  130. package/dist/queries.d.ts +16 -0
  131. package/dist/queries.d.ts.map +1 -0
  132. package/dist/queries.js +272 -0
  133. package/dist/query.d.ts +14 -209
  134. package/dist/query.d.ts.map +1 -1
  135. package/dist/query.js +3 -505
  136. package/dist/questions.d.ts +34 -0
  137. package/dist/questions.d.ts.map +1 -0
  138. package/dist/questions.js +122 -0
  139. package/dist/reach.d.ts +15 -13
  140. package/dist/reach.d.ts.map +1 -1
  141. package/dist/reach.js +183 -137
  142. package/dist/react.d.ts +10 -2
  143. package/dist/react.d.ts.map +1 -1
  144. package/dist/read.d.ts +7 -0
  145. package/dist/read.d.ts.map +1 -0
  146. package/dist/read.js +17 -0
  147. package/dist/readiness.d.ts +2 -16
  148. package/dist/readiness.d.ts.map +1 -1
  149. package/dist/readiness.js +4 -10
  150. package/dist/reads.d.ts +36 -10
  151. package/dist/reads.d.ts.map +1 -1
  152. package/dist/reads.js +158 -78
  153. package/dist/recovery.d.ts +1 -0
  154. package/dist/recovery.d.ts.map +1 -1
  155. package/dist/recovery.js +35 -1
  156. package/dist/refresh.d.ts +7 -5
  157. package/dist/refresh.d.ts.map +1 -1
  158. package/dist/refresh.js +33 -5
  159. package/dist/refusal.d.ts +5 -0
  160. package/dist/refusal.d.ts.map +1 -0
  161. package/dist/refusal.js +56 -0
  162. package/dist/replica.d.ts +8 -9
  163. package/dist/replica.d.ts.map +1 -1
  164. package/dist/replica.js +52 -20
  165. package/dist/room-draft.d.ts +4 -3
  166. package/dist/room-draft.d.ts.map +1 -1
  167. package/dist/room-draft.js +65 -52
  168. package/dist/room-drafts.d.ts +24 -0
  169. package/dist/room-drafts.d.ts.map +1 -0
  170. package/dist/room-drafts.js +216 -0
  171. package/dist/rows.d.ts +14 -21
  172. package/dist/rows.d.ts.map +1 -1
  173. package/dist/rows.js +48 -184
  174. package/dist/runtime.d.ts +43 -0
  175. package/dist/runtime.d.ts.map +1 -0
  176. package/dist/runtime.js +1 -0
  177. package/dist/save.d.ts +3 -1
  178. package/dist/save.d.ts.map +1 -1
  179. package/dist/save.js +16 -11
  180. package/dist/saves.d.ts +70 -0
  181. package/dist/saves.d.ts.map +1 -0
  182. package/dist/saves.js +1006 -0
  183. package/dist/search.d.ts +12 -63
  184. package/dist/search.d.ts.map +1 -1
  185. package/dist/search.js +9 -52
  186. package/dist/seed.d.ts +11 -2
  187. package/dist/seed.d.ts.map +1 -1
  188. package/dist/seed.js +71 -0
  189. package/dist/shared.d.ts +1 -2
  190. package/dist/shared.d.ts.map +1 -1
  191. package/dist/shared.js +9 -15
  192. package/dist/shown.d.ts +31 -0
  193. package/dist/shown.d.ts.map +1 -0
  194. package/dist/shown.js +295 -0
  195. package/dist/socket/admission.d.ts +7 -0
  196. package/dist/socket/admission.d.ts.map +1 -0
  197. package/dist/socket/admission.js +39 -0
  198. package/dist/socket/answers.d.ts +6 -0
  199. package/dist/socket/answers.d.ts.map +1 -0
  200. package/dist/socket/answers.js +20 -0
  201. package/dist/socket/lanes.d.ts +20 -0
  202. package/dist/socket/lanes.d.ts.map +1 -0
  203. package/dist/socket/lanes.js +77 -0
  204. package/dist/socket/reads.d.ts +10 -0
  205. package/dist/socket/reads.d.ts.map +1 -0
  206. package/dist/socket/reads.js +31 -0
  207. package/dist/socket/rooms.d.ts +43 -0
  208. package/dist/socket/rooms.d.ts.map +1 -0
  209. package/dist/socket/rooms.js +90 -0
  210. package/dist/socket/session.d.ts +39 -0
  211. package/dist/socket/session.d.ts.map +1 -0
  212. package/dist/socket/session.js +23 -0
  213. package/dist/socket.d.ts +70 -0
  214. package/dist/socket.d.ts.map +1 -0
  215. package/dist/socket.js +175 -0
  216. package/dist/source.d.ts +61 -0
  217. package/dist/source.d.ts.map +1 -0
  218. package/dist/source.js +81 -0
  219. package/dist/status.d.ts +0 -6
  220. package/dist/status.d.ts.map +1 -1
  221. package/dist/status.js +0 -6
  222. package/dist/store/fences.d.ts +16 -0
  223. package/dist/store/fences.d.ts.map +1 -0
  224. package/dist/store/fences.js +26 -0
  225. package/dist/store/installs.d.ts +30 -0
  226. package/dist/store/installs.d.ts.map +1 -0
  227. package/dist/store/installs.js +34 -0
  228. package/dist/store/readiness.d.ts +10 -0
  229. package/dist/store/readiness.d.ts.map +1 -0
  230. package/dist/store/readiness.js +52 -0
  231. package/dist/store/records.d.ts +212 -0
  232. package/dist/store/records.d.ts.map +1 -0
  233. package/dist/store/records.js +431 -0
  234. package/dist/store/room-held.d.ts +8 -0
  235. package/dist/store/room-held.d.ts.map +1 -0
  236. package/dist/store/room-held.js +17 -0
  237. package/dist/store/space.d.ts +11 -0
  238. package/dist/store/space.d.ts.map +1 -0
  239. package/dist/store/space.js +43 -0
  240. package/dist/store/watchers.d.ts +17 -0
  241. package/dist/store/watchers.d.ts.map +1 -0
  242. package/dist/store/watchers.js +57 -0
  243. package/dist/store/writes.d.ts +24 -0
  244. package/dist/store/writes.d.ts.map +1 -0
  245. package/dist/store/writes.js +125 -0
  246. package/dist/store.d.ts +107 -157
  247. package/dist/store.d.ts.map +1 -1
  248. package/dist/store.js +143 -395
  249. package/dist/stored.d.ts +58 -37
  250. package/dist/stored.d.ts.map +1 -1
  251. package/dist/stored.js +283 -203
  252. package/dist/surface.d.ts +88 -0
  253. package/dist/surface.d.ts.map +1 -0
  254. package/dist/surface.js +223 -0
  255. package/dist/sync.d.ts +20 -0
  256. package/dist/sync.d.ts.map +1 -0
  257. package/dist/sync.js +532 -0
  258. package/dist/tables.d.ts +120 -55
  259. package/dist/tables.d.ts.map +1 -1
  260. package/dist/tables.js +212 -93
  261. package/dist/tallies.d.ts +18 -0
  262. package/dist/tallies.d.ts.map +1 -0
  263. package/dist/tallies.js +129 -0
  264. package/dist/transfer.d.ts +0 -5
  265. package/dist/transfer.d.ts.map +1 -1
  266. package/dist/validation.d.ts +3 -4
  267. package/dist/validation.d.ts.map +1 -1
  268. package/dist/validation.js +42 -100
  269. package/dist/windows.d.ts +1 -12
  270. package/dist/windows.d.ts.map +1 -1
  271. package/dist/windows.js +2 -75
  272. package/dist/wire.d.ts +17 -5
  273. package/dist/wire.d.ts.map +1 -1
  274. package/dist/wire.js +7 -1
  275. package/package.json +2 -2
  276. package/dist/fence.d.ts +0 -6
  277. package/dist/fence.d.ts.map +0 -1
  278. package/dist/fence.js +0 -10
  279. package/dist/fulltext.d.ts +0 -27
  280. package/dist/fulltext.d.ts.map +0 -1
  281. package/dist/fulltext.js +0 -370
  282. package/dist/words.d.ts +0 -19
  283. package/dist/words.d.ts.map +0 -1
  284. package/dist/words.js +0 -156
package/dist/messages.js CHANGED
@@ -1,24 +1,67 @@
1
- import { indexMessage, unindexMessages } from './fulltext.js';
1
+ import { sql } from '@agentshouse/mdmodel';
2
+ import { EXCERPT } from './read.js';
3
+ const SAID_BY_HOUSE = `json_extract(message, '$.role') = 'house'`;
4
+ const ANSWERS_THE_TURN = `json_extract(message, '$.role') = 'assistant'`;
5
+ const MARKS_A_JOB = `instr(message, '"marker":"job"') > 0`;
2
6
  export const MESSAGE_TABLES = [
3
7
  'CREATE TABLE conversation_reads (conversation TEXT PRIMARY KEY, read TEXT, partial INTEGER NOT NULL) WITHOUT ROWID',
4
8
  'CREATE TABLE conversation_messages (id INTEGER PRIMARY KEY, conversation TEXT NOT NULL, identity TEXT NOT NULL, turn TEXT NOT NULL, position TEXT NOT NULL, message TEXT NOT NULL, text TEXT NOT NULL)',
5
9
  'CREATE UNIQUE INDEX conversation_messages_identity ON conversation_messages (conversation, identity)',
6
10
  'CREATE INDEX conversation_messages_position ON conversation_messages (conversation, position, identity)',
7
11
  'CREATE INDEX conversation_messages_turn ON conversation_messages (conversation, turn)',
12
+ `CREATE INDEX conversation_messages_house ON conversation_messages (conversation, position, identity) WHERE ${SAID_BY_HOUSE}`,
13
+ `CREATE INDEX conversation_messages_jobs ON conversation_messages (conversation, position, identity) WHERE ${MARKS_A_JOB}`,
8
14
  ];
15
+ const NEWEST_FIRST = 'ORDER BY position DESC, identity DESC LIMIT 1';
16
+ const OLDEST_FIRST = 'ORDER BY position, identity LIMIT 1';
17
+ const OF_THE_ROW = 'SELECT id FROM conversation_messages WHERE conversation = listed.value';
18
+ export const ROWS = `WITH chosen AS (
19
+ SELECT listed.value AS conversation,
20
+ (${OF_THE_ROW} AND ${ANSWERS_THE_TURN} ${NEWEST_FIRST}) AS answer,
21
+ (${OF_THE_ROW} AND text <> '' ${NEWEST_FIRST}) AS said,
22
+ (${OF_THE_ROW} AND ${SAID_BY_HOUSE} ${OLDEST_FIRST}) AS opened,
23
+ (${OF_THE_ROW} AND ${SAID_BY_HOUSE} AND json_extract(message, '$.waiting') = 1 ${OLDEST_FIRST}) AS asking
24
+ FROM json_each(?) AS listed
25
+ )
26
+ SELECT chosen.conversation AS conversation,
27
+ substr(said.text, 1, ${EXCERPT}) AS said_text,
28
+ json_extract(said.message, '$.role') AS said_role,
29
+ json_extract(said.message, '$.accepted_at') AS said_at,
30
+ substr(json_extract(answer.message, '$.failure'), 1, ${EXCERPT}) AS failure,
31
+ json_extract(opened.message, '$.source') AS opened_source,
32
+ json_extract(opened.message, '$.sender') AS opened_sender,
33
+ asking.identity AS asking_identity,
34
+ asking.text AS asking_text,
35
+ json_extract(asking.message, '$.accepted_at') AS asking_at,
36
+ json_extract(asking.message, '$.source') AS asking_source,
37
+ json_extract(asking.message, '$.sender') AS asking_sender
38
+ FROM chosen
39
+ LEFT JOIN conversation_messages said ON said.id = chosen.said
40
+ LEFT JOIN conversation_messages answer ON answer.id = chosen.answer
41
+ LEFT JOIN conversation_messages opened ON opened.id = chosen.opened
42
+ LEFT JOIN conversation_messages asking ON asking.id = chosen.asking`;
43
+ export const JOB_MARKERS = `SELECT json_extract(part.value, '$.text') AS said,
44
+ json_extract(message, '$.accepted_at') AS at
45
+ FROM conversation_messages, json_each(message, '$.parts') AS part
46
+ WHERE conversation = ? AND ${MARKS_A_JOB}
47
+ AND json_extract(part.value, '$.type') = 'marker'
48
+ AND json_extract(part.value, '$.marker') = 'job'
49
+ ORDER BY position, identity, part.key`;
9
50
  function text(value) {
10
51
  return typeof value === 'string' ? value : String(value);
11
52
  }
12
- export function heldConversations(connection) {
53
+ export function heldConversations(connection, conversations) {
54
+ const named = conversations === null ? '' : ' AND conversation IN (SELECT value FROM json_each(?))';
55
+ const bound = conversations === null ? [] : [JSON.stringify(conversations)];
13
56
  const held = new Map();
14
- for (const row of connection.rows('SELECT conversation, read, partial FROM conversation_reads')) {
57
+ for (const row of connection.rows(`SELECT conversation, read, partial FROM conversation_reads WHERE 1 = 1${named}`, bound)) {
15
58
  held.set(text(row.conversation), {
16
59
  conversation: text(row.conversation),
17
60
  read: row.read === null ? null : text(row.read),
18
61
  partial: Number(row.partial) === 1,
19
62
  });
20
63
  }
21
- for (const row of connection.rows('SELECT DISTINCT conversation FROM conversation_messages WHERE conversation NOT IN (SELECT conversation FROM conversation_reads)')) {
64
+ for (const row of connection.rows(`SELECT DISTINCT conversation FROM conversation_messages WHERE conversation NOT IN (SELECT conversation FROM conversation_reads)${named}`, bound)) {
22
65
  held.set(text(row.conversation), {
23
66
  conversation: text(row.conversation),
24
67
  read: undefined,
@@ -36,17 +79,12 @@ export function keptMessages(connection, { conversation, messages, read }) {
36
79
  JSON.stringify(message.message ?? null),
37
80
  message.text,
38
81
  ];
39
- let id;
40
82
  if (held === undefined) {
41
83
  connection.run('INSERT INTO conversation_messages (conversation, identity, turn, position, message, text) VALUES (?, ?, ?, ?, ?, ?)', [conversation, message.identity, ...record]);
42
- id = Number(connection.rows('SELECT last_insert_rowid() AS id')[0].id);
43
84
  }
44
85
  else {
45
- id = Number(held.id);
46
- unindexMessages(connection, [id]);
47
- connection.run('UPDATE conversation_messages SET turn = ?, position = ?, message = ?, text = ? WHERE id = ?', [...record, id]);
86
+ connection.run('UPDATE conversation_messages SET turn = ?, position = ?, message = ?, text = ? WHERE id = ?', [...record, held.id]);
48
87
  }
49
- indexMessage(connection, id, message.text);
50
88
  }
51
89
  if (read !== undefined) {
52
90
  connection.run('INSERT OR REPLACE INTO conversation_reads (conversation, read, partial) VALUES (?, ?, ?)', [conversation, read.at, read.partial ? 1 : 0]);
@@ -62,24 +100,64 @@ function accepted(row) {
62
100
  message: JSON.parse(text(row.message)),
63
101
  };
64
102
  }
65
- export function messageWindow(connection, conversation, limit, before) {
66
- const rows = connection.rows(`SELECT identity, turn, position, message, text FROM conversation_messages WHERE conversation = ?${before === null ? '' : ' AND (position < ? OR (position = ? AND identity < ?))'} ORDER BY position DESC, identity DESC LIMIT ?`, before === null
67
- ? [conversation, limit + 1]
68
- : [conversation, before[0], before[0], before[1], limit + 1]);
103
+ function holding(phrase) {
104
+ return phrase === null
105
+ ? { sql: '', bind: [] }
106
+ : { sql: ` AND ${sql.HOLDS_PHRASE}(text, ?)`, bind: [phrase.toLowerCase()] };
107
+ }
108
+ export function messageWindow(connection, conversation, limit, before, phrase) {
109
+ const held = holding(phrase);
110
+ const rows = connection.rows(`SELECT identity, turn, position, message, text FROM conversation_messages WHERE conversation = ?${held.sql}${before === null ? '' : ' AND (position < ? OR (position = ? AND identity < ?))'} ORDER BY position DESC, identity DESC LIMIT ?`, before === null
111
+ ? [conversation, ...held.bind, limit + 1]
112
+ : [conversation, ...held.bind, before[0], before[0], before[1], limit + 1]);
69
113
  return { messages: rows.slice(0, limit).map(accepted).reverse(), more: rows.length > limit };
70
114
  }
71
- export function messageCount(connection, conversation) {
72
- const [counted] = connection.rows('SELECT count(*) AS held FROM conversation_messages WHERE conversation = ?', [conversation]);
115
+ export function messageCount(connection, conversation, phrase) {
116
+ const held = holding(phrase);
117
+ const [counted] = connection.rows(`SELECT count(*) AS held FROM conversation_messages WHERE conversation = ?${held.sql}`, [conversation, ...held.bind]);
73
118
  return Number(counted?.held ?? 0);
74
119
  }
120
+ function textOrNull(value) {
121
+ return value === null || value === undefined ? null : text(value);
122
+ }
123
+ function heldSource(source, sender) {
124
+ return {
125
+ source: source === null || source === undefined ? null : JSON.parse(text(source)),
126
+ sender: textOrNull(sender),
127
+ };
128
+ }
129
+ export function conversationRows(connection, conversations) {
130
+ return connection.rows(ROWS, [JSON.stringify(conversations)]).map((row) => ({
131
+ conversation: text(row.conversation),
132
+ said: row.said_text === null
133
+ ? null
134
+ : {
135
+ text: text(row.said_text),
136
+ role: textOrNull(row.said_role),
137
+ at: textOrNull(row.said_at),
138
+ },
139
+ failure: textOrNull(row.failure),
140
+ opened: row.opened_source === null ? null : heldSource(row.opened_source, row.opened_sender),
141
+ asking: row.asking_identity === null
142
+ ? null
143
+ : {
144
+ ...heldSource(row.asking_source, row.asking_sender),
145
+ identity: text(row.asking_identity),
146
+ text: text(row.asking_text),
147
+ at: textOrNull(row.asking_at),
148
+ },
149
+ }));
150
+ }
151
+ export function jobMarkers(connection, conversation) {
152
+ return connection
153
+ .rows(JOB_MARKERS, [conversation])
154
+ .map((row) => ({ said: text(row.said), at: text(row.at) }));
155
+ }
75
156
  export function turnArrived(connection, conversation, turn) {
76
157
  return (connection.rows('SELECT 1 FROM conversation_messages WHERE conversation = ? AND turn = ? LIMIT 1', [conversation, turn]).length > 0);
77
158
  }
78
159
  export function droppedMessages(connection, conversations) {
79
160
  for (const conversation of conversations) {
80
- unindexMessages(connection, connection
81
- .rows('SELECT id FROM conversation_messages WHERE conversation = ?', [conversation])
82
- .map((row) => Number(row.id)));
83
161
  connection.run('DELETE FROM conversation_messages WHERE conversation = ?', [conversation]);
84
162
  connection.run('DELETE FROM conversation_reads WHERE conversation = ?', [conversation]);
85
163
  }
package/dist/model.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { Definition, ValueFacts, VerifiedModel } from '@agentshouse/mdmodel';
1
+ import type { Definition, VerifiedModel } from '@agentshouse/mdmodel';
2
2
  import type { Open } from './open.js';
3
3
  export type ModelIdentity = {
4
4
  identity: string;
@@ -8,7 +8,7 @@ export type ModelSnapshot = ModelIdentity & {
8
8
  schema: string | null;
9
9
  revision: string | null;
10
10
  };
11
- export type ModelUnavailableReason = Open<'not-readable' | 'revoked' | 'not-acquired' | 'invalid'>;
11
+ export type ModelUnavailableReason = Open<'not-readable' | 'revoked' | 'not-acquired'>;
12
12
  export type ModelResult = {
13
13
  kind: 'model';
14
14
  snapshot: ModelSnapshot;
@@ -20,8 +20,6 @@ export type MdType = Definition;
20
20
  export type ModelState = {
21
21
  status: 'unavailable';
22
22
  reason: ModelUnavailableReason;
23
- schema?: string | null;
24
- revision?: string | null;
25
23
  } | {
26
24
  status: 'current' | 'cached';
27
25
  snapshot: ModelSnapshot;
@@ -37,8 +35,6 @@ export type TypesResult = {
37
35
  status: Open<'unavailable'>;
38
36
  reason: ModelUnavailableReason;
39
37
  types: null;
40
- schema?: string | null;
41
- revision?: string | null;
42
38
  } | {
43
39
  status: Open<'current' | 'cached'>;
44
40
  identity: string;
@@ -57,8 +53,4 @@ export declare const NO_MODEL: ModelState;
57
53
  export declare function definitionOf(state: ModelState, type: string | undefined): Definition | undefined;
58
54
  export declare function modelTypes(state: ModelState): TypesResult;
59
55
  export declare function storedModel(state: ModelState): StoredModel;
60
- export declare function cached(state: ModelState): ModelState;
61
- export declare function sameModel(left: ModelIdentity, right: ModelIdentity): boolean;
62
- export declare function sameTyping(left: ModelState, right: ModelState): boolean;
63
- export declare function referenceField(facts: ValueFacts | undefined): boolean;
64
56
  //# sourceMappingURL=model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAClE,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAC/F,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,cAAc,GAAG,SAAS,GAAG,cAAc,CAAC,CAAC;AACvF,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,aAAa,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,CAAC;AAClE,MAAM,MAAM,MAAM,GAAG,UAAU,CAAC;AAChC,MAAM,MAAM,UAAU,GAClB;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,GACzD;IACE,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,QAAQ,EAAE,aAAa,CAAC;IACxB,YAAY,EAAE,aAAa,CAAC;IAC5B,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;CAC/B,CAAC;AACN,MAAM,MAAM,WAAW,GACnB,OAAO,CAAC,UAAU,EAAE;IAAE,MAAM,EAAE,aAAa,CAAA;CAAE,CAAC,GAC9C,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;IAAE,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAA;CAAE,CAAC,EAAE,OAAO,CAAC,CAAC;AACzE,MAAM,MAAM,WAAW,GACnB;IAAE,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAC;IAAC,KAAK,EAAE,IAAI,CAAA;CAAE,GAC5E;IACE,MAAM,EAAE,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,aAAa,CAAC;IAC5B,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAAC;AACN,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC;CACpC,CAAC;AACF,eAAO,MAAM,QAAQ,EAAE,UAA8D,CAAC;AACtF,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAGhG;AACD,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAczD;AACD,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAI1D"}
package/dist/model.js CHANGED
@@ -23,21 +23,3 @@ export function storedModel(state) {
23
23
  const { types: _types, ...stored } = state;
24
24
  return stored;
25
25
  }
26
- export function cached(state) {
27
- return state.status === 'unavailable' ? state : { ...state, status: 'cached' };
28
- }
29
- export function sameModel(left, right) {
30
- return left.identity === right.identity && left.version === right.version;
31
- }
32
- export function sameTyping(left, right) {
33
- if (left === right)
34
- return true;
35
- if (left.status === 'unavailable' || right.status === 'unavailable') {
36
- return left.status === right.status;
37
- }
38
- return (left.snapshot.schema === right.snapshot.schema &&
39
- sameModel(left.verifiedWith, right.verifiedWith));
40
- }
41
- export function referenceField(facts) {
42
- return facts?.reference !== undefined || facts?.items?.reference !== undefined;
43
- }
@@ -0,0 +1,14 @@
1
+ import type { ScopedRefusal } from './adapter.js';
2
+ import { type ModelState } from './model.js';
3
+ import { type ReplicaRecord } from './replica.js';
4
+ import type { Runtime } from './runtime.js';
5
+ import type { RoomDeclaration } from './socket.js';
6
+ import type { RuntimeStore } from './store.js';
7
+ export declare function declaredAsHeld(held: ReplicaRecord | undefined, room: RoomDeclaration): boolean;
8
+ export declare function revoked(model: ModelState | undefined): boolean;
9
+ export declare function keepNaming(runtime: Runtime, local: RuntimeStore, room: RoomDeclaration): Promise<void>;
10
+ export declare function retainModel(runtime: Runtime, local: RuntimeStore, room: RoomDeclaration, given: ModelState | null): Promise<void>;
11
+ export declare function scoped(runtime: Runtime, result: ScopedRefusal, room: RoomDeclaration, local: RuntimeStore): Promise<void>;
12
+ export declare function settleModels(runtime: Runtime, held: readonly RoomDeclaration[], status: 'current' | 'cached', local: RuntimeStore): Promise<void>;
13
+ export declare function cachedModels(runtime: Runtime, local: RuntimeStore): Promise<void>;
14
+ //# sourceMappingURL=models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAKlD,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAG5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAQ9F;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAE9D;AAMD,wBAAsB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,iBAqB5F;AAMD,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,UAAU,GAAG,IAAI,iBAsDzB;AAED,wBAAsB,MAAM,CAC1B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,YAAY,iBA0BpB;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,SAAS,eAAe,EAAE,EAChC,MAAM,EAAE,SAAS,GAAG,QAAQ,EAC5B,KAAK,EAAE,YAAY,iBAsDpB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAcvF"}
package/dist/models.js ADDED
@@ -0,0 +1,193 @@
1
+ import { changeSet } from './change-set.js';
2
+ import { composedOf } from './collection.js';
3
+ import { admitted, declarationOf, list, listedLocators } from './listing.js';
4
+ import { loseRooms } from './lost.js';
5
+ import { NO_MODEL } from './model.js';
6
+ import { storedRecord } from './replica.js';
7
+ import { overlayDiff, preparedAfter, replayed, sliceAt } from './saves.js';
8
+ import { emitRooms } from './shown.js';
9
+ export function declaredAsHeld(held, room) {
10
+ return (held === undefined ||
11
+ (JSON.stringify(held.operations) === JSON.stringify(room.operations) &&
12
+ JSON.stringify(held.replica) === JSON.stringify(room.replica) &&
13
+ JSON.stringify(held.providerOwnedPaths) === JSON.stringify(room.providerOwnedPaths) &&
14
+ JSON.stringify(held.typedSelection) === JSON.stringify(room.typedSelection ?? null)));
15
+ }
16
+ export function revoked(model) {
17
+ return model?.status === 'unavailable' && model.reason === 'revoked';
18
+ }
19
+ function unheldModelOf({ socket }, locator) {
20
+ return socket.rooms.standing(locator).unheldModel ?? NO_MODEL;
21
+ }
22
+ export async function keepNaming(runtime, local, room) {
23
+ const { store, socket } = runtime;
24
+ const held = await store.record(room.locator);
25
+ if (held === undefined || (held.name === room.name && held.handle === room.handle))
26
+ return;
27
+ await store.exclusive(async () => {
28
+ if (!socket.continuing())
29
+ return;
30
+ const current = await store.record(room.locator);
31
+ if (current === undefined)
32
+ return;
33
+ const record = { ...current, name: room.name, handle: room.handle };
34
+ await local.commit({
35
+ rooms: [
36
+ {
37
+ locator: room.locator,
38
+ key: record.key,
39
+ record: storedRecord(record),
40
+ composed: composedOf(store.composed(record)),
41
+ },
42
+ ],
43
+ });
44
+ emitRooms(runtime);
45
+ });
46
+ }
47
+ async function modelNow(runtime, locator) {
48
+ return (await runtime.store.record(locator))?.model ?? unheldModelOf(runtime, locator);
49
+ }
50
+ export async function retainModel(runtime, local, room, given) {
51
+ const { store, socket } = runtime;
52
+ const held = await store.record(room.locator);
53
+ const previous = held?.model ?? unheldModelOf(runtime, room.locator);
54
+ const next = given ?? previous;
55
+ if (JSON.stringify(previous) === JSON.stringify(next) && declaredAsHeld(held, room))
56
+ return;
57
+ await store.exclusive(async () => {
58
+ if (!socket.continuing())
59
+ return;
60
+ const work = await store.work(room.locator);
61
+ const current = work.replica;
62
+ let changed = null;
63
+ if (current !== undefined) {
64
+ const record = {
65
+ ...current.record,
66
+ name: room.name,
67
+ handle: room.handle,
68
+ operations: room.operations,
69
+ replica: room.replica,
70
+ providerOwnedPaths: room.providerOwnedPaths,
71
+ typedSelection: room.typedSelection ?? null,
72
+ model: next,
73
+ };
74
+ const confirmedLayer = await sliceAt(store, record, 'confirmed', current.queue, current.overlaid);
75
+ const replayedLayer = await replayed(store, record, confirmedLayer, current.queue);
76
+ const diff = await overlayDiff(record, current, replayedLayer.visible, replayedLayer.touched);
77
+ const answer = await local.commit({
78
+ rooms: [
79
+ {
80
+ locator: room.locator,
81
+ key: record.key,
82
+ record: storedRecord(record),
83
+ roots: record.typedSelection?.roots ?? [],
84
+ composed: composedOf(store.composed(record)),
85
+ overlay: diff.overlay,
86
+ },
87
+ ],
88
+ });
89
+ preparedAfter(runtime, room.locator, answer);
90
+ changed = changeSet(room.locator, {
91
+ documents: answer.changed[room.locator] ?? [],
92
+ room: true,
93
+ });
94
+ }
95
+ else
96
+ socket.rooms.stand(room.locator, { unheldModel: next });
97
+ list(runtime, room, admitted(runtime, room));
98
+ if (changed === null)
99
+ emitRooms(runtime);
100
+ else
101
+ store.changed(changed);
102
+ });
103
+ }
104
+ export async function scoped(runtime, result, room, local) {
105
+ const { socket, journal } = runtime;
106
+ if (result.scope === 'content' && !result.retryable) {
107
+ journal.record(`scoped refusal ${room.locator} ${result.scope} ${result.code}`);
108
+ await loseRooms(runtime, [room.locator]);
109
+ return;
110
+ }
111
+ socket.rooms.stand(room.locator, {
112
+ refusal: { code: result.code, fields: result.fields, retryable: result.retryable },
113
+ });
114
+ let scopedAway = room;
115
+ if (result.scope === 'model')
116
+ await retainModel(runtime, local, room, {
117
+ status: 'unavailable',
118
+ reason: 'not-readable',
119
+ });
120
+ else if (result.scope !== 'operation') {
121
+ socket.rooms.stand(room.locator, { unreadable: true });
122
+ scopedAway = { ...room, replica: { ...room.replica, admission: 'unavailable' } };
123
+ await retainModel(runtime, local, scopedAway, null);
124
+ }
125
+ if (!socket.continuing())
126
+ return;
127
+ list(runtime, scopedAway, admitted(runtime, scopedAway));
128
+ emitRooms(runtime);
129
+ journal.record(`scoped refusal ${room.locator} ${result.scope} ${result.code}`);
130
+ }
131
+ export async function settleModels(runtime, held, status, local) {
132
+ const { store, socket, journal } = runtime;
133
+ const owed = (model) => model.status !== 'unavailable' && model.status !== status;
134
+ const declaredAnew = await store.exclusive(async () => {
135
+ if (!socket.continuing())
136
+ return [];
137
+ const stored = await store.rooms(held.map(({ locator }) => locator));
138
+ const unchanged = held.filter((room) => {
139
+ const record = stored.get(room.locator)?.record;
140
+ return (owed(record?.model ?? unheldModelOf(runtime, room.locator)) && declaredAsHeld(record, room));
141
+ });
142
+ const records = unchanged.flatMap((room) => {
143
+ const record = stored.get(room.locator)?.record;
144
+ return record === undefined
145
+ ? []
146
+ : [{ ...record, model: { ...record.model, status } }];
147
+ });
148
+ if (records.length > 0) {
149
+ try {
150
+ await local.commit({
151
+ rooms: records.map((record) => ({
152
+ locator: record.locator,
153
+ key: record.key,
154
+ record: storedRecord(record),
155
+ composed: composedOf(store.composed(record)),
156
+ })),
157
+ });
158
+ }
159
+ catch {
160
+ journal.record(`model ${status} persistence failed`);
161
+ }
162
+ }
163
+ for (const room of unchanged) {
164
+ const { unheldModel } = socket.rooms.standing(room.locator);
165
+ if (!stored.has(room.locator) && unheldModel !== null) {
166
+ socket.rooms.stand(room.locator, {
167
+ unheldModel: { ...unheldModel, status },
168
+ });
169
+ }
170
+ list(runtime, room, admitted(runtime, room));
171
+ }
172
+ if (unchanged.length > 0)
173
+ emitRooms(runtime);
174
+ return held.filter((room) => {
175
+ const record = stored.get(room.locator)?.record;
176
+ return (!unchanged.includes(room) && owed(record?.model ?? unheldModelOf(runtime, room.locator)));
177
+ });
178
+ });
179
+ for (const room of declaredAnew) {
180
+ const model = await modelNow(runtime, room.locator);
181
+ if (owed(model))
182
+ await retainModel(runtime, local, room, { ...model, status });
183
+ }
184
+ }
185
+ export async function cachedModels(runtime, local) {
186
+ const { store, socket } = runtime;
187
+ const held = await store.rooms();
188
+ await settleModels(runtime, listedLocators(runtime, held).flatMap((locator) => {
189
+ const room = socket.rooms.discovered(locator) ??
190
+ declarationOf(runtime, locator, held.get(locator))?.room;
191
+ return room === undefined ? [] : [room];
192
+ }), 'cached', local);
193
+ }
@@ -27,8 +27,8 @@ export declare function rowsOf(result: QueryResult): readonly (QueryDocument | Q
27
27
  export declare function whole(message: QueryMessage): message is KeyedResult;
28
28
  export declare function applied(keyed: KeyedResult, message: QueryMessage): KeyedResult;
29
29
  export declare function observed(first: unknown, stop: () => void, keyed: boolean): Observed;
30
- export declare function opened(watch: (deliver: (message: unknown) => void) => () => void, keyed: boolean): Promise<Observation<unknown>>;
31
- export declare function observing<Topic extends string>(watch: (topic: Topic, input: readonly unknown[], deliver: (message: unknown) => void) => () => void): (topic: Topic, ...input: unknown[]) => Promise<Observation<unknown>>;
30
+ export declare function opened(watch: (deliver: (message: unknown) => void, fail: (error: unknown) => void) => () => void, keyed: boolean): Promise<Observation<unknown>>;
31
+ export declare function observing<Topic extends string>(watch: (topic: Topic, input: readonly unknown[], deliver: (message: unknown) => void, fail: (error: unknown) => void) => () => void): (topic: Topic, ...input: unknown[]) => Promise<Observation<unknown>>;
32
32
  export type Digest = {
33
33
  readonly pending: string;
34
34
  } | {
@@ -1 +1 @@
1
- {"version":3,"file":"observation.d.ts","sourceRoot":"","sources":["../src/observation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"observation.d.ts","sourceRoot":"","sources":["../src/observation.ts"],"names":[],"mappings":"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"}
@@ -98,6 +98,11 @@ export function opened(watch, keyed) {
98
98
  }
99
99
  handle = observed(message, () => stop(), keyed);
100
100
  resolve(handle.observation);
101
+ }, (error) => {
102
+ if (handle !== undefined)
103
+ return;
104
+ stop();
105
+ reject(error);
101
106
  });
102
107
  }
103
108
  catch (error) {
@@ -106,9 +111,9 @@ export function opened(watch, keyed) {
106
111
  });
107
112
  }
108
113
  export function observing(watch) {
109
- return (topic, ...input) => opened((deliver) => watch(topic, input, (message) => {
114
+ return (topic, ...input) => opened((deliver, fail) => watch(topic, input, (message) => {
110
115
  deliver(structuredClone(message));
111
- }), topic === 'query');
116
+ }, fail), topic === 'query');
112
117
  }
113
118
  export function hashed(text) {
114
119
  let first = 0xdeadbeef;
@@ -0,0 +1,4 @@
1
+ import type { Runtime } from './runtime.js';
2
+ import type { RuntimeStore } from './store.js';
3
+ export declare function open(runtime: Runtime, opened: RuntimeStore): Promise<RuntimeStore>;
4
+ //# sourceMappingURL=opening.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opening.d.ts","sourceRoot":"","sources":["../src/opening.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,wBAAsB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CA2CxF"}
@@ -0,0 +1,57 @@
1
+ import { conversationsOpened } from './conversation.js';
2
+ import { detectStorageLoss, nextGeneration, refusedForSpace } from './durability.js';
3
+ import { sweep } from './install.js';
4
+ import { eraseFenced } from './lost.js';
5
+ import { prepare } from './preparation.js';
6
+ import { emitRooms, emitStorageLoss, statusShown } from './shown.js';
7
+ export async function open(runtime, opened) {
8
+ const { store, socket, journal, shell, conversations, build, usableWhenHeld } = runtime;
9
+ if (socket.closed())
10
+ throw new Error('runtime closed');
11
+ const interrupted = await opened.fences();
12
+ const kept = shell.generation;
13
+ const storedGeneration = await opened.generation();
14
+ const loss = detectStorageLoss(storedGeneration, kept);
15
+ const generation = nextGeneration(storedGeneration, kept);
16
+ if (generation !== storedGeneration)
17
+ await opened.rememberGeneration(generation);
18
+ if (generation !== kept)
19
+ await shell.keepGeneration(generation);
20
+ if (loss !== null) {
21
+ store.device.set({ storageLoss: loss });
22
+ emitStorageLoss(runtime);
23
+ }
24
+ const held = await opened.opened();
25
+ store.device.set({
26
+ heldWhenOpened: usableWhenHeld.length > 0 && (await opened.covering()).rooms.size > 0,
27
+ });
28
+ try {
29
+ await opened.demote();
30
+ await store.ask({ kind: 'read.builds', build });
31
+ for (const key of held.orphans)
32
+ await opened.release(key);
33
+ }
34
+ catch (error) {
35
+ if (!refusedForSpace(error))
36
+ throw error;
37
+ }
38
+ if (held.erasing || held.orphans.length > 0)
39
+ queueMicrotask(() => sweep(runtime));
40
+ await conversationsOpened(conversations, opened);
41
+ if (interrupted.length > 0) {
42
+ queueMicrotask(() => {
43
+ void eraseFenced(runtime, interrupted).catch(() => {
44
+ journal.record('erasure failed');
45
+ });
46
+ });
47
+ }
48
+ statusShown(runtime);
49
+ prepare(runtime);
50
+ emitRooms(runtime);
51
+ void store
52
+ .exclusive(() => runtime.unpair(opened))
53
+ .catch(() => {
54
+ journal.record('unpair failed');
55
+ });
56
+ return opened;
57
+ }
package/dist/outcome.d.ts CHANGED
@@ -13,7 +13,9 @@ export type CallResult = {
13
13
  kind: 'action';
14
14
  result: unknown;
15
15
  at?: RoomVersionAt;
16
- } | Refused<'rejected'> | Refused<'undeclared'> | Failure;
16
+ } | (Refused<'rejected'> & {
17
+ reset?: string;
18
+ }) | Refused<'undeclared'> | Failure;
17
19
  export type HistoryAnswer = Exclude<HistoryResult, {
18
20
  kind: Failure['kind'];
19
21
  }> | Failure;
@@ -65,6 +67,7 @@ export type Offline = {
65
67
  readonly kind: 'offline';
66
68
  };
67
69
  export declare const OFFLINE: Offline;
70
+ export declare function answeredResult(value: unknown): boolean;
68
71
  export declare const UNCERTAIN: Failure;
69
72
  export declare function undeclared(name: string): CallResult;
70
73
  export declare function failure(result: AdapterFailure): Failure;
@@ -80,9 +83,6 @@ export type QueueEntry = {
80
83
  readonly batch: ChangeBatch;
81
84
  } & (Submission | {
82
85
  readonly state: 'local';
83
- } | {
84
- readonly state: 'accepted';
85
- readonly roomVersion: string;
86
86
  });
87
87
  export {};
88
88
  //# sourceMappingURL=outcome.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"outcome.d.ts","sourceRoot":"","sources":["../src/outcome.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"outcome.d.ts","sourceRoot":"","sources":["../src/outcome.ts"],"names":[],"mappings":"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"}
package/dist/outcome.js CHANGED
@@ -44,6 +44,9 @@ export function lockedRoom(locator) {
44
44
  return { kind: ROOM_LOCKED, locator, code: ROOM_LOCKED, fields: {}, retryable: true };
45
45
  }
46
46
  export const OFFLINE = { kind: 'offline' };
47
+ export function answeredResult(value) {
48
+ return typeof value === 'object' && value !== null && !('pending' in value);
49
+ }
47
50
  export const UNCERTAIN = {
48
51
  kind: 'transport-uncertainty',
49
52
  code: 'transport-uncertainty',
package/dist/overlay.d.ts CHANGED
@@ -3,6 +3,7 @@ import type { ChangeBatch } from './change.js';
3
3
  export type Heads = {
4
4
  revisions: Readonly<Record<string, string>>;
5
5
  fileIds: Readonly<Record<string, string>>;
6
+ created: Readonly<Record<string, string>>;
6
7
  changes: Readonly<Record<string, HeadChange>>;
7
8
  };
8
9
  export type HeldBinary = ({