@agentshouse/mdruntime 0.1.0-cdf82f77fae68 → 0.1.0-ce06b735d6c6d

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 (383) hide show
  1. package/README.md +24 -19
  2. package/dist/acceptance.d.ts +3 -0
  3. package/dist/acceptance.d.ts.map +1 -0
  4. package/dist/acceptance.js +299 -0
  5. package/dist/act-lanes.d.ts +30 -0
  6. package/dist/act-lanes.d.ts.map +1 -0
  7. package/dist/act-lanes.js +225 -0
  8. package/dist/actions.d.ts +26 -0
  9. package/dist/actions.d.ts.map +1 -0
  10. package/dist/actions.js +302 -0
  11. package/dist/adapter.d.ts +187 -97
  12. package/dist/adapter.d.ts.map +1 -1
  13. package/dist/attached-model.d.ts +6 -10
  14. package/dist/attached-model.d.ts.map +1 -1
  15. package/dist/attached-model.js +35 -41
  16. package/dist/binary.d.ts +0 -5
  17. package/dist/binary.d.ts.map +1 -1
  18. package/dist/binary.js +1 -1
  19. package/dist/bootstrap.d.ts +31 -11
  20. package/dist/bootstrap.d.ts.map +1 -1
  21. package/dist/bootstrap.js +311 -89
  22. package/dist/cell.d.ts +6 -0
  23. package/dist/cell.d.ts.map +1 -0
  24. package/dist/cell.js +9 -0
  25. package/dist/chain.d.ts +12 -0
  26. package/dist/chain.d.ts.map +1 -0
  27. package/dist/chain.js +64 -0
  28. package/dist/change-set.d.ts +13 -14
  29. package/dist/change-set.d.ts.map +1 -1
  30. package/dist/change-set.js +17 -63
  31. package/dist/change.d.ts +32 -1
  32. package/dist/change.d.ts.map +1 -1
  33. package/dist/change.js +14 -3
  34. package/dist/chat-types.d.ts +3 -0
  35. package/dist/chat-types.d.ts.map +1 -0
  36. package/dist/chat-types.js +11 -0
  37. package/dist/client.d.ts +48 -29
  38. package/dist/client.d.ts.map +1 -1
  39. package/dist/client.js +131 -28
  40. package/dist/collection.d.ts +31 -9
  41. package/dist/collection.d.ts.map +1 -1
  42. package/dist/collection.js +49 -80
  43. package/dist/compile.d.ts +18 -0
  44. package/dist/compile.d.ts.map +1 -0
  45. package/dist/compile.js +724 -0
  46. package/dist/connection.d.ts +8 -116
  47. package/dist/connection.d.ts.map +1 -1
  48. package/dist/connection.js +112 -2412
  49. package/dist/context.d.ts +2 -0
  50. package/dist/context.d.ts.map +1 -0
  51. package/dist/{chat/context.js → context.js} +1 -4
  52. package/dist/conversation-live.d.ts +150 -0
  53. package/dist/conversation-live.d.ts.map +1 -0
  54. package/dist/conversation-live.js +259 -0
  55. package/dist/conversation-row.d.ts +35 -0
  56. package/dist/conversation-row.d.ts.map +1 -0
  57. package/dist/conversation-row.js +55 -0
  58. package/dist/conversation.d.ts +82 -45
  59. package/dist/conversation.d.ts.map +1 -1
  60. package/dist/conversation.js +1116 -584
  61. package/dist/declaration.d.ts +10 -0
  62. package/dist/declaration.d.ts.map +1 -0
  63. package/dist/declaration.js +24 -0
  64. package/dist/digest.d.ts +7 -0
  65. package/dist/digest.d.ts.map +1 -0
  66. package/dist/digest.js +113 -0
  67. package/dist/discovery.d.ts +10 -0
  68. package/dist/discovery.d.ts.map +1 -0
  69. package/dist/discovery.js +150 -0
  70. package/dist/durability.d.ts +23 -1
  71. package/dist/durability.d.ts.map +1 -1
  72. package/dist/durability.js +9 -0
  73. package/dist/entry.d.ts +20 -0
  74. package/dist/entry.d.ts.map +1 -0
  75. package/dist/entry.js +161 -0
  76. package/dist/expectation.d.ts +26 -13
  77. package/dist/expectation.d.ts.map +1 -1
  78. package/dist/expectation.js +72 -19
  79. package/dist/failure.d.ts +3 -0
  80. package/dist/failure.d.ts.map +1 -1
  81. package/dist/failure.js +6 -0
  82. package/dist/figures.d.ts +49 -0
  83. package/dist/figures.d.ts.map +1 -0
  84. package/dist/figures.js +199 -0
  85. package/dist/file.d.ts +2 -19
  86. package/dist/file.d.ts.map +1 -1
  87. package/dist/file.js +8 -122
  88. package/dist/holdings.d.ts +29 -0
  89. package/dist/holdings.d.ts.map +1 -0
  90. package/dist/holdings.js +95 -0
  91. package/dist/host.d.ts +29 -4
  92. package/dist/host.d.ts.map +1 -1
  93. package/dist/host.js +177 -27
  94. package/dist/index.d.ts +41 -13
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js +19 -2
  97. package/dist/install.d.ts +60 -0
  98. package/dist/install.d.ts.map +1 -0
  99. package/dist/install.js +537 -0
  100. package/dist/lifecycle.d.ts +7 -0
  101. package/dist/lifecycle.d.ts.map +1 -0
  102. package/dist/lifecycle.js +278 -0
  103. package/dist/listing.d.ts +52 -0
  104. package/dist/listing.d.ts.map +1 -0
  105. package/dist/listing.js +152 -0
  106. package/dist/live.d.ts +25 -0
  107. package/dist/live.d.ts.map +1 -0
  108. package/dist/live.js +206 -0
  109. package/dist/locks.d.ts +7 -0
  110. package/dist/locks.d.ts.map +1 -0
  111. package/dist/locks.js +32 -0
  112. package/dist/lost.d.ts +5 -0
  113. package/dist/lost.d.ts.map +1 -0
  114. package/dist/lost.js +49 -0
  115. package/dist/media.d.ts +8 -0
  116. package/dist/media.d.ts.map +1 -0
  117. package/dist/media.js +215 -0
  118. package/dist/memory.d.ts +24 -6
  119. package/dist/memory.d.ts.map +1 -1
  120. package/dist/memory.js +291 -101
  121. package/dist/messages.d.ts +58 -0
  122. package/dist/messages.d.ts.map +1 -0
  123. package/dist/messages.js +162 -0
  124. package/dist/model.d.ts +11 -12
  125. package/dist/model.d.ts.map +1 -1
  126. package/dist/model.js +7 -15
  127. package/dist/models.d.ts +10 -0
  128. package/dist/models.d.ts.map +1 -0
  129. package/dist/models.js +153 -0
  130. package/dist/name.d.ts +4 -0
  131. package/dist/name.d.ts.map +1 -0
  132. package/dist/name.js +122 -0
  133. package/dist/observation.d.ts +42 -9
  134. package/dist/observation.d.ts.map +1 -1
  135. package/dist/observation.js +238 -33
  136. package/dist/opened.d.ts +22 -0
  137. package/dist/opened.d.ts.map +1 -0
  138. package/dist/opened.js +107 -0
  139. package/dist/opening.d.ts +4 -0
  140. package/dist/opening.d.ts.map +1 -0
  141. package/dist/opening.js +53 -0
  142. package/dist/outcome.d.ts +60 -8
  143. package/dist/outcome.d.ts.map +1 -1
  144. package/dist/outcome.js +64 -0
  145. package/dist/overlay.d.ts +8 -4
  146. package/dist/overlay.d.ts.map +1 -1
  147. package/dist/overlay.js +136 -192
  148. package/dist/page-metadata.d.ts +8 -0
  149. package/dist/page-metadata.d.ts.map +1 -0
  150. package/dist/page-metadata.js +19 -0
  151. package/dist/parts.d.ts +4 -0
  152. package/dist/parts.d.ts.map +1 -0
  153. package/dist/parts.js +13 -0
  154. package/dist/paths.d.ts +2 -0
  155. package/dist/paths.d.ts.map +1 -1
  156. package/dist/paths.js +26 -0
  157. package/dist/preparation.d.ts +41 -0
  158. package/dist/preparation.d.ts.map +1 -0
  159. package/dist/preparation.js +314 -0
  160. package/dist/presence.d.ts +58 -0
  161. package/dist/presence.d.ts.map +1 -0
  162. package/dist/presence.js +233 -0
  163. package/dist/queries.d.ts +16 -0
  164. package/dist/queries.d.ts.map +1 -0
  165. package/dist/queries.js +308 -0
  166. package/dist/query.d.ts +49 -183
  167. package/dist/query.d.ts.map +1 -1
  168. package/dist/query.js +3 -464
  169. package/dist/{chat/questions.d.ts → questions.d.ts} +5 -7
  170. package/dist/questions.d.ts.map +1 -0
  171. package/dist/{chat/questions.js → questions.js} +11 -7
  172. package/dist/queue.d.ts +40 -0
  173. package/dist/queue.d.ts.map +1 -0
  174. package/dist/queue.js +450 -0
  175. package/dist/reach.d.ts +20 -7
  176. package/dist/reach.d.ts.map +1 -1
  177. package/dist/reach.js +353 -98
  178. package/dist/react.d.ts +23 -7
  179. package/dist/react.d.ts.map +1 -1
  180. package/dist/react.js +40 -18
  181. package/dist/{chat/read.d.ts → read.d.ts} +2 -0
  182. package/dist/read.d.ts.map +1 -0
  183. package/dist/{chat/read.js → read.js} +4 -0
  184. package/dist/readiness.d.ts +55 -0
  185. package/dist/readiness.d.ts.map +1 -0
  186. package/dist/readiness.js +25 -0
  187. package/dist/reads.d.ts +39 -0
  188. package/dist/reads.d.ts.map +1 -0
  189. package/dist/reads.js +178 -0
  190. package/dist/recovery.d.ts +28 -0
  191. package/dist/recovery.d.ts.map +1 -0
  192. package/dist/recovery.js +254 -0
  193. package/dist/refresh.d.ts +17 -14
  194. package/dist/refresh.d.ts.map +1 -1
  195. package/dist/refresh.js +145 -53
  196. package/dist/refusal.d.ts +5 -0
  197. package/dist/refusal.d.ts.map +1 -0
  198. package/dist/refusal.js +55 -0
  199. package/dist/replica.d.ts +50 -33
  200. package/dist/replica.d.ts.map +1 -1
  201. package/dist/replica.js +339 -162
  202. package/dist/retried.d.ts +30 -0
  203. package/dist/retried.d.ts.map +1 -0
  204. package/dist/retried.js +72 -0
  205. package/dist/room-draft.d.ts +39 -10
  206. package/dist/room-draft.d.ts.map +1 -1
  207. package/dist/room-draft.js +196 -120
  208. package/dist/room-drafts.d.ts +24 -0
  209. package/dist/room-drafts.d.ts.map +1 -0
  210. package/dist/room-drafts.js +217 -0
  211. package/dist/rows.d.ts +31 -37
  212. package/dist/rows.d.ts.map +1 -1
  213. package/dist/rows.js +60 -128
  214. package/dist/runtime.d.ts +34 -0
  215. package/dist/runtime.d.ts.map +1 -0
  216. package/dist/runtime.js +1 -0
  217. package/dist/save.d.ts +42 -43
  218. package/dist/save.d.ts.map +1 -1
  219. package/dist/save.js +800 -259
  220. package/dist/saves.d.ts +32 -0
  221. package/dist/saves.d.ts.map +1 -0
  222. package/dist/saves.js +410 -0
  223. package/dist/search.d.ts +15 -55
  224. package/dist/search.d.ts.map +1 -1
  225. package/dist/search.js +10 -121
  226. package/dist/seed.d.ts +25 -0
  227. package/dist/seed.d.ts.map +1 -0
  228. package/dist/seed.js +145 -0
  229. package/dist/shared.d.ts +10 -0
  230. package/dist/shared.d.ts.map +1 -0
  231. package/dist/shared.js +339 -0
  232. package/dist/shown.d.ts +33 -0
  233. package/dist/shown.d.ts.map +1 -0
  234. package/dist/shown.js +309 -0
  235. package/dist/socket/admission.d.ts +7 -0
  236. package/dist/socket/admission.d.ts.map +1 -0
  237. package/dist/socket/admission.js +39 -0
  238. package/dist/socket/answers.d.ts +6 -0
  239. package/dist/socket/answers.d.ts.map +1 -0
  240. package/dist/socket/answers.js +20 -0
  241. package/dist/socket/lanes.d.ts +28 -0
  242. package/dist/socket/lanes.d.ts.map +1 -0
  243. package/dist/socket/lanes.js +103 -0
  244. package/dist/socket/reads.d.ts +10 -0
  245. package/dist/socket/reads.d.ts.map +1 -0
  246. package/dist/socket/reads.js +31 -0
  247. package/dist/socket/session.d.ts +38 -0
  248. package/dist/socket/session.d.ts.map +1 -0
  249. package/dist/socket/session.js +23 -0
  250. package/dist/socket.d.ts +67 -0
  251. package/dist/socket.d.ts.map +1 -0
  252. package/dist/socket.js +164 -0
  253. package/dist/source.d.ts +54 -0
  254. package/dist/source.d.ts.map +1 -0
  255. package/dist/source.js +82 -0
  256. package/dist/status.d.ts +5 -2
  257. package/dist/status.d.ts.map +1 -1
  258. package/dist/status.js +3 -7
  259. package/dist/store/installs.d.ts +30 -0
  260. package/dist/store/installs.d.ts.map +1 -0
  261. package/dist/store/installs.js +40 -0
  262. package/dist/store/readiness.d.ts +11 -0
  263. package/dist/store/readiness.d.ts.map +1 -0
  264. package/dist/store/readiness.js +68 -0
  265. package/dist/store/records.d.ts +217 -0
  266. package/dist/store/records.d.ts.map +1 -0
  267. package/dist/store/records.js +464 -0
  268. package/dist/store/room-held.d.ts +8 -0
  269. package/dist/store/room-held.d.ts.map +1 -0
  270. package/dist/store/room-held.js +17 -0
  271. package/dist/store/rooms-shown.d.ts +8 -0
  272. package/dist/store/rooms-shown.d.ts.map +1 -0
  273. package/dist/store/rooms-shown.js +13 -0
  274. package/dist/store/space.d.ts +11 -0
  275. package/dist/store/space.d.ts.map +1 -0
  276. package/dist/store/space.js +41 -0
  277. package/dist/store/watchers.d.ts +17 -0
  278. package/dist/store/watchers.d.ts.map +1 -0
  279. package/dist/store/watchers.js +56 -0
  280. package/dist/store/writes.d.ts +24 -0
  281. package/dist/store/writes.d.ts.map +1 -0
  282. package/dist/store/writes.js +125 -0
  283. package/dist/store.d.ts +112 -117
  284. package/dist/store.d.ts.map +1 -1
  285. package/dist/store.js +165 -488
  286. package/dist/stored.d.ts +167 -0
  287. package/dist/stored.d.ts.map +1 -0
  288. package/dist/stored.js +703 -0
  289. package/dist/surface.d.ts +89 -0
  290. package/dist/surface.d.ts.map +1 -0
  291. package/dist/surface.js +222 -0
  292. package/dist/sync.d.ts +19 -0
  293. package/dist/sync.d.ts.map +1 -0
  294. package/dist/sync.js +535 -0
  295. package/dist/tables.d.ts +419 -0
  296. package/dist/tables.d.ts.map +1 -0
  297. package/dist/tables.js +758 -0
  298. package/dist/tallies.d.ts +18 -0
  299. package/dist/tallies.d.ts.map +1 -0
  300. package/dist/tallies.js +128 -0
  301. package/dist/transfer.d.ts +0 -5
  302. package/dist/transfer.d.ts.map +1 -1
  303. package/dist/turn.d.ts +9 -0
  304. package/dist/turn.d.ts.map +1 -0
  305. package/dist/turn.js +75 -0
  306. package/dist/validation.d.ts +29 -0
  307. package/dist/validation.d.ts.map +1 -0
  308. package/dist/validation.js +104 -0
  309. package/dist/windows.d.ts +11 -0
  310. package/dist/windows.d.ts.map +1 -0
  311. package/dist/windows.js +16 -0
  312. package/dist/wire.d.ts +221 -36
  313. package/dist/wire.d.ts.map +1 -1
  314. package/dist/wire.js +74 -33
  315. package/package.json +28 -24
  316. package/AGENTS.md +0 -318
  317. package/dist/attempt.d.ts +0 -16
  318. package/dist/attempt.d.ts.map +0 -1
  319. package/dist/attempt.js +0 -57
  320. package/dist/chat/acts.d.ts +0 -34
  321. package/dist/chat/acts.d.ts.map +0 -1
  322. package/dist/chat/acts.js +0 -36
  323. package/dist/chat/context.d.ts +0 -3
  324. package/dist/chat/context.d.ts.map +0 -1
  325. package/dist/chat/input.d.ts +0 -9
  326. package/dist/chat/input.d.ts.map +0 -1
  327. package/dist/chat/input.js +0 -99
  328. package/dist/chat/kit.d.ts +0 -60
  329. package/dist/chat/kit.d.ts.map +0 -1
  330. package/dist/chat/kit.js +0 -123
  331. package/dist/chat/lasting.d.ts +0 -6
  332. package/dist/chat/lasting.d.ts.map +0 -1
  333. package/dist/chat/lasting.js +0 -19
  334. package/dist/chat/list.d.ts +0 -20
  335. package/dist/chat/list.d.ts.map +0 -1
  336. package/dist/chat/list.js +0 -59
  337. package/dist/chat/markdown.d.ts +0 -19
  338. package/dist/chat/markdown.d.ts.map +0 -1
  339. package/dist/chat/markdown.js +0 -187
  340. package/dist/chat/message.d.ts +0 -6
  341. package/dist/chat/message.d.ts.map +0 -1
  342. package/dist/chat/message.js +0 -192
  343. package/dist/chat/messages.d.ts +0 -21
  344. package/dist/chat/messages.d.ts.map +0 -1
  345. package/dist/chat/messages.js +0 -151
  346. package/dist/chat/name.d.ts +0 -6
  347. package/dist/chat/name.d.ts.map +0 -1
  348. package/dist/chat/name.js +0 -37
  349. package/dist/chat/opened.d.ts +0 -11
  350. package/dist/chat/opened.d.ts.map +0 -1
  351. package/dist/chat/opened.js +0 -17
  352. package/dist/chat/overlay.d.ts +0 -31
  353. package/dist/chat/overlay.d.ts.map +0 -1
  354. package/dist/chat/overlay.js +0 -97
  355. package/dist/chat/parts.d.ts +0 -57
  356. package/dist/chat/parts.d.ts.map +0 -1
  357. package/dist/chat/parts.js +0 -119
  358. package/dist/chat/process.d.ts +0 -20
  359. package/dist/chat/process.d.ts.map +0 -1
  360. package/dist/chat/process.js +0 -32
  361. package/dist/chat/provider.d.ts +0 -63
  362. package/dist/chat/provider.d.ts.map +0 -1
  363. package/dist/chat/provider.js +0 -645
  364. package/dist/chat/question.d.ts +0 -9
  365. package/dist/chat/question.d.ts.map +0 -1
  366. package/dist/chat/question.js +0 -80
  367. package/dist/chat/questions.d.ts.map +0 -1
  368. package/dist/chat/read.d.ts.map +0 -1
  369. package/dist/chat/ready.d.ts +0 -33
  370. package/dist/chat/ready.d.ts.map +0 -1
  371. package/dist/chat/ready.js +0 -91
  372. package/dist/chat/style.d.ts +0 -4
  373. package/dist/chat/style.d.ts.map +0 -1
  374. package/dist/chat/style.js +0 -302
  375. package/dist/chat.d.ts +0 -14
  376. package/dist/chat.d.ts.map +0 -1
  377. package/dist/chat.js +0 -8
  378. package/dist/log.d.ts +0 -5
  379. package/dist/log.d.ts.map +0 -1
  380. package/dist/log.js +0 -14
  381. package/dist/read-side.d.ts +0 -18
  382. package/dist/read-side.d.ts.map +0 -1
  383. package/dist/read-side.js +0 -440
package/dist/outcome.js CHANGED
@@ -1,9 +1,59 @@
1
+ import { MEDIA_TYPES } from '@agentshouse/mdmodel';
2
+ import { refusalError } from './failure.js';
3
+ export const UNREADABLE = {
4
+ kind: 'unreadable',
5
+ code: 'room-not-readable',
6
+ fields: {},
7
+ retryable: false,
8
+ };
9
+ export const LOCKED_UNREADABLE = {
10
+ kind: 'unreadable',
11
+ code: 'room-locked',
12
+ fields: {},
13
+ retryable: true,
14
+ };
15
+ export const ABSENT_TARGET = {
16
+ kind: 'absent',
17
+ code: 'reference-absent',
18
+ fields: {},
19
+ retryable: false,
20
+ };
1
21
  export function absentBinary(path) {
2
22
  return { kind: 'absent', code: 'binary-file-absent', fields: { path }, retryable: false };
3
23
  }
24
+ export function declaredType(blob) {
25
+ return blob.type === '' ? MEDIA_TYPES.octetStream : blob.type;
26
+ }
27
+ export function blobOf(binary) {
28
+ return new Response(binary.stream, { headers: { 'content-type': binary.mediaType } }).blob();
29
+ }
4
30
  export function binaryAnswer(result) {
5
31
  return result.kind === 'binary' || result.kind === 'rejected' ? result : failure(result);
6
32
  }
33
+ export function binaryLinkAnswer(result, held) {
34
+ if (result.kind === 'link') {
35
+ return {
36
+ kind: 'link',
37
+ url: result.url,
38
+ name: result.name,
39
+ mediaType: result.mediaType ?? held ?? MEDIA_TYPES.octetStream,
40
+ };
41
+ }
42
+ return result.kind === 'rejected' ? result : failure(result);
43
+ }
44
+ export function attachAnswer(result) {
45
+ if (result.kind === 'attached')
46
+ return { kind: 'attached', path: result.path };
47
+ return result.kind === 'rejected' ? result : failure(result);
48
+ }
49
+ export const ROOM_LOCKED = 'room-locked';
50
+ export function lockedRoom(locator) {
51
+ return { kind: ROOM_LOCKED, locator, code: ROOM_LOCKED, fields: {}, retryable: true };
52
+ }
53
+ export const OFFLINE = { kind: 'offline' };
54
+ export function answeredResult(value) {
55
+ return typeof value === 'object' && value !== null && !('pending' in value);
56
+ }
7
57
  export const UNCERTAIN = {
8
58
  kind: 'transport-uncertainty',
9
59
  code: 'transport-uncertainty',
@@ -39,3 +89,17 @@ export function historyAnswer(result) {
39
89
  ? result
40
90
  : failure(result);
41
91
  }
92
+ export const UNANSWERED = { kind: 'transport-uncertainty' };
93
+ export function handedOutcome(retries, attempt, result) {
94
+ if (attempt !== undefined) {
95
+ const { step, instance } = attempt;
96
+ if (result.kind === 'action')
97
+ retries.succeeded(step, instance);
98
+ else if (result.kind === 'transport-uncertainty')
99
+ retries.uncertain(step, instance, result);
100
+ else if (result.kind === 'rejected' && result.retryable) {
101
+ retries.failed(step, instance, refusalError(result));
102
+ }
103
+ }
104
+ return calledResult(result);
105
+ }
package/dist/overlay.d.ts CHANGED
@@ -1,7 +1,11 @@
1
+ import { type ApplyResult } from '@agentshouse/mdmodel';
1
2
  import type { BinaryFile, HeadChange } from './adapter.js';
3
+ import { type Composition } from './collection.js';
2
4
  import type { ChangeBatch } from './change.js';
3
5
  export type Heads = {
4
6
  revisions: Readonly<Record<string, string>>;
7
+ fileIds: Readonly<Record<string, string>>;
8
+ created: Readonly<Record<string, string>>;
5
9
  changes: Readonly<Record<string, HeadChange>>;
6
10
  };
7
11
  export type HeldBinary = ({
@@ -17,10 +21,10 @@ export type Layer = Heads & {
17
21
  documents: Readonly<Record<string, string>>;
18
22
  binaries: Readonly<Record<string, HeldBinary>>;
19
23
  };
20
- export declare function acceptedBinaries(files: Readonly<Record<string, BinaryFile>>): Record<string, HeldBinary>;
24
+ export declare function acceptedBinaries(files: Readonly<Record<string, BinaryFile>>): Generator<readonly [string, HeldBinary]>;
21
25
  export declare function sameBinary(left: HeldBinary | undefined, right: HeldBinary | undefined): boolean;
22
26
  export declare function sameChange(left: HeadChange | undefined, right: HeadChange | undefined): boolean;
23
- export declare function overlay(base: Layer, queue: readonly ChangeBatch[], unapplied?: () => void): Layer;
24
- export declare function sameLayerText(left: Layer, right: Layer): boolean;
25
- export declare function overlayChanged(base: Layer, queue: readonly ChangeBatch[], previousBase: Layer, previousQueue: readonly ChangeBatch[], previousVisible: Layer): Layer;
27
+ export declare function composed(path: string, fields: Readonly<Record<string, unknown>>, sections: Readonly<Record<string, string>>, composition: Composition): ApplyResult;
28
+ export declare function compose(path: string, fields: Readonly<Record<string, unknown>>, sections: Readonly<Record<string, string>>, composition: Composition): string;
29
+ export declare function overlaying(base: Layer, queue: readonly ChangeBatch[], composition: Composition, unapplied?: () => void): Generator<number, Layer, void>;
26
30
  //# sourceMappingURL=overlay.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../src/overlay.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAU,WAAW,EAAgB,MAAM,aAAa,CAAC;AAErE,MAAM,MAAM,KAAK,GAAG;IAClB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,UAAU,GAClB,CAAC;IAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GAAG,UAAU,CAAC,GAC7C;IACE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEN,MAAM,MAAM,KAAK,GAAG,KAAK,GAAG;IAC1B,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;CAChD,CAAC;AAEF,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,GAC1C,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAI5B;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,EAAE,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAW/F;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,EAAE,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAQ/F;AAoKD,wBAAgB,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,KAAK,CAmBjG;AAQD,wBAAgB,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAOhE;AAiCD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,KAAK,EACX,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,YAAY,EAAE,KAAK,EACnB,aAAa,EAAE,SAAS,WAAW,EAAE,EACrC,eAAe,EAAE,KAAK,GACrB,KAAK,CAyFP"}
1
+ {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../src/overlay.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,WAAW,EAEjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,KAAK,EAAU,WAAW,EAAgB,MAAM,aAAa,CAAC;AAIrE,MAAM,MAAM,KAAK,GAAG;IAClB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1C,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1C,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,UAAU,GAClB,CAAC;IAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GAAG,UAAU,CAAC,GAC7C;IACE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEN,MAAM,MAAM,KAAK,GAAG,KAAK,GAAG;IAC1B,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;CAChD,CAAC;AAEF,wBAAiB,gBAAgB,CAC/B,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,GAC1C,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAE1C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,EAAE,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAW/F;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,EAAE,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAQ/F;AAqDD,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACzC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC1C,WAAW,EAAE,WAAW,GACvB,WAAW,CAqBb;AAED,wBAAgB,OAAO,CACrB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACzC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC1C,WAAW,EAAE,WAAW,GACvB,MAAM,CAIR;AA8ID,wBAAiB,UAAU,CACzB,IAAI,EAAE,KAAK,EACX,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,WAAW,EAAE,WAAW,EACxB,SAAS,CAAC,EAAE,MAAM,IAAI,GACrB,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAsChC"}
package/dist/overlay.js CHANGED
@@ -1,6 +1,10 @@
1
- import { apply, parse, serialize } from '@agentshouse/mdmodel';
2
- export function acceptedBinaries(files) {
3
- return Object.fromEntries(Object.entries(files).map(([path, file]) => [path, { state: 'accepted', ...file }]));
1
+ import { apply, create, frontmatterValue, parse, serialize, TYPE_FIELD, } from '@agentshouse/mdmodel';
2
+ import { definitionsAt } from './collection.js';
3
+ import { drafted, entriesIn, settling } from './shared.js';
4
+ import { ROW_WEIGHT } from './turn.js';
5
+ export function* acceptedBinaries(files) {
6
+ for (const [path, file] of entriesIn(files))
7
+ yield [path, { state: 'accepted', ...file }];
4
8
  }
5
9
  export function sameBinary(left, right) {
6
10
  if (left === undefined || right === undefined)
@@ -10,7 +14,7 @@ export function sameBinary(left, right) {
10
14
  left.mediaType === right.mediaType &&
11
15
  left.sha256 === right.sha256 &&
12
16
  (left.state === 'accepted'
13
- ? right.state === 'accepted' && left.fileRef === right.fileRef
17
+ ? right.state === 'accepted'
14
18
  : right.state === 'pending' && left.localId === right.localId));
15
19
  }
16
20
  export function sameChange(left, right) {
@@ -21,11 +25,13 @@ export function sameChange(left, right) {
21
25
  left.author?.id === right.author?.id &&
22
26
  left.author?.name === right.author?.name);
23
27
  }
24
- const EMPTY_FRONTMATTER = '---\n---\n';
28
+ function isPart(change) {
29
+ return change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble';
30
+ }
25
31
  function at(path, name) {
26
32
  return `${path} ${name}`;
27
33
  }
28
- function priorsOf(preconditions) {
34
+ function* priorsOf(preconditions) {
29
35
  const fields = new Map();
30
36
  const sections = new Map();
31
37
  const preambles = new Map();
@@ -39,6 +45,7 @@ function priorsOf(preconditions) {
39
45
  if (precondition.kind === 'preamble') {
40
46
  preambles.set(precondition.path, precondition.value);
41
47
  }
48
+ yield ROW_WEIGHT;
42
49
  }
43
50
  return {
44
51
  field: (path, name) => fields.get(at(path, name)),
@@ -46,59 +53,71 @@ function priorsOf(preconditions) {
46
53
  preamble: (path) => preambles.get(path) ?? '',
47
54
  };
48
55
  }
49
- function compose(fields, sections) {
50
- const body = Object.entries(sections)
51
- .map(([name, value]) => `\n## ${name}\n${value}`)
52
- .join('');
53
- const skeleton = `${EMPTY_FRONTMATTER}${body}`;
54
- const opened = parse(skeleton);
55
- if (!opened.ok)
56
- return skeleton;
57
- let document = opened.document;
58
- for (const [name, value] of Object.entries(fields)) {
59
- const next = apply(document, { kind: 'field', name, value, prior: undefined });
60
- if (next.outcome === 'applied')
61
- document = next.document;
62
- }
63
- return serialize(document);
56
+ export function composed(path, fields, sections, composition) {
57
+ const declared = fields[TYPE_FIELD];
58
+ const type = typeof declared === 'string' && declared !== '' ? declared : undefined;
59
+ const definition = definitionsAt(composition, path)(type);
60
+ return apply(create(type, definition), [
61
+ ...Object.entries(fields).flatMap(([name, value]) => (name !== TYPE_FIELD || type === undefined) && frontmatterValue(value)
62
+ ? [{ kind: 'field', name, value, prior: undefined }]
63
+ : []),
64
+ ...Object.entries(sections).map(([name, value]) => ({
65
+ kind: 'section',
66
+ name,
67
+ value,
68
+ prior: undefined,
69
+ })),
70
+ ], definition);
64
71
  }
65
- function edited(document, change, priors) {
66
- if (change.kind === 'field') {
67
- return apply(document, {
72
+ export function compose(path, fields, sections, composition) {
73
+ const next = composed(path, fields, sections, composition);
74
+ if (next.outcome !== 'applied')
75
+ throw new Error(`the creation of ${path} writes no document`);
76
+ return serialize(next.document);
77
+ }
78
+ function edited(change, priors) {
79
+ if (change.kind === 'field')
80
+ return {
68
81
  kind: 'field',
69
82
  name: change.name,
70
83
  value: change.value,
71
84
  prior: priors.field(change.path, change.name),
72
- });
73
- }
74
- if (change.kind === 'preamble') {
75
- return apply(document, {
76
- kind: 'preamble',
77
- value: change.value,
78
- prior: priors.preamble(change.path),
79
- });
80
- }
81
- if (change.kind !== 'section')
82
- return null;
83
- return apply(document, {
85
+ };
86
+ if (change.kind === 'preamble')
87
+ return { kind: 'preamble', value: change.value, prior: priors.preamble(change.path) };
88
+ return {
84
89
  kind: 'section',
85
90
  name: change.name,
86
91
  value: change.value,
87
92
  prior: priors.section(change.path, change.name),
88
- });
93
+ };
89
94
  }
90
- function edit(staged, change, priors) {
91
- const text = staged.documents[change.path];
95
+ function edit(staged, changes, priors, composition) {
96
+ const path = changes[0].path;
97
+ delete staged.revisions[path];
98
+ const text = staged.documents[path];
92
99
  if (text === undefined)
93
- return false;
94
- const parsed = parse(text, change.path);
100
+ return changes.length;
101
+ const definitions = definitionsAt(composition, path);
102
+ const parsed = parse(text, path, definitions);
95
103
  if (!parsed.ok)
96
- return false;
97
- const next = edited(parsed.document, change, priors);
98
- if (next?.outcome !== 'applied')
99
- return false;
100
- staged.documents[change.path] = serialize(next.document);
101
- return true;
104
+ return changes.length;
105
+ const definition = definitions(parsed.document.type);
106
+ const wanted = changes.map((change) => edited(change, priors));
107
+ const first = apply(parsed.document, wanted, definition);
108
+ if (first.outcome === 'refuse')
109
+ return changes.length;
110
+ if (first.outcome === 'applied') {
111
+ staged.documents[path] = serialize(first.document);
112
+ return 0;
113
+ }
114
+ const stale = new Set(first.stale);
115
+ const kept = wanted.filter((_, at) => !stale.has(at));
116
+ const rest = apply(parsed.document, kept, definition);
117
+ if (rest.outcome !== 'applied')
118
+ return changes.length;
119
+ staged.documents[path] = serialize(rest.document);
120
+ return first.stale.length;
102
121
  }
103
122
  function relocate(staged, from, to) {
104
123
  const text = staged.documents[from];
@@ -118,32 +137,46 @@ function relocate(staged, from, to) {
118
137
  }
119
138
  function moveHead(heads, from, to) {
120
139
  const revision = heads.revisions[from];
140
+ const fileId = heads.fileIds[from];
141
+ const created = heads.created[from];
121
142
  const change = heads.changes[from];
122
143
  delete heads.revisions[from];
144
+ delete heads.fileIds[from];
145
+ delete heads.created[from];
123
146
  delete heads.changes[from];
147
+ delete heads.fileIds[to];
148
+ delete heads.created[to];
124
149
  delete heads.changes[to];
125
150
  if (revision !== undefined)
126
151
  heads.revisions[to] = revision;
152
+ if (fileId !== undefined)
153
+ heads.fileIds[to] = fileId;
154
+ if (created !== undefined)
155
+ heads.created[to] = created;
127
156
  if (change !== undefined)
128
157
  heads.changes[to] = change;
129
158
  }
130
159
  function erase(staged, path) {
131
160
  delete staged.documents[path];
132
161
  delete staged.revisions[path];
162
+ delete staged.fileIds[path];
163
+ delete staged.created[path];
133
164
  delete staged.changes[path];
134
165
  delete staged.binaries[path];
135
166
  }
136
- function stage(staged, change, priors) {
137
- if (change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble') {
138
- return edit(staged, change, priors);
139
- }
167
+ function stage(staged, change, composition) {
140
168
  if (change.kind === 'create') {
141
169
  staged.documents[change.path] =
142
- 'content' in change ? change.content : compose(change.fields, change.sections);
170
+ 'content' in change
171
+ ? change.content
172
+ : compose(change.path, change.fields, change.sections, composition);
173
+ delete staged.fileIds[change.path];
174
+ delete staged.created[change.path];
143
175
  delete staged.changes[change.path];
144
176
  return true;
145
177
  }
146
178
  if (change.kind === 'replace') {
179
+ delete staged.revisions[change.path];
147
180
  if (staged.documents[change.path] === undefined)
148
181
  return false;
149
182
  staged.documents[change.path] = change.content;
@@ -166,156 +199,67 @@ function stage(staged, change, priors) {
166
199
  if (change.kind === 'move') {
167
200
  return relocate(staged, change.path, change.to);
168
201
  }
202
+ if (change.kind === 'arrival') {
203
+ erase(staged, change.path);
204
+ if ('content' in change)
205
+ staged.documents[change.path] = change.content;
206
+ else
207
+ staged.binaries[change.path] = { state: 'accepted', ...change.binary };
208
+ arrive(staged, change);
209
+ return true;
210
+ }
169
211
  erase(staged, change.path);
170
212
  return true;
171
213
  }
172
- export function overlay(base, queue, unapplied) {
214
+ function arrive(heads, change) {
215
+ if (change.revision !== undefined)
216
+ heads.revisions[change.path] = change.revision;
217
+ if (change.fileId !== undefined)
218
+ heads.fileIds[change.path] = change.fileId;
219
+ if (change.created !== undefined)
220
+ heads.created[change.path] = change.created;
221
+ if (change.change !== undefined)
222
+ heads.changes[change.path] = change.change;
223
+ }
224
+ export function* overlaying(base, queue, composition, unapplied) {
173
225
  const staged = {
174
- documents: { ...base.documents },
175
- binaries: { ...base.binaries },
176
- revisions: { ...base.revisions },
177
- changes: { ...base.changes },
226
+ documents: drafted(base.documents),
227
+ binaries: drafted(base.binaries),
228
+ revisions: drafted(base.revisions),
229
+ fileIds: drafted(base.fileIds),
230
+ created: drafted(base.created),
231
+ changes: drafted(base.changes),
178
232
  };
179
233
  for (const batch of queue) {
180
- const priors = priorsOf(batch.preconditions);
181
- for (const change of batch.changes) {
182
- if (!stage(staged, change, priors))
183
- unapplied?.();
184
- }
185
- }
186
- return {
187
- documents: staged.documents,
188
- binaries: staged.binaries,
189
- revisions: staged.revisions,
190
- changes: staged.changes,
191
- };
192
- }
193
- function pathsOf(batch) {
194
- return batch.changes.flatMap((change) => change.kind === 'move' ? [change.path, change.to] : [change.path]);
195
- }
196
- export function sameLayerText(left, right) {
197
- const paths = Object.keys(left.documents);
198
- return (paths.length === Object.keys(right.documents).length &&
199
- paths.every((path) => left.documents[path] === right.documents[path]) &&
200
- sameBinaries(left.binaries, right.binaries));
201
- }
202
- function sameBinaries(left, right) {
203
- const paths = Object.keys(left);
204
- return (paths.length === Object.keys(right).length &&
205
- paths.every((path) => sameBinary(left[path], right[path])));
206
- }
207
- function replayHeads(base, queue) {
208
- const heads = { revisions: { ...base.revisions }, changes: { ...base.changes } };
209
- for (const batch of queue) {
210
- for (const change of batch.changes) {
211
- if (change.kind === 'remove') {
212
- delete heads.revisions[change.path];
213
- delete heads.changes[change.path];
214
- }
215
- else if (change.kind === 'create') {
216
- delete heads.changes[change.path];
217
- }
218
- else if (change.kind === 'binary') {
219
- delete heads.revisions[change.path];
220
- delete heads.changes[change.path];
221
- }
222
- else if (change.kind === 'move') {
223
- moveHead(heads, change.path, change.to);
224
- }
225
- }
226
- }
227
- return heads;
228
- }
229
- export function overlayChanged(base, queue, previousBase, previousQueue, previousVisible) {
230
- const before = previousQueue.map((batch) => JSON.stringify(batch));
231
- const after = queue.map((batch) => JSON.stringify(batch));
232
- if (before.length === after.length &&
233
- before.every((id, index) => id === after[index]) &&
234
- sameLayerText(base, previousBase)) {
235
- return {
236
- documents: previousVisible.documents,
237
- binaries: previousVisible.binaries,
238
- ...replayHeads(base, queue),
239
- };
240
- }
241
- const affected = new Set();
242
- const paths = new Set([
243
- ...Object.keys(base.documents),
244
- ...Object.keys(previousBase.documents),
245
- ...Object.keys(base.revisions),
246
- ...Object.keys(previousBase.revisions),
247
- ...Object.keys(base.changes),
248
- ...Object.keys(previousBase.changes),
249
- ...Object.keys(base.binaries),
250
- ...Object.keys(previousBase.binaries),
251
- ]);
252
- for (const path of paths) {
253
- if (base.documents[path] !== previousBase.documents[path] ||
254
- base.revisions[path] !== previousBase.revisions[path] ||
255
- !sameChange(base.changes[path], previousBase.changes[path]) ||
256
- !sameBinary(base.binaries[path], previousBase.binaries[path]))
257
- affected.add(path);
258
- }
259
- const oldIds = new Set(before);
260
- const newIds = new Set(after);
261
- for (const batch of previousQueue) {
262
- if (!newIds.has(JSON.stringify(batch)))
263
- for (const path of pathsOf(batch))
264
- affected.add(path);
265
- }
266
- for (const batch of queue) {
267
- if (!oldIds.has(JSON.stringify(batch)))
268
- for (const path of pathsOf(batch))
269
- affected.add(path);
270
- }
271
- let expanded = true;
272
- while (expanded) {
273
- expanded = false;
274
- for (const batch of queue) {
275
- const touched = pathsOf(batch);
276
- if (!touched.some((path) => affected.has(path)))
234
+ const priors = yield* priorsOf(batch.preconditions);
235
+ for (let index = 0; index < batch.changes.length; index += 1) {
236
+ const change = batch.changes[index];
237
+ if (!isPart(change)) {
238
+ if (!stage(staged, change, composition))
239
+ unapplied?.();
240
+ yield ROW_WEIGHT;
277
241
  continue;
278
- for (const path of touched) {
279
- if (affected.has(path))
280
- continue;
281
- affected.add(path);
282
- expanded = true;
283
242
  }
243
+ const run = [change];
244
+ while (index + 1 < batch.changes.length) {
245
+ const next = batch.changes[index + 1];
246
+ if (!isPart(next) || next.path !== change.path)
247
+ break;
248
+ run.push(next);
249
+ index += 1;
250
+ }
251
+ const text = staged.documents[change.path] ?? '';
252
+ for (let left = edit(staged, run, priors, composition); left > 0; left -= 1)
253
+ unapplied?.();
254
+ yield ROW_WEIGHT + text.length;
284
255
  }
285
256
  }
286
- const documents = {};
287
- const revisions = {};
288
- const changes = {};
289
- const binaries = {};
290
- for (const path of affected) {
291
- if (base.documents[path] !== undefined)
292
- documents[path] = base.documents[path];
293
- if (base.revisions[path] !== undefined)
294
- revisions[path] = base.revisions[path];
295
- if (base.changes[path] !== undefined)
296
- changes[path] = base.changes[path];
297
- if (base.binaries[path] !== undefined)
298
- binaries[path] = base.binaries[path];
299
- }
300
- const staged = overlay({ documents, revisions, changes, binaries }, queue.filter((batch) => pathsOf(batch).some((path) => affected.has(path))));
301
- const mergedDocuments = { ...previousVisible.documents };
302
- const mergedRevisions = { ...previousVisible.revisions };
303
- const mergedChanges = { ...previousVisible.changes };
304
- const mergedBinaries = { ...previousVisible.binaries };
305
- for (const path of affected) {
306
- delete mergedDocuments[path];
307
- delete mergedRevisions[path];
308
- delete mergedChanges[path];
309
- delete mergedBinaries[path];
310
- }
311
- Object.assign(mergedDocuments, staged.documents);
312
- Object.assign(mergedRevisions, staged.revisions);
313
- Object.assign(mergedChanges, staged.changes);
314
- Object.assign(mergedBinaries, staged.binaries);
315
257
  return {
316
- documents: mergedDocuments,
317
- revisions: mergedRevisions,
318
- changes: mergedChanges,
319
- binaries: mergedBinaries,
258
+ documents: yield* settling(staged.documents),
259
+ binaries: yield* settling(staged.binaries),
260
+ revisions: yield* settling(staged.revisions),
261
+ fileIds: yield* settling(staged.fileIds),
262
+ created: yield* settling(staged.created),
263
+ changes: yield* settling(staged.changes),
320
264
  };
321
265
  }
@@ -0,0 +1,8 @@
1
+ export declare const PAGE_METADATA_WORDS: {
2
+ readonly heading: 'Page metadata';
3
+ readonly app: 'App';
4
+ readonly address: 'Address';
5
+ readonly queries: 'Local Queries';
6
+ };
7
+ export declare function pageMetadataBlock(app: string, address: string, queries: readonly unknown[]): string;
8
+ //# sourceMappingURL=page-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-metadata.d.ts","sourceRoot":"","sources":["../src/page-metadata.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB;aAC9B,OAAO,EAAE,eAAe;aACxB,GAAG,EAAE,KAAK;aACV,OAAO,EAAE,SAAS;aAClB,OAAO,EAAE,eAAe;CAChB,CAAC;AAIX,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,SAAS,OAAO,EAAE,GAC1B,MAAM,CAUR"}
@@ -0,0 +1,19 @@
1
+ import { queryKey } from '@agentshouse/mdmodel';
2
+ export const PAGE_METADATA_WORDS = {
3
+ heading: 'Page metadata',
4
+ app: 'App',
5
+ address: 'Address',
6
+ queries: 'Local Queries',
7
+ };
8
+ const PAGE_METADATA_QUERIES = 10;
9
+ export function pageMetadataBlock(app, address, queries) {
10
+ const held = [...new Set(queries.map(queryKey))];
11
+ return [
12
+ PAGE_METADATA_WORDS.heading,
13
+ `${PAGE_METADATA_WORDS.app}: ${app}`,
14
+ `${PAGE_METADATA_WORDS.address}: ${address}`,
15
+ ...(held.length === 0 || held.length > PAGE_METADATA_QUERIES
16
+ ? []
17
+ : [`${PAGE_METADATA_WORDS.queries}:`, ...held]),
18
+ ].join('\n');
19
+ }
@@ -0,0 +1,4 @@
1
+ import { type Part } from '@agentshouse/session-content';
2
+ export declare function currentStep(parts: readonly Part[]): string | null;
3
+ export declare function runningLine(parts: readonly Part[]): string | null;
4
+ //# sourceMappingURL=parts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parts.d.ts","sourceRoot":"","sources":["../src/parts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,IAAI,EAAE,MAAM,8BAA8B,CAAC;AAGhE,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,MAAM,GAAG,IAAI,CAGjE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,MAAM,GAAG,IAAI,CAKjE"}
package/dist/parts.js ADDED
@@ -0,0 +1,13 @@
1
+ import { isOwn } from '@agentshouse/session-content';
2
+ import { excerpt } from './read.js';
3
+ export function currentStep(parts) {
4
+ const call = [...parts].reverse().find((part) => part.type === 'call');
5
+ return call?.type === 'call' && call.line !== '' ? call.line : null;
6
+ }
7
+ export function runningLine(parts) {
8
+ const own = parts.filter(isOwn);
9
+ const note = [...own].reverse().find((part) => part.type === 'text' && part.text.trim() !== '');
10
+ if (note?.type === 'text')
11
+ return excerpt(note.text);
12
+ return currentStep(own);
13
+ }
package/dist/paths.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  export declare function normalize(path: string): string | null;
2
2
  export declare function beneath(prefix: string, path: string): boolean;
3
3
  export declare function covered(prefixes: readonly string[], path: string): boolean;
4
+ export declare function authoredAt(patterns: readonly string[], path: string): boolean;
5
+ export declare function ancestors(path: string): readonly string[];
4
6
  //# sourceMappingURL=paths.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYrD;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAK1E"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAEA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYrD;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAK1E;AAwBD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7E;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAGzD"}
package/dist/paths.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { isDocumentPath } from '@agentshouse/mdmodel';
1
2
  export function normalize(path) {
2
3
  const parts = [];
3
4
  for (const part of path.split('/')) {
@@ -22,3 +23,28 @@ export function covered(prefixes, path) {
22
23
  return normalized !== null && (normalized === '' || beneath(normalized, path));
23
24
  });
24
25
  }
26
+ function named(pattern, name) {
27
+ const star = pattern.indexOf('*');
28
+ if (star === -1)
29
+ return pattern === name;
30
+ const before = pattern.slice(0, star);
31
+ const after = pattern.slice(star + 1);
32
+ return (name.length > before.length + after.length && name.startsWith(before) && name.endsWith(after));
33
+ }
34
+ function matched(pattern, path) {
35
+ if (pattern === '/')
36
+ return isDocumentPath(path);
37
+ const wanted = pattern.split('/');
38
+ const names = path.split('/');
39
+ const open = wanted.at(-1) === '**';
40
+ const fixed = open ? wanted.slice(0, -1) : wanted;
41
+ return ((open ? names.length > fixed.length : names.length === fixed.length) &&
42
+ fixed.every((one, at) => named(one, names[at])));
43
+ }
44
+ export function authoredAt(patterns, path) {
45
+ return patterns.some((pattern) => matched(pattern, path));
46
+ }
47
+ export function ancestors(path) {
48
+ const parts = path.split('/');
49
+ return parts.slice(1).map((_, at) => parts.slice(0, at + 1).join('/'));
50
+ }