@agentshouse/mdruntime 0.1.0-c698c0ebd65bd → 0.1.0-c6b1e70f2da66

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 (370) hide show
  1. package/README.md +19 -16
  2. package/dist/acceptance.d.ts +6 -0
  3. package/dist/acceptance.d.ts.map +1 -0
  4. package/dist/acceptance.js +387 -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 +155 -86
  9. package/dist/adapter.d.ts.map +1 -1
  10. package/dist/attached-model.d.ts +7 -10
  11. package/dist/attached-model.d.ts.map +1 -1
  12. package/dist/attached-model.js +40 -41
  13. package/dist/binary.d.ts +0 -5
  14. package/dist/binary.d.ts.map +1 -1
  15. package/dist/binary.js +1 -1
  16. package/dist/bootstrap.d.ts +31 -11
  17. package/dist/bootstrap.d.ts.map +1 -1
  18. package/dist/bootstrap.js +324 -93
  19. package/dist/cell.d.ts +6 -0
  20. package/dist/cell.d.ts.map +1 -0
  21. package/dist/cell.js +9 -0
  22. package/dist/chain.d.ts +12 -0
  23. package/dist/chain.d.ts.map +1 -0
  24. package/dist/chain.js +64 -0
  25. package/dist/change-set.d.ts +9 -14
  26. package/dist/change-set.d.ts.map +1 -1
  27. package/dist/change-set.js +11 -63
  28. package/dist/change.d.ts +32 -1
  29. package/dist/change.d.ts.map +1 -1
  30. package/dist/change.js +14 -3
  31. package/dist/chat-types.d.ts +5 -0
  32. package/dist/chat-types.d.ts.map +1 -0
  33. package/dist/chat-types.js +13 -0
  34. package/dist/client.d.ts +45 -16
  35. package/dist/client.d.ts.map +1 -1
  36. package/dist/client.js +104 -13
  37. package/dist/collection.d.ts +31 -9
  38. package/dist/collection.d.ts.map +1 -1
  39. package/dist/collection.js +49 -80
  40. package/dist/compile.d.ts +16 -0
  41. package/dist/compile.d.ts.map +1 -0
  42. package/dist/compile.js +711 -0
  43. package/dist/connection.d.ts +8 -117
  44. package/dist/connection.d.ts.map +1 -1
  45. package/dist/connection.js +106 -2486
  46. package/dist/context.d.ts +2 -0
  47. package/dist/context.d.ts.map +1 -0
  48. package/dist/{chat/context.js → context.js} +1 -4
  49. package/dist/conversation-live.d.ts +135 -0
  50. package/dist/conversation-live.d.ts.map +1 -0
  51. package/dist/conversation-live.js +247 -0
  52. package/dist/conversation-row.d.ts +33 -0
  53. package/dist/conversation-row.d.ts.map +1 -0
  54. package/dist/conversation-row.js +53 -0
  55. package/dist/conversation.d.ts +55 -42
  56. package/dist/conversation.d.ts.map +1 -1
  57. package/dist/conversation.js +985 -649
  58. package/dist/digest.d.ts +7 -0
  59. package/dist/digest.d.ts.map +1 -0
  60. package/dist/digest.js +113 -0
  61. package/dist/discovery.d.ts +10 -0
  62. package/dist/discovery.d.ts.map +1 -0
  63. package/dist/discovery.js +175 -0
  64. package/dist/durability.d.ts +19 -1
  65. package/dist/durability.d.ts.map +1 -1
  66. package/dist/durability.js +5 -0
  67. package/dist/entry.d.ts +7 -4
  68. package/dist/entry.d.ts.map +1 -1
  69. package/dist/entry.js +33 -28
  70. package/dist/expectation.d.ts +4 -2
  71. package/dist/expectation.d.ts.map +1 -1
  72. package/dist/expectation.js +33 -11
  73. package/dist/failure.d.ts +1 -0
  74. package/dist/failure.d.ts.map +1 -1
  75. package/dist/failure.js +3 -0
  76. package/dist/figures.d.ts +49 -0
  77. package/dist/figures.d.ts.map +1 -0
  78. package/dist/figures.js +197 -0
  79. package/dist/file.d.ts +2 -19
  80. package/dist/file.d.ts.map +1 -1
  81. package/dist/file.js +7 -122
  82. package/dist/holdings.d.ts +29 -0
  83. package/dist/holdings.d.ts.map +1 -0
  84. package/dist/holdings.js +95 -0
  85. package/dist/host.d.ts +11 -3
  86. package/dist/host.d.ts.map +1 -1
  87. package/dist/host.js +127 -20
  88. package/dist/index.d.ts +35 -11
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +13 -0
  91. package/dist/install.d.ts +56 -0
  92. package/dist/install.d.ts.map +1 -0
  93. package/dist/install.js +556 -0
  94. package/dist/job.d.ts +5 -0
  95. package/dist/job.d.ts.map +1 -0
  96. package/dist/job.js +7 -0
  97. package/dist/lifecycle.d.ts +7 -0
  98. package/dist/lifecycle.d.ts.map +1 -0
  99. package/dist/lifecycle.js +270 -0
  100. package/dist/listing.d.ts +53 -0
  101. package/dist/listing.d.ts.map +1 -0
  102. package/dist/listing.js +176 -0
  103. package/dist/live.d.ts +23 -0
  104. package/dist/live.d.ts.map +1 -0
  105. package/dist/live.js +165 -0
  106. package/dist/locks.d.ts +9 -0
  107. package/dist/locks.d.ts.map +1 -0
  108. package/dist/locks.js +62 -0
  109. package/dist/log.d.ts +1 -0
  110. package/dist/log.d.ts.map +1 -1
  111. package/dist/lost.d.ts +5 -0
  112. package/dist/lost.d.ts.map +1 -0
  113. package/dist/lost.js +61 -0
  114. package/dist/media.d.ts +8 -0
  115. package/dist/media.d.ts.map +1 -0
  116. package/dist/media.js +218 -0
  117. package/dist/memory.d.ts +19 -6
  118. package/dist/memory.d.ts.map +1 -1
  119. package/dist/memory.js +251 -97
  120. package/dist/messages.d.ts +49 -0
  121. package/dist/messages.d.ts.map +1 -0
  122. package/dist/messages.js +148 -0
  123. package/dist/model.d.ts +11 -12
  124. package/dist/model.d.ts.map +1 -1
  125. package/dist/model.js +7 -15
  126. package/dist/models.d.ts +14 -0
  127. package/dist/models.d.ts.map +1 -0
  128. package/dist/models.js +197 -0
  129. package/dist/name.d.ts +4 -0
  130. package/dist/name.d.ts.map +1 -0
  131. package/dist/name.js +122 -0
  132. package/dist/observation.d.ts +22 -4
  133. package/dist/observation.d.ts.map +1 -1
  134. package/dist/observation.js +127 -26
  135. package/dist/opened.d.ts +22 -0
  136. package/dist/opened.d.ts.map +1 -0
  137. package/dist/opened.js +107 -0
  138. package/dist/opening.d.ts +4 -0
  139. package/dist/opening.d.ts.map +1 -0
  140. package/dist/opening.js +60 -0
  141. package/dist/outcome.d.ts +49 -8
  142. package/dist/outcome.d.ts.map +1 -1
  143. package/dist/outcome.js +42 -0
  144. package/dist/overlay.d.ts +5 -4
  145. package/dist/overlay.d.ts.map +1 -1
  146. package/dist/overlay.js +132 -192
  147. package/dist/parts.d.ts +11 -0
  148. package/dist/parts.d.ts.map +1 -0
  149. package/dist/parts.js +21 -0
  150. package/dist/paths.d.ts +2 -0
  151. package/dist/paths.d.ts.map +1 -1
  152. package/dist/paths.js +26 -0
  153. package/dist/preparation.d.ts +20 -0
  154. package/dist/preparation.d.ts.map +1 -0
  155. package/dist/preparation.js +233 -0
  156. package/dist/queries.d.ts +16 -0
  157. package/dist/queries.d.ts.map +1 -0
  158. package/dist/queries.js +272 -0
  159. package/dist/query.d.ts +49 -183
  160. package/dist/query.d.ts.map +1 -1
  161. package/dist/query.js +3 -464
  162. package/dist/{chat/questions.d.ts → questions.d.ts} +5 -2
  163. package/dist/questions.d.ts.map +1 -0
  164. package/dist/{chat/questions.js → questions.js} +13 -2
  165. package/dist/reach.d.ts +21 -7
  166. package/dist/reach.d.ts.map +1 -1
  167. package/dist/reach.js +292 -91
  168. package/dist/react.d.ts +20 -6
  169. package/dist/react.d.ts.map +1 -1
  170. package/dist/react.js +17 -18
  171. package/dist/{chat/read.d.ts → read.d.ts} +2 -0
  172. package/dist/read.d.ts.map +1 -0
  173. package/dist/{chat/read.js → read.js} +4 -0
  174. package/dist/readiness.d.ts +49 -0
  175. package/dist/readiness.d.ts.map +1 -0
  176. package/dist/readiness.js +27 -0
  177. package/dist/reads.d.ts +37 -0
  178. package/dist/reads.d.ts.map +1 -0
  179. package/dist/reads.js +174 -0
  180. package/dist/recovery.d.ts +26 -0
  181. package/dist/recovery.d.ts.map +1 -0
  182. package/dist/recovery.js +232 -0
  183. package/dist/refresh.d.ts +17 -14
  184. package/dist/refresh.d.ts.map +1 -1
  185. package/dist/refresh.js +143 -51
  186. package/dist/refusal.d.ts +5 -0
  187. package/dist/refusal.d.ts.map +1 -0
  188. package/dist/refusal.js +57 -0
  189. package/dist/replica.d.ts +56 -33
  190. package/dist/replica.d.ts.map +1 -1
  191. package/dist/replica.js +338 -159
  192. package/dist/room-draft.d.ts +39 -9
  193. package/dist/room-draft.d.ts.map +1 -1
  194. package/dist/room-draft.js +186 -86
  195. package/dist/room-drafts.d.ts +24 -0
  196. package/dist/room-drafts.d.ts.map +1 -0
  197. package/dist/room-drafts.js +217 -0
  198. package/dist/rows.d.ts +30 -37
  199. package/dist/rows.d.ts.map +1 -1
  200. package/dist/rows.js +60 -128
  201. package/dist/runtime.d.ts +43 -0
  202. package/dist/runtime.d.ts.map +1 -0
  203. package/dist/runtime.js +1 -0
  204. package/dist/save.d.ts +58 -10
  205. package/dist/save.d.ts.map +1 -1
  206. package/dist/save.js +569 -189
  207. package/dist/saves.d.ts +70 -0
  208. package/dist/saves.d.ts.map +1 -0
  209. package/dist/saves.js +1008 -0
  210. package/dist/search.d.ts +15 -55
  211. package/dist/search.d.ts.map +1 -1
  212. package/dist/search.js +10 -121
  213. package/dist/seed.d.ts +25 -0
  214. package/dist/seed.d.ts.map +1 -0
  215. package/dist/seed.js +145 -0
  216. package/dist/shared.d.ts +10 -0
  217. package/dist/shared.d.ts.map +1 -0
  218. package/dist/shared.js +339 -0
  219. package/dist/shown.d.ts +31 -0
  220. package/dist/shown.d.ts.map +1 -0
  221. package/dist/shown.js +290 -0
  222. package/dist/socket/admission.d.ts +7 -0
  223. package/dist/socket/admission.d.ts.map +1 -0
  224. package/dist/socket/admission.js +39 -0
  225. package/dist/socket/answers.d.ts +6 -0
  226. package/dist/socket/answers.d.ts.map +1 -0
  227. package/dist/socket/answers.js +20 -0
  228. package/dist/socket/lanes.d.ts +20 -0
  229. package/dist/socket/lanes.d.ts.map +1 -0
  230. package/dist/socket/lanes.js +77 -0
  231. package/dist/socket/reads.d.ts +10 -0
  232. package/dist/socket/reads.d.ts.map +1 -0
  233. package/dist/socket/reads.js +31 -0
  234. package/dist/socket/rooms.d.ts +44 -0
  235. package/dist/socket/rooms.d.ts.map +1 -0
  236. package/dist/socket/rooms.js +90 -0
  237. package/dist/socket/session.d.ts +38 -0
  238. package/dist/socket/session.d.ts.map +1 -0
  239. package/dist/socket/session.js +23 -0
  240. package/dist/socket.d.ts +70 -0
  241. package/dist/socket.d.ts.map +1 -0
  242. package/dist/socket.js +175 -0
  243. package/dist/source.d.ts +61 -0
  244. package/dist/source.d.ts.map +1 -0
  245. package/dist/source.js +82 -0
  246. package/dist/status.d.ts +5 -2
  247. package/dist/status.d.ts.map +1 -1
  248. package/dist/status.js +3 -7
  249. package/dist/store/fences.d.ts +16 -0
  250. package/dist/store/fences.d.ts.map +1 -0
  251. package/dist/store/fences.js +26 -0
  252. package/dist/store/installs.d.ts +30 -0
  253. package/dist/store/installs.d.ts.map +1 -0
  254. package/dist/store/installs.js +34 -0
  255. package/dist/store/readiness.d.ts +10 -0
  256. package/dist/store/readiness.d.ts.map +1 -0
  257. package/dist/store/readiness.js +52 -0
  258. package/dist/store/records.d.ts +210 -0
  259. package/dist/store/records.d.ts.map +1 -0
  260. package/dist/store/records.js +428 -0
  261. package/dist/store/room-held.d.ts +8 -0
  262. package/dist/store/room-held.d.ts.map +1 -0
  263. package/dist/store/room-held.js +17 -0
  264. package/dist/store/space.d.ts +11 -0
  265. package/dist/store/space.d.ts.map +1 -0
  266. package/dist/store/space.js +41 -0
  267. package/dist/store/watchers.d.ts +17 -0
  268. package/dist/store/watchers.d.ts.map +1 -0
  269. package/dist/store/watchers.js +56 -0
  270. package/dist/store/writes.d.ts +24 -0
  271. package/dist/store/writes.d.ts.map +1 -0
  272. package/dist/store/writes.js +125 -0
  273. package/dist/store.d.ts +106 -127
  274. package/dist/store.d.ts.map +1 -1
  275. package/dist/store.js +136 -575
  276. package/dist/stored.d.ts +156 -0
  277. package/dist/stored.d.ts.map +1 -0
  278. package/dist/stored.js +649 -0
  279. package/dist/surface.d.ts +88 -0
  280. package/dist/surface.d.ts.map +1 -0
  281. package/dist/surface.js +224 -0
  282. package/dist/sync.d.ts +19 -0
  283. package/dist/sync.d.ts.map +1 -0
  284. package/dist/sync.js +532 -0
  285. package/dist/tables.d.ts +412 -0
  286. package/dist/tables.d.ts.map +1 -0
  287. package/dist/tables.js +737 -0
  288. package/dist/tallies.d.ts +18 -0
  289. package/dist/tallies.d.ts.map +1 -0
  290. package/dist/tallies.js +129 -0
  291. package/dist/transfer.d.ts +0 -5
  292. package/dist/transfer.d.ts.map +1 -1
  293. package/dist/turn.d.ts +9 -0
  294. package/dist/turn.d.ts.map +1 -0
  295. package/dist/turn.js +75 -0
  296. package/dist/validation.d.ts +29 -0
  297. package/dist/validation.d.ts.map +1 -0
  298. package/dist/validation.js +104 -0
  299. package/dist/windows.d.ts +11 -0
  300. package/dist/windows.d.ts.map +1 -0
  301. package/dist/windows.js +16 -0
  302. package/dist/wire.d.ts +181 -33
  303. package/dist/wire.d.ts.map +1 -1
  304. package/dist/wire.js +62 -31
  305. package/package.json +19 -19
  306. package/AGENTS.md +0 -299
  307. package/dist/chat/acts.d.ts +0 -33
  308. package/dist/chat/acts.d.ts.map +0 -1
  309. package/dist/chat/acts.js +0 -36
  310. package/dist/chat/context.d.ts +0 -3
  311. package/dist/chat/context.d.ts.map +0 -1
  312. package/dist/chat/input.d.ts +0 -9
  313. package/dist/chat/input.d.ts.map +0 -1
  314. package/dist/chat/input.js +0 -99
  315. package/dist/chat/kit.d.ts +0 -60
  316. package/dist/chat/kit.d.ts.map +0 -1
  317. package/dist/chat/kit.js +0 -123
  318. package/dist/chat/lasting.d.ts +0 -6
  319. package/dist/chat/lasting.d.ts.map +0 -1
  320. package/dist/chat/lasting.js +0 -19
  321. package/dist/chat/list.d.ts +0 -26
  322. package/dist/chat/list.d.ts.map +0 -1
  323. package/dist/chat/list.js +0 -62
  324. package/dist/chat/markdown.d.ts +0 -20
  325. package/dist/chat/markdown.d.ts.map +0 -1
  326. package/dist/chat/markdown.js +0 -188
  327. package/dist/chat/message.d.ts +0 -6
  328. package/dist/chat/message.d.ts.map +0 -1
  329. package/dist/chat/message.js +0 -192
  330. package/dist/chat/messages.d.ts +0 -21
  331. package/dist/chat/messages.d.ts.map +0 -1
  332. package/dist/chat/messages.js +0 -151
  333. package/dist/chat/name.d.ts +0 -6
  334. package/dist/chat/name.d.ts.map +0 -1
  335. package/dist/chat/name.js +0 -37
  336. package/dist/chat/opened.d.ts +0 -11
  337. package/dist/chat/opened.d.ts.map +0 -1
  338. package/dist/chat/opened.js +0 -17
  339. package/dist/chat/overlay.d.ts +0 -31
  340. package/dist/chat/overlay.d.ts.map +0 -1
  341. package/dist/chat/overlay.js +0 -97
  342. package/dist/chat/parts.d.ts +0 -57
  343. package/dist/chat/parts.d.ts.map +0 -1
  344. package/dist/chat/parts.js +0 -119
  345. package/dist/chat/process.d.ts +0 -20
  346. package/dist/chat/process.d.ts.map +0 -1
  347. package/dist/chat/process.js +0 -32
  348. package/dist/chat/provider.d.ts +0 -63
  349. package/dist/chat/provider.d.ts.map +0 -1
  350. package/dist/chat/provider.js +0 -620
  351. package/dist/chat/question.d.ts +0 -9
  352. package/dist/chat/question.d.ts.map +0 -1
  353. package/dist/chat/question.js +0 -80
  354. package/dist/chat/questions.d.ts.map +0 -1
  355. package/dist/chat/read.d.ts.map +0 -1
  356. package/dist/chat/ready.d.ts +0 -33
  357. package/dist/chat/ready.d.ts.map +0 -1
  358. package/dist/chat/ready.js +0 -91
  359. package/dist/chat/style.d.ts +0 -4
  360. package/dist/chat/style.d.ts.map +0 -1
  361. package/dist/chat/style.js +0 -302
  362. package/dist/chat.d.ts +0 -14
  363. package/dist/chat.d.ts.map +0 -1
  364. package/dist/chat.js +0 -8
  365. package/dist/fence.d.ts +0 -6
  366. package/dist/fence.d.ts.map +0 -1
  367. package/dist/fence.js +0 -10
  368. package/dist/read-side.d.ts +0 -18
  369. package/dist/read-side.d.ts.map +0 -1
  370. package/dist/read-side.js +0 -440
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,67 @@ 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
+ function compose(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
+ const created = create(type, definition);
61
+ const next = apply(created, [
62
+ ...Object.entries(fields).flatMap(([name, value]) => (name !== TYPE_FIELD || type === undefined) && frontmatterValue(value)
63
+ ? [{ kind: 'field', name, value, prior: undefined }]
64
+ : []),
65
+ ...Object.entries(sections).map(([name, value]) => ({
66
+ kind: 'section',
67
+ name,
68
+ value,
69
+ prior: undefined,
70
+ })),
71
+ ], definition);
72
+ return serialize(next.outcome === 'applied' ? next.document : created);
64
73
  }
65
- function edited(document, change, priors) {
66
- if (change.kind === 'field') {
67
- return apply(document, {
74
+ function edited(change, priors) {
75
+ if (change.kind === 'field')
76
+ return {
68
77
  kind: 'field',
69
78
  name: change.name,
70
79
  value: change.value,
71
80
  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, {
81
+ };
82
+ if (change.kind === 'preamble')
83
+ return { kind: 'preamble', value: change.value, prior: priors.preamble(change.path) };
84
+ return {
84
85
  kind: 'section',
85
86
  name: change.name,
86
87
  value: change.value,
87
88
  prior: priors.section(change.path, change.name),
88
- });
89
+ };
89
90
  }
90
- function edit(staged, change, priors) {
91
- const text = staged.documents[change.path];
91
+ function edit(staged, changes, priors, composition) {
92
+ const path = changes[0].path;
93
+ delete staged.revisions[path];
94
+ const text = staged.documents[path];
92
95
  if (text === undefined)
93
- return false;
94
- const parsed = parse(text, change.path);
96
+ return changes.length;
97
+ const definitions = definitionsAt(composition, path);
98
+ const parsed = parse(text, path, definitions);
95
99
  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;
100
+ return changes.length;
101
+ const definition = definitions(parsed.document.type);
102
+ const wanted = changes.map((change) => edited(change, priors));
103
+ const first = apply(parsed.document, wanted, definition);
104
+ if (first.outcome === 'refuse')
105
+ return changes.length;
106
+ if (first.outcome === 'applied') {
107
+ staged.documents[path] = serialize(first.document);
108
+ return 0;
109
+ }
110
+ const stale = new Set(first.stale);
111
+ const kept = wanted.filter((_, at) => !stale.has(at));
112
+ const rest = apply(parsed.document, kept, definition);
113
+ if (rest.outcome !== 'applied')
114
+ return changes.length;
115
+ staged.documents[path] = serialize(rest.document);
116
+ return first.stale.length;
102
117
  }
103
118
  function relocate(staged, from, to) {
104
119
  const text = staged.documents[from];
@@ -118,32 +133,46 @@ function relocate(staged, from, to) {
118
133
  }
119
134
  function moveHead(heads, from, to) {
120
135
  const revision = heads.revisions[from];
136
+ const fileId = heads.fileIds[from];
137
+ const created = heads.created[from];
121
138
  const change = heads.changes[from];
122
139
  delete heads.revisions[from];
140
+ delete heads.fileIds[from];
141
+ delete heads.created[from];
123
142
  delete heads.changes[from];
143
+ delete heads.fileIds[to];
144
+ delete heads.created[to];
124
145
  delete heads.changes[to];
125
146
  if (revision !== undefined)
126
147
  heads.revisions[to] = revision;
148
+ if (fileId !== undefined)
149
+ heads.fileIds[to] = fileId;
150
+ if (created !== undefined)
151
+ heads.created[to] = created;
127
152
  if (change !== undefined)
128
153
  heads.changes[to] = change;
129
154
  }
130
155
  function erase(staged, path) {
131
156
  delete staged.documents[path];
132
157
  delete staged.revisions[path];
158
+ delete staged.fileIds[path];
159
+ delete staged.created[path];
133
160
  delete staged.changes[path];
134
161
  delete staged.binaries[path];
135
162
  }
136
- function stage(staged, change, priors) {
137
- if (change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble') {
138
- return edit(staged, change, priors);
139
- }
163
+ function stage(staged, change, composition) {
140
164
  if (change.kind === 'create') {
141
165
  staged.documents[change.path] =
142
- 'content' in change ? change.content : compose(change.fields, change.sections);
166
+ 'content' in change
167
+ ? change.content
168
+ : compose(change.path, change.fields, change.sections, composition);
169
+ delete staged.fileIds[change.path];
170
+ delete staged.created[change.path];
143
171
  delete staged.changes[change.path];
144
172
  return true;
145
173
  }
146
174
  if (change.kind === 'replace') {
175
+ delete staged.revisions[change.path];
147
176
  if (staged.documents[change.path] === undefined)
148
177
  return false;
149
178
  staged.documents[change.path] = change.content;
@@ -166,156 +195,67 @@ function stage(staged, change, priors) {
166
195
  if (change.kind === 'move') {
167
196
  return relocate(staged, change.path, change.to);
168
197
  }
198
+ if (change.kind === 'arrival') {
199
+ erase(staged, change.path);
200
+ if ('content' in change)
201
+ staged.documents[change.path] = change.content;
202
+ else
203
+ staged.binaries[change.path] = { state: 'accepted', ...change.binary };
204
+ arrive(staged, change);
205
+ return true;
206
+ }
169
207
  erase(staged, change.path);
170
208
  return true;
171
209
  }
172
- export function overlay(base, queue, unapplied) {
210
+ function arrive(heads, change) {
211
+ if (change.revision !== undefined)
212
+ heads.revisions[change.path] = change.revision;
213
+ if (change.fileId !== undefined)
214
+ heads.fileIds[change.path] = change.fileId;
215
+ if (change.created !== undefined)
216
+ heads.created[change.path] = change.created;
217
+ if (change.change !== undefined)
218
+ heads.changes[change.path] = change.change;
219
+ }
220
+ export function* overlaying(base, queue, composition, unapplied) {
173
221
  const staged = {
174
- documents: { ...base.documents },
175
- binaries: { ...base.binaries },
176
- revisions: { ...base.revisions },
177
- changes: { ...base.changes },
178
- };
179
- 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,
222
+ documents: drafted(base.documents),
223
+ binaries: drafted(base.binaries),
224
+ revisions: drafted(base.revisions),
225
+ fileIds: drafted(base.fileIds),
226
+ created: drafted(base.created),
227
+ changes: drafted(base.changes),
191
228
  };
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
229
  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)))
230
+ const priors = yield* priorsOf(batch.preconditions);
231
+ for (let index = 0; index < batch.changes.length; index += 1) {
232
+ const change = batch.changes[index];
233
+ if (!isPart(change)) {
234
+ if (!stage(staged, change, composition))
235
+ unapplied?.();
236
+ yield ROW_WEIGHT;
277
237
  continue;
278
- for (const path of touched) {
279
- if (affected.has(path))
280
- continue;
281
- affected.add(path);
282
- expanded = true;
283
238
  }
239
+ const run = [change];
240
+ while (index + 1 < batch.changes.length) {
241
+ const next = batch.changes[index + 1];
242
+ if (!isPart(next) || next.path !== change.path)
243
+ break;
244
+ run.push(next);
245
+ index += 1;
246
+ }
247
+ const text = staged.documents[change.path] ?? '';
248
+ for (let left = edit(staged, run, priors, composition); left > 0; left -= 1)
249
+ unapplied?.();
250
+ yield ROW_WEIGHT + text.length;
284
251
  }
285
252
  }
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
253
  return {
316
- documents: mergedDocuments,
317
- revisions: mergedRevisions,
318
- changes: mergedChanges,
319
- binaries: mergedBinaries,
254
+ documents: yield* settling(staged.documents),
255
+ binaries: yield* settling(staged.binaries),
256
+ revisions: yield* settling(staged.revisions),
257
+ fileIds: yield* settling(staged.fileIds),
258
+ created: yield* settling(staged.created),
259
+ changes: yield* settling(staged.changes),
320
260
  };
321
261
  }
@@ -0,0 +1,11 @@
1
+ import { type Part, type SessionState } from '@agentshouse/session-content';
2
+ export type ChatWork = {
3
+ readonly kind: 'job' | 'schedule' | 'subagent';
4
+ readonly title: string;
5
+ readonly next: string | null;
6
+ readonly activity: string | null;
7
+ };
8
+ export declare function counted(count: number): string;
9
+ export declare function runningLine(parts: readonly Part[]): string | null;
10
+ export declare function workOf(state: SessionState | null): readonly ChatWork[];
11
+ //# 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,KAAK,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAGnF,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,UAAU,GAAG,UAAU,CAAC;IAC/C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,CAAC;AAEF,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,MAAM,GAAG,IAAI,CAMjE;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,QAAQ,EAAE,CAOtE"}
package/dist/parts.js ADDED
@@ -0,0 +1,21 @@
1
+ import { isOwn } from '@agentshouse/session-content';
2
+ import { excerpt } from './read.js';
3
+ export function counted(count) {
4
+ return count === 1 ? '1 command' : `${count} commands`;
5
+ }
6
+ export function runningLine(parts) {
7
+ const newest = parts.filter(isOwn).reverse();
8
+ const note = newest.find((part) => part.type === 'text' && part.text.trim() !== '');
9
+ if (note?.type === 'text')
10
+ return excerpt(note.text);
11
+ const call = newest.find((part) => part.type === 'call');
12
+ return call?.type === 'call' && call.line !== '' ? call.line : null;
13
+ }
14
+ export function workOf(state) {
15
+ return (state?.running ?? []).map(({ kind, label, progress, next }) => ({
16
+ kind: kind === 'subagent' || kind === 'schedule' ? kind : 'job',
17
+ title: label,
18
+ next,
19
+ activity: progress,
20
+ }));
21
+ }
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
+ }
@@ -0,0 +1,20 @@
1
+ import type { PlanReach } from './query.js';
2
+ import { type PortReach } from './reach.js';
3
+ import { type CodeAvailability, type ConnectionAvailability, type Readiness } from './readiness.js';
4
+ import type { Runtime } from './runtime.js';
5
+ export type ReadinessPort = {
6
+ readonly target: string;
7
+ readonly code: CodeAvailability;
8
+ };
9
+ export type ReadinessWatch = {
10
+ readonly port: ReadinessPort;
11
+ readonly reach: PortReach | null;
12
+ readonly deliver: (readiness: Readiness) => void;
13
+ };
14
+ export declare function prepare(runtime: Runtime, locators?: readonly string[]): void;
15
+ export declare function roomsOfReach(reach: PlanReach): ReadonlySet<string>;
16
+ export declare function connectionNow(runtime: Runtime): Promise<ConnectionAvailability>;
17
+ export declare function deliverOwedReadiness(runtime: Runtime, owed: readonly ReadinessWatch[]): Promise<void>;
18
+ export declare function watchReadiness({ store }: Runtime, port: ReadinessPort, reach: PortReach | null, deliver: (readiness: Readiness) => void): () => void;
19
+ export declare function filled(runtime: Runtime): void;
20
+ //# sourceMappingURL=preparation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preparation.d.ts","sourceRoot":"","sources":["../src/preparation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAE3B,KAAK,SAAS,EAEf,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAK5C,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;CAClD,CAAC;AAuCF,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAE,SAAS,MAAM,EAAO,QA+BzE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAElE;AAmDD,wBAAsB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAMrF;AAmFD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,cAAc,EAAE,iBAI3F;AAED,wBAAgB,cAAc,CAC5B,EAAE,KAAK,EAAE,EAAE,OAAO,EAClB,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,SAAS,GAAG,IAAI,EACvB,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,GACtC,MAAM,IAAI,CAQZ;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,QAMtC"}