@agentshouse/mdruntime 0.1.0-cd26b960b7262 → 0.1.0-cd35ccee27a19

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 (153) hide show
  1. package/dist/acceptance.d.ts +0 -3
  2. package/dist/acceptance.d.ts.map +1 -1
  3. package/dist/acceptance.js +58 -135
  4. package/dist/actions.js +5 -5
  5. package/dist/adapter.d.ts +26 -45
  6. package/dist/adapter.d.ts.map +1 -1
  7. package/dist/bootstrap.d.ts +1 -1
  8. package/dist/bootstrap.d.ts.map +1 -1
  9. package/dist/bootstrap.js +6 -19
  10. package/dist/change-set.d.ts +4 -0
  11. package/dist/change-set.d.ts.map +1 -1
  12. package/dist/change-set.js +6 -0
  13. package/dist/client.d.ts +4 -11
  14. package/dist/client.d.ts.map +1 -1
  15. package/dist/client.js +21 -8
  16. package/dist/collection.d.ts +22 -4
  17. package/dist/collection.d.ts.map +1 -1
  18. package/dist/collection.js +12 -2
  19. package/dist/connection.d.ts.map +1 -1
  20. package/dist/connection.js +17 -13
  21. package/dist/conversation-live.d.ts +5 -5
  22. package/dist/conversation-live.d.ts.map +1 -1
  23. package/dist/conversation-live.js +7 -6
  24. package/dist/conversation.d.ts +18 -6
  25. package/dist/conversation.d.ts.map +1 -1
  26. package/dist/conversation.js +115 -82
  27. package/dist/declaration.d.ts +10 -0
  28. package/dist/declaration.d.ts.map +1 -0
  29. package/dist/declaration.js +24 -0
  30. package/dist/discovery.d.ts.map +1 -1
  31. package/dist/discovery.js +11 -38
  32. package/dist/failure.d.ts +1 -0
  33. package/dist/failure.d.ts.map +1 -1
  34. package/dist/failure.js +3 -0
  35. package/dist/host.d.ts +17 -2
  36. package/dist/host.d.ts.map +1 -1
  37. package/dist/host.js +34 -4
  38. package/dist/index.d.ts +6 -4
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +4 -2
  41. package/dist/install.d.ts +0 -2
  42. package/dist/install.d.ts.map +1 -1
  43. package/dist/install.js +47 -63
  44. package/dist/lifecycle.d.ts +1 -1
  45. package/dist/lifecycle.d.ts.map +1 -1
  46. package/dist/lifecycle.js +28 -24
  47. package/dist/listing.d.ts +6 -11
  48. package/dist/listing.d.ts.map +1 -1
  49. package/dist/listing.js +25 -62
  50. package/dist/live.d.ts.map +1 -1
  51. package/dist/live.js +3 -1
  52. package/dist/locks.d.ts +2 -4
  53. package/dist/locks.d.ts.map +1 -1
  54. package/dist/locks.js +10 -38
  55. package/dist/lost.d.ts.map +1 -1
  56. package/dist/lost.js +10 -21
  57. package/dist/memory.d.ts +4 -2
  58. package/dist/memory.d.ts.map +1 -1
  59. package/dist/memory.js +22 -9
  60. package/dist/messages.d.ts +0 -3
  61. package/dist/messages.d.ts.map +1 -1
  62. package/dist/messages.js +5 -17
  63. package/dist/model.d.ts +0 -1
  64. package/dist/model.d.ts.map +1 -1
  65. package/dist/model.js +0 -5
  66. package/dist/models.d.ts +4 -8
  67. package/dist/models.d.ts.map +1 -1
  68. package/dist/models.js +97 -136
  69. package/dist/opened.d.ts +1 -1
  70. package/dist/opened.d.ts.map +1 -1
  71. package/dist/opened.js +2 -2
  72. package/dist/opening.d.ts.map +1 -1
  73. package/dist/opening.js +6 -4
  74. package/dist/overlay.d.ts +2 -1
  75. package/dist/overlay.d.ts.map +1 -1
  76. package/dist/overlay.js +32 -21
  77. package/dist/page-metadata.d.ts +8 -0
  78. package/dist/page-metadata.d.ts.map +1 -0
  79. package/dist/page-metadata.js +19 -0
  80. package/dist/parts.d.ts +3 -52
  81. package/dist/parts.d.ts.map +1 -1
  82. package/dist/parts.js +15 -120
  83. package/dist/preparation.d.ts.map +1 -1
  84. package/dist/preparation.js +20 -13
  85. package/dist/presence.d.ts +52 -0
  86. package/dist/presence.d.ts.map +1 -0
  87. package/dist/presence.js +220 -0
  88. package/dist/queries.d.ts.map +1 -1
  89. package/dist/queries.js +4 -6
  90. package/dist/queue.d.ts +40 -0
  91. package/dist/queue.d.ts.map +1 -0
  92. package/dist/queue.js +455 -0
  93. package/dist/reach.d.ts.map +1 -1
  94. package/dist/reach.js +23 -4
  95. package/dist/reads.d.ts.map +1 -1
  96. package/dist/reads.js +4 -1
  97. package/dist/refresh.js +2 -2
  98. package/dist/refusal.d.ts.map +1 -1
  99. package/dist/refusal.js +5 -3
  100. package/dist/replica.d.ts +5 -11
  101. package/dist/replica.d.ts.map +1 -1
  102. package/dist/replica.js +12 -14
  103. package/dist/room-draft.d.ts +3 -3
  104. package/dist/room-draft.d.ts.map +1 -1
  105. package/dist/room-draft.js +33 -49
  106. package/dist/room-drafts.js +3 -3
  107. package/dist/rows.d.ts.map +1 -1
  108. package/dist/rows.js +3 -4
  109. package/dist/runtime.d.ts +7 -16
  110. package/dist/runtime.d.ts.map +1 -1
  111. package/dist/save.d.ts +41 -90
  112. package/dist/save.d.ts.map +1 -1
  113. package/dist/save.js +220 -110
  114. package/dist/saves.d.ts +2 -40
  115. package/dist/saves.d.ts.map +1 -1
  116. package/dist/saves.js +106 -698
  117. package/dist/seed.js +2 -2
  118. package/dist/shown.d.ts +4 -3
  119. package/dist/shown.d.ts.map +1 -1
  120. package/dist/shown.js +24 -26
  121. package/dist/socket.d.ts +0 -3
  122. package/dist/socket.d.ts.map +1 -1
  123. package/dist/socket.js +0 -5
  124. package/dist/store/records.d.ts +2 -2
  125. package/dist/store/records.d.ts.map +1 -1
  126. package/dist/store/records.js +2 -3
  127. package/dist/store.d.ts +8 -5
  128. package/dist/store.d.ts.map +1 -1
  129. package/dist/store.js +32 -12
  130. package/dist/stored.d.ts.map +1 -1
  131. package/dist/stored.js +3 -3
  132. package/dist/surface.d.ts.map +1 -1
  133. package/dist/surface.js +8 -8
  134. package/dist/sync.d.ts.map +1 -1
  135. package/dist/sync.js +55 -66
  136. package/dist/tables.d.ts +0 -4
  137. package/dist/tables.d.ts.map +1 -1
  138. package/dist/tables.js +1 -4
  139. package/dist/validation.d.ts.map +1 -1
  140. package/dist/validation.js +2 -2
  141. package/dist/wire.d.ts +40 -4
  142. package/dist/wire.d.ts.map +1 -1
  143. package/dist/wire.js +12 -3
  144. package/package.json +3 -2
  145. package/dist/job.d.ts +0 -33
  146. package/dist/job.d.ts.map +0 -1
  147. package/dist/job.js +0 -54
  148. package/dist/socket/rooms.d.ts +0 -44
  149. package/dist/socket/rooms.d.ts.map +0 -1
  150. package/dist/socket/rooms.js +0 -90
  151. package/dist/store/fences.d.ts +0 -16
  152. package/dist/store/fences.d.ts.map +0 -1
  153. package/dist/store/fences.js +0 -26
@@ -1 +1 @@
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"}
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,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAczD;AACD,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAI1D"}
package/dist/model.js CHANGED
@@ -1,9 +1,4 @@
1
1
  export const NO_MODEL = { status: 'unavailable', reason: 'not-acquired' };
2
- export function definitionOf(state, type) {
3
- if (state.status === 'unavailable' || type === undefined)
4
- return undefined;
5
- return Object.hasOwn(state.types, type) ? state.types[type] : undefined;
6
- }
7
2
  export function modelTypes(state) {
8
3
  return state.status === 'unavailable'
9
4
  ? { ...state, types: null }
package/dist/models.d.ts CHANGED
@@ -1,14 +1,10 @@
1
- import type { ScopedRefusal } from './adapter.js';
1
+ import type { RoomDeclaration, ScopedRefusal } from './adapter.js';
2
2
  import { type ModelState } from './model.js';
3
- import { type ReplicaRecord } from './replica.js';
4
3
  import type { Runtime } from './runtime.js';
5
- import type { RoomDeclaration } from './socket.js';
6
4
  import type { RuntimeStore } from './store.js';
7
- export declare function declaredAsHeld(held: ReplicaRecord | undefined, room: RoomDeclaration): boolean;
8
5
  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>;
6
+ export declare function retainModel(runtime: Runtime, locator: string, declaration: RoomDeclaration, given: ModelState | null, refused?: true): Promise<void>;
7
+ export declare function scoped(runtime: Runtime, result: ScopedRefusal, locator: string, declaration: RoomDeclaration): Promise<void>;
8
+ export declare function settleModels(runtime: Runtime, held: ReadonlyMap<string, RoomDeclaration>, status: 'current' | 'cached', local: RuntimeStore): Promise<void>;
13
9
  export declare function cachedModels(runtime: Runtime, local: RuntimeStore): Promise<void>;
14
10
  //# sourceMappingURL=models.d.ts.map
@@ -1 +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,CAS9F;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,iBAuDzB;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"}
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAOnE,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAGvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAc,YAAY,EAAS,MAAM,YAAY,CAAC;AAMlE,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAE9D;AA0DD,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,eAAe,EAC5B,KAAK,EAAE,UAAU,GAAG,IAAI,EACxB,OAAO,CAAC,EAAE,IAAI,iBA2Bf;AAED,wBAAsB,MAAM,CAC1B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,eAAe,iBAoB7B;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,EAC1C,MAAM,EAAE,SAAS,GAAG,QAAQ,EAC5B,KAAK,EAAE,YAAY,iBA+CpB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBvF"}
package/dist/models.js CHANGED
@@ -1,195 +1,156 @@
1
+ import { equalValue } from '@agentshouse/mdmodel';
1
2
  import { changeSet } from './change-set.js';
2
3
  import { composedOf } from './collection.js';
3
- import { admitted, declarationOf, list, listedLocators } from './listing.js';
4
+ import { declared, sameDeclaration } from './declaration.js';
5
+ import { uncaught } from './failure.js';
6
+ import { declarationOf, listedLocators } from './listing.js';
4
7
  import { loseRooms } from './lost.js';
5
8
  import { NO_MODEL } from './model.js';
9
+ import { settle } from './queue.js';
6
10
  import { storedRecord } from './replica.js';
7
- import { overlayDiff, preparedAfter, replayed, sliceAt } from './saves.js';
8
11
  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.authoredPaths) === JSON.stringify(room.authoredPaths) &&
15
- JSON.stringify(held.typedSelection) === JSON.stringify(room.typedSelection ?? null)));
12
+ function declaredAsHeld(held, declaration) {
13
+ return held === undefined || sameDeclaration(held.declaration, declaration);
16
14
  }
17
15
  export function revoked(model) {
18
16
  return model?.status === 'unavailable' && model.reason === 'revoked';
19
17
  }
20
- function unheldModelOf({ socket }, locator) {
21
- return socket.rooms.standing(locator).unheldModel ?? NO_MODEL;
18
+ function unheldModelOf({ presence }, locator) {
19
+ return presence.unheldModel(locator) ?? NO_MODEL;
22
20
  }
23
- export async function keepNaming(runtime, local, room) {
21
+ async function modelNow(runtime, locator) {
22
+ return (await runtime.store.record(locator))?.model ?? unheldModelOf(runtime, locator);
23
+ }
24
+ function restands(held, model, declaration) {
25
+ return (JSON.stringify(held.model) !== JSON.stringify(model) ||
26
+ !equalValue(held.declaration.typedSelection, declaration.typedSelection));
27
+ }
28
+ function recordAlone(store, record) {
29
+ return {
30
+ locator: record.locator,
31
+ key: record.key,
32
+ record: storedRecord(record),
33
+ composed: composedOf(store.composed(record)),
34
+ };
35
+ }
36
+ function unheld(runtime, locator, model) {
37
+ runtime.presence.modelled(locator, model);
38
+ emitRooms(runtime);
39
+ }
40
+ function recorded(runtime, locator, declaration, model) {
24
41
  const { store, socket } = runtime;
25
- const held = await store.record(room.locator);
26
- if (held === undefined || (held.name === room.name && held.handle === room.handle))
27
- return;
28
- await store.exclusive(async () => {
42
+ return store.exclusive(async () => {
29
43
  if (!socket.continuing())
30
44
  return;
31
- const current = await store.record(room.locator);
32
- if (current === undefined)
45
+ const current = await store.record(locator);
46
+ if (current === undefined) {
47
+ unheld(runtime, locator, model);
33
48
  return;
34
- const record = { ...current, name: room.name, handle: room.handle };
35
- await local.commit({
36
- rooms: [
37
- {
38
- locator: room.locator,
39
- key: record.key,
40
- record: storedRecord(record),
41
- composed: composedOf(store.composed(record)),
42
- },
43
- ],
44
- });
45
- emitRooms(runtime);
49
+ }
50
+ const answer = await (await store.open()).commit({ rooms: [recordAlone(store, { ...current, declaration, model })] });
51
+ void store.changed(changeSet(locator, {
52
+ documents: answer.changed[locator] ?? [],
53
+ room: true,
54
+ unindexed: answer.indexed[locator] === false,
55
+ }));
46
56
  });
47
57
  }
48
- async function modelNow(runtime, locator) {
49
- return (await runtime.store.record(locator))?.model ?? unheldModelOf(runtime, locator);
50
- }
51
- export async function retainModel(runtime, local, room, given) {
58
+ export async function retainModel(runtime, locator, declaration, given, refused) {
52
59
  const { store, socket } = runtime;
53
- const held = await store.record(room.locator);
54
- const previous = held?.model ?? unheldModelOf(runtime, room.locator);
60
+ const held = await store.record(locator);
61
+ const previous = held?.model ?? unheldModelOf(runtime, locator);
55
62
  const next = given ?? previous;
56
- if (JSON.stringify(previous) === JSON.stringify(next) && declaredAsHeld(held, room))
63
+ if (JSON.stringify(previous) === JSON.stringify(next) && declaredAsHeld(held, declaration))
64
+ return;
65
+ if (held !== undefined && !restands(held, next, declaration)) {
66
+ await recorded(runtime, locator, declaration, next);
57
67
  return;
58
- await store.exclusive(async () => {
68
+ }
69
+ await settle(runtime, [locator], async (works) => {
59
70
  if (!socket.continuing())
60
- return;
61
- const work = await store.work(room.locator);
62
- const current = work.replica;
63
- let changed = null;
64
- if (current !== undefined) {
65
- const record = {
66
- ...current.record,
67
- name: room.name,
68
- handle: room.handle,
69
- operations: room.operations,
70
- replica: room.replica,
71
- providerOwnedPaths: room.providerOwnedPaths,
72
- authoredPaths: room.authoredPaths,
73
- typedSelection: room.typedSelection ?? null,
74
- model: next,
75
- };
76
- const confirmedLayer = await sliceAt(store, record, 'confirmed', current.queue, current.overlaid);
77
- const replayedLayer = await replayed(store, record, confirmedLayer, current.queue);
78
- const diff = await overlayDiff(record, current, replayedLayer.visible, replayedLayer.touched);
79
- const answer = await local.commit({
80
- rooms: [
81
- {
82
- locator: room.locator,
83
- key: record.key,
84
- record: storedRecord(record),
85
- roots: record.typedSelection?.roots ?? [],
86
- composed: composedOf(store.composed(record)),
87
- overlay: diff.overlay,
88
- },
89
- ],
90
- });
91
- preparedAfter(runtime, room.locator, answer);
92
- changed = changeSet(room.locator, {
93
- documents: answer.changed[room.locator] ?? [],
94
- room: true,
95
- });
71
+ return [];
72
+ const current = works.get(locator)?.replica;
73
+ if (current === undefined) {
74
+ unheld(runtime, locator, next);
75
+ return [];
96
76
  }
97
- else
98
- socket.rooms.stand(room.locator, { unheldModel: next });
99
- list(runtime, room, admitted(runtime, room));
100
- if (changed === null)
101
- emitRooms(runtime);
102
- else
103
- store.changed(changed);
77
+ return [
78
+ {
79
+ locator,
80
+ record: { ...current.record, declaration, model: next },
81
+ ...(refused === undefined ? {} : { refused }),
82
+ },
83
+ ];
104
84
  });
105
85
  }
106
- export async function scoped(runtime, result, room, local) {
107
- const { socket, journal } = runtime;
86
+ export async function scoped(runtime, result, locator, declaration) {
87
+ const { socket, presence, journal } = runtime;
108
88
  if (result.scope === 'content' && !result.retryable) {
109
- journal.record(`scoped refusal ${room.locator} ${result.scope} ${result.code}`);
110
- await loseRooms(runtime, [room.locator]);
89
+ journal.record(`scoped refusal ${locator} ${result.scope} ${result.code}`);
90
+ await loseRooms(runtime, [locator]);
111
91
  return;
112
92
  }
113
- socket.rooms.stand(room.locator, {
114
- refusal: { code: result.code, fields: result.fields, retryable: result.retryable },
115
- });
116
- let scopedAway = room;
93
+ presence.refused(locator, result);
117
94
  if (result.scope === 'model')
118
- await retainModel(runtime, local, room, {
119
- status: 'unavailable',
120
- reason: 'not-readable',
121
- });
122
- else if (result.scope !== 'operation') {
123
- socket.rooms.stand(room.locator, { unreadable: true });
124
- scopedAway = { ...room, replica: { ...room.replica, admission: 'unavailable' } };
125
- await retainModel(runtime, local, scopedAway, null);
126
- }
95
+ await retainModel(runtime, locator, declaration, { status: 'unavailable', reason: 'not-readable' }, true);
127
96
  if (!socket.continuing())
128
97
  return;
129
- list(runtime, scopedAway, admitted(runtime, scopedAway));
130
98
  emitRooms(runtime);
131
- journal.record(`scoped refusal ${room.locator} ${result.scope} ${result.code}`);
99
+ journal.record(`scoped refusal ${locator} ${result.scope} ${result.code}`);
132
100
  }
133
101
  export async function settleModels(runtime, held, status, local) {
134
- const { store, socket, journal } = runtime;
102
+ const { store, socket, presence, journal } = runtime;
135
103
  const owed = (model) => model.status !== 'unavailable' && model.status !== status;
136
104
  const declaredAnew = await store.exclusive(async () => {
137
105
  if (!socket.continuing())
138
106
  return [];
139
- const stored = await store.rooms(held.map(({ locator }) => locator));
140
- const unchanged = held.filter((room) => {
141
- const record = stored.get(room.locator)?.record;
142
- return (owed(record?.model ?? unheldModelOf(runtime, room.locator)) && declaredAsHeld(record, room));
107
+ const stored = await store.rooms([...held.keys()]);
108
+ const unchanged = [...held].filter(([locator, declaration]) => {
109
+ const record = stored.get(locator)?.record;
110
+ return (owed(record?.model ?? unheldModelOf(runtime, locator)) &&
111
+ declaredAsHeld(record, declaration));
143
112
  });
144
- const records = unchanged.flatMap((room) => {
145
- const record = stored.get(room.locator)?.record;
113
+ const records = unchanged.flatMap(([locator]) => {
114
+ const record = stored.get(locator)?.record;
146
115
  return record === undefined
147
116
  ? []
148
117
  : [{ ...record, model: { ...record.model, status } }];
149
118
  });
150
119
  if (records.length > 0) {
151
120
  try {
152
- await local.commit({
153
- rooms: records.map((record) => ({
154
- locator: record.locator,
155
- key: record.key,
156
- record: storedRecord(record),
157
- composed: composedOf(store.composed(record)),
158
- })),
159
- });
121
+ await local.commit({ rooms: records.map((record) => recordAlone(store, record)) });
160
122
  }
161
- catch {
123
+ catch (error) {
162
124
  journal.record(`model ${status} persistence failed`);
125
+ uncaught(error);
163
126
  }
164
127
  }
165
- for (const room of unchanged) {
166
- const { unheldModel } = socket.rooms.standing(room.locator);
167
- if (!stored.has(room.locator) && unheldModel !== null) {
168
- socket.rooms.stand(room.locator, {
169
- unheldModel: { ...unheldModel, status },
170
- });
128
+ for (const [locator] of unchanged) {
129
+ const unheldModel = presence.unheldModel(locator);
130
+ if (!stored.has(locator) && unheldModel !== null) {
131
+ presence.modelled(locator, { ...unheldModel, status });
171
132
  }
172
- list(runtime, room, admitted(runtime, room));
173
133
  }
174
134
  if (unchanged.length > 0)
175
135
  emitRooms(runtime);
176
- return held.filter((room) => {
177
- const record = stored.get(room.locator)?.record;
178
- return (!unchanged.includes(room) && owed(record?.model ?? unheldModelOf(runtime, room.locator)));
179
- });
136
+ const kept = new Set(unchanged.map(([locator]) => locator));
137
+ return [...held].filter(([locator]) => !kept.has(locator) &&
138
+ owed(stored.get(locator)?.record.model ?? unheldModelOf(runtime, locator)));
180
139
  });
181
- for (const room of declaredAnew) {
182
- const model = await modelNow(runtime, room.locator);
140
+ for (const [locator, declaration] of declaredAnew) {
141
+ const model = await modelNow(runtime, locator);
183
142
  if (owed(model))
184
- await retainModel(runtime, local, room, { ...model, status });
143
+ await retainModel(runtime, locator, declaration, { ...model, status });
185
144
  }
186
145
  }
187
146
  export async function cachedModels(runtime, local) {
188
- const { store, socket } = runtime;
147
+ const { store, presence } = runtime;
189
148
  const held = await store.rooms();
190
- await settleModels(runtime, listedLocators(runtime, held).flatMap((locator) => {
191
- const room = socket.rooms.discovered(locator) ??
192
- declarationOf(runtime, locator, held.get(locator))?.room;
193
- return room === undefined ? [] : [room];
194
- }), 'cached', local);
149
+ await settleModels(runtime, new Map(listedLocators(runtime, held).flatMap((locator) => {
150
+ const discovered = presence.room(locator);
151
+ const declaration = discovered === undefined
152
+ ? declarationOf(runtime, locator, held.get(locator))?.room
153
+ : declared(discovered);
154
+ return declaration === undefined ? [] : [[locator, declaration]];
155
+ })), 'cached', local);
195
156
  }
package/dist/opened.d.ts CHANGED
@@ -18,5 +18,5 @@ export type OpenedFiles = {
18
18
  find(name: OpenedName): Promise<KeptBinary | null>;
19
19
  fetch(name: OpenedName, read: () => Promise<BinaryResult>): Promise<KeptResult>;
20
20
  };
21
- export declare function openedFiles(database: RuntimeDatabase, fenced: (locator: string) => boolean): OpenedFiles;
21
+ export declare function openedFiles(database: RuntimeDatabase, lost: (locator: string) => boolean): OpenedFiles;
22
22
  //# sourceMappingURL=opened.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"opened.d.ts","sourceRoot":"","sources":["../src/opened.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,OAAO,EAAoC,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAErF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,CAAC;AAEhF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACjF,CAAC;AAsBF,wBAAgB,WAAW,CACzB,QAAQ,EAAE,eAAe,EACzB,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,GACnC,WAAW,CAsFb"}
1
+ {"version":3,"file":"opened.d.ts","sourceRoot":"","sources":["../src/opened.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,OAAO,EAAoC,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAErF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,CAAC;AAEhF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACjF,CAAC;AAsBF,wBAAgB,WAAW,CACzB,QAAQ,EAAE,eAAe,EACzB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,GACjC,WAAW,CAsFb"}
package/dist/opened.js CHANGED
@@ -20,7 +20,7 @@ function taken(chunks, size) {
20
20
  }
21
21
  return part;
22
22
  }
23
- export function openedFiles(database, fenced) {
23
+ export function openedFiles(database, lost) {
24
24
  const fetching = new Map();
25
25
  async function find(name) {
26
26
  const held = await database.ask({ kind: 'opened.find', ...name });
@@ -41,7 +41,7 @@ export function openedFiles(database, fenced) {
41
41
  part += 1;
42
42
  };
43
43
  try {
44
- if (fenced(name.locator) ||
44
+ if (lost(name.locator) ||
45
45
  !(await database.ask({ kind: 'opened.begin', key, ...name, mediaType }))) {
46
46
  throw new Error();
47
47
  }
@@ -1 +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"}
1
+ {"version":3,"file":"opening.d.ts","sourceRoot":"","sources":["../src/opening.ts"],"names":[],"mappings":"AAOA,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"}
package/dist/opening.js CHANGED
@@ -1,8 +1,10 @@
1
1
  import { conversationsOpened } from './conversation.js';
2
2
  import { detectStorageLoss, nextGeneration, refusedForSpace } from './durability.js';
3
+ import { uncaught } from './failure.js';
3
4
  import { sweep } from './install.js';
4
5
  import { eraseFenced } from './lost.js';
5
6
  import { prepare } from './preparation.js';
7
+ import { unpair } from './queue.js';
6
8
  import { emitRooms, emitStorageLoss, statusShown } from './shown.js';
7
9
  export async function open(runtime, opened) {
8
10
  const { store, socket, journal, shell, conversations, build, usableWhenHeld } = runtime;
@@ -40,18 +42,18 @@ export async function open(runtime, opened) {
40
42
  await conversationsOpened(conversations, opened);
41
43
  if (interrupted.length > 0) {
42
44
  queueMicrotask(() => {
43
- void eraseFenced(runtime, interrupted).catch(() => {
45
+ void eraseFenced(runtime, interrupted).catch((error) => {
44
46
  journal.record('erasure failed');
47
+ uncaught(error);
45
48
  });
46
49
  });
47
50
  }
48
51
  statusShown(runtime);
49
52
  prepare(runtime);
50
53
  emitRooms(runtime);
51
- void store
52
- .exclusive(() => runtime.unpair(opened))
53
- .catch(() => {
54
+ void unpair(runtime).catch((error) => {
54
55
  journal.record('unpair failed');
56
+ uncaught(error);
55
57
  });
56
58
  return opened;
57
59
  }
package/dist/overlay.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type { BinaryFile, HeadChange } from './adapter.js';
2
+ import { type Composition } from './collection.js';
2
3
  import type { ChangeBatch } from './change.js';
3
4
  export type Heads = {
4
5
  revisions: Readonly<Record<string, string>>;
@@ -22,5 +23,5 @@ export type Layer = Heads & {
22
23
  export declare function acceptedBinaries(files: Readonly<Record<string, BinaryFile>>): Generator<readonly [string, HeldBinary]>;
23
24
  export declare function sameBinary(left: HeldBinary | undefined, right: HeldBinary | undefined): boolean;
24
25
  export declare function sameChange(left: HeadChange | undefined, right: HeadChange | undefined): boolean;
25
- export declare function overlaying(base: Layer, queue: readonly ChangeBatch[], unapplied?: () => void): Generator<number, Layer, void>;
26
+ export declare function overlaying(base: Layer, queue: readonly ChangeBatch[], composition: Composition, unapplied?: () => void): Generator<number, Layer, void>;
26
27
  //# sourceMappingURL=overlay.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../src/overlay.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC3D,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;AA6MD,wBAAiB,UAAU,CACzB,IAAI,EAAE,KAAK,EACX,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,SAAS,CAAC,EAAE,MAAM,IAAI,GACrB,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAsChC"}
1
+ {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../src/overlay.ts"],"names":[],"mappings":"AASA,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;AA+ND,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,4 +1,5 @@
1
- import { apply, frontmatterValue, parse, serialize, } from '@agentshouse/mdmodel';
1
+ import { apply, create, frontmatterValue, parse, serialize, TYPE_FIELD, } from '@agentshouse/mdmodel';
2
+ import { definitionsAt } from './collection.js';
2
3
  import { drafted, entriesIn, settling } from './shared.js';
3
4
  import { ROW_WEIGHT } from './turn.js';
4
5
  export function* acceptedBinaries(files) {
@@ -24,7 +25,6 @@ export function sameChange(left, right) {
24
25
  left.author?.id === right.author?.id &&
25
26
  left.author?.name === right.author?.name);
26
27
  }
27
- const EMPTY_FRONTMATTER = '---\n---\n';
28
28
  function isPart(change) {
29
29
  return change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble';
30
30
  }
@@ -53,16 +53,23 @@ function* priorsOf(preconditions) {
53
53
  preamble: (path) => preambles.get(path) ?? '',
54
54
  };
55
55
  }
56
- function compose(fields, sections) {
57
- const body = Object.entries(sections)
58
- .map(([name, value]) => `\n## ${name}\n${value}`)
59
- .join('');
60
- const skeleton = `${EMPTY_FRONTMATTER}${body}`;
61
- const opened = parse(skeleton);
62
- if (!opened.ok)
63
- return skeleton;
64
- const next = apply(opened.document, Object.entries(fields).flatMap(([name, value]) => frontmatterValue(value) ? [{ kind: 'field', name, value, prior: undefined }] : []));
65
- return serialize(next.outcome === 'applied' ? next.document : opened.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);
66
73
  }
67
74
  function edited(change, priors) {
68
75
  if (change.kind === 'field')
@@ -81,17 +88,19 @@ function edited(change, priors) {
81
88
  prior: priors.section(change.path, change.name),
82
89
  };
83
90
  }
84
- function edit(staged, changes, priors) {
91
+ function edit(staged, changes, priors, composition) {
85
92
  const path = changes[0].path;
86
93
  delete staged.revisions[path];
87
94
  const text = staged.documents[path];
88
95
  if (text === undefined)
89
96
  return changes.length;
90
- const parsed = parse(text, path);
97
+ const definitions = definitionsAt(composition, path);
98
+ const parsed = parse(text, path, definitions);
91
99
  if (!parsed.ok)
92
100
  return changes.length;
101
+ const definition = definitions(parsed.document.type);
93
102
  const wanted = changes.map((change) => edited(change, priors));
94
- const first = apply(parsed.document, wanted);
103
+ const first = apply(parsed.document, wanted, definition);
95
104
  if (first.outcome === 'refuse')
96
105
  return changes.length;
97
106
  if (first.outcome === 'applied') {
@@ -100,7 +109,7 @@ function edit(staged, changes, priors) {
100
109
  }
101
110
  const stale = new Set(first.stale);
102
111
  const kept = wanted.filter((_, at) => !stale.has(at));
103
- const rest = apply(parsed.document, kept);
112
+ const rest = apply(parsed.document, kept, definition);
104
113
  if (rest.outcome !== 'applied')
105
114
  return changes.length;
106
115
  staged.documents[path] = serialize(rest.document);
@@ -151,10 +160,12 @@ function erase(staged, path) {
151
160
  delete staged.changes[path];
152
161
  delete staged.binaries[path];
153
162
  }
154
- function stage(staged, change) {
163
+ function stage(staged, change, composition) {
155
164
  if (change.kind === 'create') {
156
165
  staged.documents[change.path] =
157
- '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);
158
169
  delete staged.fileIds[change.path];
159
170
  delete staged.created[change.path];
160
171
  delete staged.changes[change.path];
@@ -206,7 +217,7 @@ function arrive(heads, change) {
206
217
  if (change.change !== undefined)
207
218
  heads.changes[change.path] = change.change;
208
219
  }
209
- export function* overlaying(base, queue, unapplied) {
220
+ export function* overlaying(base, queue, composition, unapplied) {
210
221
  const staged = {
211
222
  documents: drafted(base.documents),
212
223
  binaries: drafted(base.binaries),
@@ -220,7 +231,7 @@ export function* overlaying(base, queue, unapplied) {
220
231
  for (let index = 0; index < batch.changes.length; index += 1) {
221
232
  const change = batch.changes[index];
222
233
  if (!isPart(change)) {
223
- if (!stage(staged, change))
234
+ if (!stage(staged, change, composition))
224
235
  unapplied?.();
225
236
  yield ROW_WEIGHT;
226
237
  continue;
@@ -234,7 +245,7 @@ export function* overlaying(base, queue, unapplied) {
234
245
  index += 1;
235
246
  }
236
247
  const text = staged.documents[change.path] ?? '';
237
- for (let left = edit(staged, run, priors); left > 0; left -= 1)
248
+ for (let left = edit(staged, run, priors, composition); left > 0; left -= 1)
238
249
  unapplied?.();
239
250
  yield ROW_WEIGHT + text.length;
240
251
  }
@@ -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
+ }