@agentshouse/mdruntime 0.1.0-c5f333dfa0583 → 0.1.0-c5fe3b2cddda7

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 (214) hide show
  1. package/README.md +10 -8
  2. package/dist/adapter.d.ts +39 -40
  3. package/dist/adapter.d.ts.map +1 -1
  4. package/dist/attached-model.d.ts +2 -1
  5. package/dist/attached-model.d.ts.map +1 -1
  6. package/dist/attached-model.js +28 -4
  7. package/dist/binary.d.ts +0 -5
  8. package/dist/binary.d.ts.map +1 -1
  9. package/dist/binary.js +1 -1
  10. package/dist/bootstrap.d.ts +16 -8
  11. package/dist/bootstrap.d.ts.map +1 -1
  12. package/dist/bootstrap.js +142 -94
  13. package/dist/change-set.d.ts +1 -7
  14. package/dist/change-set.d.ts.map +1 -1
  15. package/dist/change-set.js +1 -4
  16. package/dist/client.d.ts +6 -7
  17. package/dist/client.d.ts.map +1 -1
  18. package/dist/client.js +54 -7
  19. package/dist/collection.d.ts +5 -3
  20. package/dist/collection.d.ts.map +1 -1
  21. package/dist/collection.js +24 -19
  22. package/dist/compile.d.ts +6 -1
  23. package/dist/compile.d.ts.map +1 -1
  24. package/dist/compile.js +94 -33
  25. package/dist/connection.d.ts +8 -7
  26. package/dist/connection.d.ts.map +1 -1
  27. package/dist/connection.js +1160 -1151
  28. package/dist/conversation.d.ts +7 -5
  29. package/dist/conversation.d.ts.map +1 -1
  30. package/dist/conversation.js +171 -55
  31. package/dist/durability.d.ts +1 -5
  32. package/dist/durability.d.ts.map +1 -1
  33. package/dist/durability.js +5 -0
  34. package/dist/entry.d.ts +1 -0
  35. package/dist/entry.d.ts.map +1 -1
  36. package/dist/entry.js +1 -1
  37. package/dist/file.d.ts +2 -11
  38. package/dist/file.d.ts.map +1 -1
  39. package/dist/file.js +6 -4
  40. package/dist/fulltext.d.ts +27 -0
  41. package/dist/fulltext.d.ts.map +1 -0
  42. package/dist/fulltext.js +370 -0
  43. package/dist/host.d.ts +3 -4
  44. package/dist/host.d.ts.map +1 -1
  45. package/dist/host.js +42 -18
  46. package/dist/identity.d.ts +0 -1
  47. package/dist/identity.d.ts.map +1 -1
  48. package/dist/identity.js +0 -3
  49. package/dist/index.d.ts +10 -10
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +4 -3
  52. package/dist/live.d.ts.map +1 -1
  53. package/dist/live.js +2 -1
  54. package/dist/media.d.ts +8 -0
  55. package/dist/media.d.ts.map +1 -0
  56. package/dist/media.js +218 -0
  57. package/dist/memory.d.ts +3 -2
  58. package/dist/memory.d.ts.map +1 -1
  59. package/dist/memory.js +93 -38
  60. package/dist/messages.d.ts +28 -0
  61. package/dist/messages.d.ts.map +1 -0
  62. package/dist/messages.js +90 -0
  63. package/dist/model.d.ts +6 -1
  64. package/dist/model.d.ts.map +1 -1
  65. package/dist/model.js +7 -10
  66. package/dist/observation.d.ts +1 -0
  67. package/dist/observation.d.ts.map +1 -1
  68. package/dist/observation.js +1 -1
  69. package/dist/outcome.d.ts +13 -6
  70. package/dist/outcome.d.ts.map +1 -1
  71. package/dist/outcome.js +16 -5
  72. package/dist/overlay.js +1 -1
  73. package/dist/paths.d.ts +1 -0
  74. package/dist/paths.d.ts.map +1 -1
  75. package/dist/paths.js +4 -0
  76. package/dist/query.d.ts +10 -1
  77. package/dist/query.d.ts.map +1 -1
  78. package/dist/query.js +12 -1
  79. package/dist/reach.d.ts +8 -3
  80. package/dist/reach.d.ts.map +1 -1
  81. package/dist/reach.js +69 -46
  82. package/dist/readiness.d.ts +14 -15
  83. package/dist/readiness.d.ts.map +1 -1
  84. package/dist/readiness.js +2 -8
  85. package/dist/recovery.d.ts +1 -0
  86. package/dist/recovery.d.ts.map +1 -1
  87. package/dist/recovery.js +26 -0
  88. package/dist/refresh.d.ts +9 -4
  89. package/dist/refresh.d.ts.map +1 -1
  90. package/dist/refresh.js +64 -30
  91. package/dist/replica.d.ts +5 -5
  92. package/dist/replica.d.ts.map +1 -1
  93. package/dist/replica.js +4 -7
  94. package/dist/room-draft.d.ts +18 -2
  95. package/dist/room-draft.d.ts.map +1 -1
  96. package/dist/room-draft.js +73 -6
  97. package/dist/rows.d.ts +15 -6
  98. package/dist/rows.d.ts.map +1 -1
  99. package/dist/rows.js +102 -74
  100. package/dist/save.d.ts +2 -0
  101. package/dist/save.d.ts.map +1 -1
  102. package/dist/save.js +13 -7
  103. package/dist/search.d.ts +11 -43
  104. package/dist/search.d.ts.map +1 -1
  105. package/dist/search.js +0 -296
  106. package/dist/shared.d.ts +0 -1
  107. package/dist/shared.d.ts.map +1 -1
  108. package/dist/shared.js +0 -10
  109. package/dist/status.d.ts +4 -3
  110. package/dist/status.d.ts.map +1 -1
  111. package/dist/status.js +3 -1
  112. package/dist/store.d.ts +23 -58
  113. package/dist/store.d.ts.map +1 -1
  114. package/dist/store.js +37 -272
  115. package/dist/stored.d.ts +10 -23
  116. package/dist/stored.d.ts.map +1 -1
  117. package/dist/stored.js +217 -218
  118. package/dist/tables.d.ts +51 -46
  119. package/dist/tables.d.ts.map +1 -1
  120. package/dist/tables.js +94 -53
  121. package/dist/transfer.d.ts +0 -5
  122. package/dist/transfer.d.ts.map +1 -1
  123. package/dist/validation.d.ts +3 -4
  124. package/dist/validation.d.ts.map +1 -1
  125. package/dist/validation.js +35 -96
  126. package/dist/wire.d.ts +5 -5
  127. package/dist/wire.d.ts.map +1 -1
  128. package/dist/wire.js +2 -2
  129. package/dist/words.d.ts +19 -0
  130. package/dist/words.d.ts.map +1 -0
  131. package/dist/words.js +156 -0
  132. package/package.json +11 -19
  133. package/AGENTS.md +0 -312
  134. package/dist/chat/acts.d.ts +0 -33
  135. package/dist/chat/acts.d.ts.map +0 -1
  136. package/dist/chat/acts.js +0 -36
  137. package/dist/chat/context.d.ts +0 -3
  138. package/dist/chat/context.d.ts.map +0 -1
  139. package/dist/chat/context.js +0 -10
  140. package/dist/chat/earlier.d.ts +0 -10
  141. package/dist/chat/earlier.d.ts.map +0 -1
  142. package/dist/chat/earlier.js +0 -54
  143. package/dist/chat/house.d.ts +0 -25
  144. package/dist/chat/house.d.ts.map +0 -1
  145. package/dist/chat/house.js +0 -38
  146. package/dist/chat/input.d.ts +0 -11
  147. package/dist/chat/input.d.ts.map +0 -1
  148. package/dist/chat/input.js +0 -92
  149. package/dist/chat/kit.d.ts +0 -61
  150. package/dist/chat/kit.d.ts.map +0 -1
  151. package/dist/chat/kit.js +0 -123
  152. package/dist/chat/lasting.d.ts +0 -6
  153. package/dist/chat/lasting.d.ts.map +0 -1
  154. package/dist/chat/lasting.js +0 -19
  155. package/dist/chat/list.d.ts +0 -28
  156. package/dist/chat/list.d.ts.map +0 -1
  157. package/dist/chat/list.js +0 -103
  158. package/dist/chat/markdown.d.ts +0 -21
  159. package/dist/chat/markdown.d.ts.map +0 -1
  160. package/dist/chat/markdown.js +0 -246
  161. package/dist/chat/message.d.ts +0 -7
  162. package/dist/chat/message.d.ts.map +0 -1
  163. package/dist/chat/message.js +0 -254
  164. package/dist/chat/messages.d.ts +0 -35
  165. package/dist/chat/messages.d.ts.map +0 -1
  166. package/dist/chat/messages.js +0 -210
  167. package/dist/chat/name.d.ts +0 -7
  168. package/dist/chat/name.d.ts.map +0 -1
  169. package/dist/chat/name.js +0 -37
  170. package/dist/chat/opened.d.ts +0 -12
  171. package/dist/chat/opened.d.ts.map +0 -1
  172. package/dist/chat/opened.js +0 -19
  173. package/dist/chat/overlay.d.ts +0 -32
  174. package/dist/chat/overlay.d.ts.map +0 -1
  175. package/dist/chat/overlay.js +0 -103
  176. package/dist/chat/parts.d.ts +0 -58
  177. package/dist/chat/parts.d.ts.map +0 -1
  178. package/dist/chat/parts.js +0 -120
  179. package/dist/chat/pieces.d.ts +0 -62
  180. package/dist/chat/pieces.d.ts.map +0 -1
  181. package/dist/chat/pieces.js +0 -1110
  182. package/dist/chat/process.d.ts +0 -20
  183. package/dist/chat/process.d.ts.map +0 -1
  184. package/dist/chat/process.js +0 -32
  185. package/dist/chat/provider.d.ts +0 -70
  186. package/dist/chat/provider.d.ts.map +0 -1
  187. package/dist/chat/provider.js +0 -635
  188. package/dist/chat/question.d.ts +0 -9
  189. package/dist/chat/question.d.ts.map +0 -1
  190. package/dist/chat/question.js +0 -69
  191. package/dist/chat/questions.d.ts +0 -31
  192. package/dist/chat/questions.d.ts.map +0 -1
  193. package/dist/chat/questions.js +0 -111
  194. package/dist/chat/read.d.ts +0 -5
  195. package/dist/chat/read.d.ts.map +0 -1
  196. package/dist/chat/read.js +0 -13
  197. package/dist/chat/ready.d.ts +0 -37
  198. package/dist/chat/ready.d.ts.map +0 -1
  199. package/dist/chat/ready.js +0 -93
  200. package/dist/chat/room-file.d.ts +0 -8
  201. package/dist/chat/room-file.d.ts.map +0 -1
  202. package/dist/chat/room-file.js +0 -72
  203. package/dist/chat/steady.d.ts +0 -3
  204. package/dist/chat/steady.d.ts.map +0 -1
  205. package/dist/chat/steady.js +0 -26
  206. package/dist/chat/style.d.ts +0 -4
  207. package/dist/chat/style.d.ts.map +0 -1
  208. package/dist/chat/style.js +0 -307
  209. package/dist/chat.d.ts +0 -15
  210. package/dist/chat.d.ts.map +0 -1
  211. package/dist/chat.js +0 -8
  212. package/dist/reads.d.ts +0 -11
  213. package/dist/reads.d.ts.map +0 -1
  214. package/dist/reads.js +0 -98
@@ -1,6 +1,5 @@
1
- import type { ConversationAction, ConversationAgents, ConversationEvent, ConversationMessage, ConversationStream, ProcessCommand, SessionOption, TurnContext } from './adapter.js';
1
+ import type { ConversationAction, ConversationAgents, ConversationEvent, ConversationMessage, ConversationStream, ListedConversation, ProcessCommand, SessionOption, TurnContext } from './adapter.js';
2
2
  import { type ChangeSet } from './change-set.js';
3
- import { type ChosenFile } from './file.js';
4
3
  import type { Open } from './open.js';
5
4
  import { type CallResult, type Offline } from './outcome.js';
6
5
  import type { DocumentResult, PendingResult } from './query.js';
@@ -65,7 +64,6 @@ export type ConversationSurface = {
65
64
  read(conversation: string, options?: ConversationOptions): Promise<ConversationView>;
66
65
  create(input: unknown): Promise<CallResult>;
67
66
  send(conversation: string, operation?: string, draft?: ChatDraft): Promise<CallResult | Offline>;
68
- attach(room: string, file: ChosenFile): Promise<CallResult | Offline>;
69
67
  answer(conversation: string, answer: unknown): Promise<CallResult>;
70
68
  interrupt(conversation: string): Promise<CallResult>;
71
69
  kill(conversation: string): Promise<CallResult>;
@@ -85,6 +83,8 @@ export type ConversationDependencies = {
85
83
  stream(): ConversationStream | undefined;
86
84
  publish(set: ChangeSet): void;
87
85
  online(): boolean;
86
+ listed(): boolean;
87
+ full(): boolean;
88
88
  closed(): boolean;
89
89
  unanswered(): void;
90
90
  expired(operation: string): boolean;
@@ -92,13 +92,14 @@ export type ConversationDependencies = {
92
92
  export type ConversationStore = {
93
93
  surface: ConversationSurface;
94
94
  chatDraft: ChatDraftSurface;
95
- hydrate(held: readonly HeldConversation[], drafts: readonly ChatDraftRecord[]): void;
95
+ hydrate(held: readonly HeldConversation[], drafts: readonly ChatDraftRecord[], list: readonly ListedConversation[] | null): void;
96
96
  reconcile(): Promise<void>;
97
97
  catchUp(progress: CycleProgress): Promise<void>;
98
98
  resend(progress: CycleProgress): Promise<void>;
99
99
  current(): boolean;
100
100
  known(): boolean;
101
- reconnected(): void;
101
+ learned(): void;
102
+ declared(): void;
102
103
  reopened(): void;
103
104
  lost(): void;
104
105
  watch(conversation: string, options: ConversationOptions, deliver: (view: ConversationView) => void): () => void;
@@ -112,6 +113,7 @@ export type ConversationStore = {
112
113
  };
113
114
  export declare function unheldView(conversation: string): ConversationView;
114
115
  export declare const SESSION_STARTED = "Session started";
116
+ export declare const HISTORY_CONVERSATIONS = 64;
115
117
  export declare function newChat(agent: string): string;
116
118
  export declare function createConversationStore(deps: ConversationDependencies): ConversationStore;
117
119
  //# sourceMappingURL=conversation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EAEjB,mBAAmB,EACnB,kBAAkB,EAElB,cAAc,EACd,aAAa,EACb,WAAW,EAEZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAyB,KAAK,SAAS,EAAsB,MAAM,iBAAiB,CAAC;AAE5F,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAE1D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAW,KAAK,UAAU,EAAE,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAkB,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGlG,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAC;AAEpE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,iBAAiB,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;IAC1B,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAEnF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,SAAS,OAAO,EAAE,CAAC;IAC9B,OAAO,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACrC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;IACpC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAClC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACpC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,SAAS,EAAE,CAAC,SAAS,GAAG;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;CAC/D,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,IAAI,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACrF,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,CAAC;IACjG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,CAAC;IACtE,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACnE,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACrD,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAChE,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACnD,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChF,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,IAAI,kBAAkB,GAAG,SAAS,CAAC;IACzC,SAAS,CACP,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,OAAO,CAAC,cAAc,GAAG,aAAa,CAAC,CAAC;IAC3C,IAAI,CAAC,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACpE,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,IAAI,kBAAkB,GAAG,SAAS,CAAC;IACzC,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC9B,MAAM,IAAI,OAAO,CAAC;IAClB,MAAM,IAAI,OAAO,CAAC;IAClB,UAAU,IAAI,IAAI,CAAC;IACnB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,SAAS,EAAE,gBAAgB,CAAC;IAC5B,OAAO,CAAC,IAAI,EAAE,SAAS,gBAAgB,EAAE,EAAE,MAAM,EAAE,SAAS,eAAe,EAAE,GAAG,IAAI,CAAC;IACrF,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,OAAO,IAAI,OAAO,CAAC;IACnB,KAAK,IAAI,OAAO,CAAC;IACjB,WAAW,IAAI,IAAI,CAAC;IACpB,QAAQ,IAAI,IAAI,CAAC;IACjB,IAAI,IAAI,IAAI,CAAC;IACb,KAAK,CACH,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,GACxC,MAAM,IAAI,CAAC;IACd,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAChF,WAAW,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACjF,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC9B,OAAO,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC;IAC3C,UAAU,IAAI,SAAS,MAAM,EAAE,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;IACxC,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAyCF,wBAAgB,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,gBAAgB,CAcjE;AAED,eAAO,MAAM,eAAe,oBAAoB,CAAC;AAIjD,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7C;AA6PD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,wBAAwB,GAAG,iBAAiB,CA+3BzF"}
1
+ {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  import { conversationChangeSet } from './change-set.js';
2
2
  import { runtimeError } from './failure.js';
3
- import { declaredFile } from './file.js';
3
+ import { refusedForSpace } from './durability.js';
4
4
  import { changeBatchIdentity, chatDraftRevision } from './identity.js';
5
5
  import { OFFLINE } from './outcome.js';
6
+ import { untilAnswered } from './recovery.js';
6
7
  import { capped, cursorOf, decodedCursor, FROM_START, messageOrder, precedes } from './windows.js';
7
8
  const QUIET = {
8
9
  turn: null,
@@ -40,6 +41,7 @@ export function unheldView(conversation) {
40
41
  }
41
42
  export const SESSION_STARTED = 'Session started';
42
43
  const NEW_CHAT = 'new:';
44
+ export const HISTORY_CONVERSATIONS = 64;
43
45
  export function newChat(agent) {
44
46
  return `${NEW_CHAT}${agent}`;
45
47
  }
@@ -209,6 +211,12 @@ function askedOf(options) {
209
211
  return { limit: capped(limit), after, before: beforeOf(after), total: total === true };
210
212
  }
211
213
  const EXPIRED = { kind: 'rejected', code: 'expired', fields: {}, retryable: false };
214
+ const DURABLE_WRITE = {
215
+ kind: 'rejected',
216
+ code: 'durable-write',
217
+ fields: {},
218
+ retryable: true,
219
+ };
212
220
  function unwritten(draft) {
213
221
  return draft.text === '';
214
222
  }
@@ -250,11 +258,17 @@ export function createConversationStore(deps) {
250
258
  const listing = new Map();
251
259
  const creations = new Set();
252
260
  const listWatchers = new Set();
261
+ const unlisted = new Set();
253
262
  let listKnown = false;
263
+ let listHeld = false;
264
+ let listKept = false;
254
265
  const agentWatchers = new Set();
266
+ const unnamed = new Set();
267
+ let agentsKnown = false;
255
268
  let agentNames = new Map();
256
269
  let retiredAgents = new Set();
257
270
  let agentsRead = null;
271
+ let agentsFrom;
258
272
  let replicated = new Set();
259
273
  let handedReplicated;
260
274
  function liveOf(conversation) {
@@ -324,9 +338,6 @@ export function createConversationStore(deps) {
324
338
  }
325
339
  }
326
340
  }
327
- function changesOf(conversation, arriving) {
328
- return arriving.map(({ identity, text }) => ({ conversation, identity, text }));
329
- }
330
341
  function stateOf(conversation) {
331
342
  const facts = liveOf(conversation);
332
343
  if (facts.questions.length > 0)
@@ -346,12 +357,53 @@ export function createConversationStore(deps) {
346
357
  started: lives.get(entry.conversation)?.turn?.started ?? null,
347
358
  }));
348
359
  }
360
+ function keepList() {
361
+ if (!listKnown || listKept)
362
+ return;
363
+ listKept = true;
364
+ queueMicrotask(() => {
365
+ listKept = false;
366
+ if (deps.closed())
367
+ return;
368
+ const entries = [...listing.values()];
369
+ void deps.durably((local) => local.fact('conversationList', entries)).catch(() => { });
370
+ });
371
+ }
349
372
  function emitList() {
350
- if (deps.closed() || listWatchers.size === 0)
373
+ if (deps.closed())
351
374
  return;
352
- const value = entries();
353
- for (const watcher of listWatchers)
354
- watcher(value);
375
+ if (listWatchers.size > 0) {
376
+ const value = entries();
377
+ for (const watcher of listWatchers)
378
+ watcher(value);
379
+ }
380
+ learned();
381
+ }
382
+ function unlearnable() {
383
+ return !deps.online() || (deps.listed() && deps.agents() === undefined);
384
+ }
385
+ function learned() {
386
+ if (deps.closed())
387
+ return;
388
+ const named = agentsKnown || unlearnable();
389
+ if (unlisted.size > 0 &&
390
+ named &&
391
+ (listKnown || listHeld || deps.stream() === undefined || unlearnable())) {
392
+ const value = entries();
393
+ for (const watcher of [...unlisted]) {
394
+ unlisted.delete(watcher);
395
+ listWatchers.add(watcher);
396
+ watcher(value);
397
+ }
398
+ }
399
+ if (unnamed.size > 0 && named) {
400
+ const value = agents();
401
+ for (const watcher of [...unnamed]) {
402
+ unnamed.delete(watcher);
403
+ agentWatchers.add(watcher);
404
+ watcher(value);
405
+ }
406
+ }
355
407
  }
356
408
  function agents() {
357
409
  return [...agentNames]
@@ -382,6 +434,7 @@ export function createConversationStore(deps) {
382
434
  }
383
435
  async function readAgents() {
384
436
  const declaration = deps.agents();
437
+ agentsFrom = JSON.stringify(declaration);
385
438
  if (declaration === undefined)
386
439
  return;
387
440
  const names = new Map();
@@ -409,14 +462,18 @@ export function createConversationStore(deps) {
409
462
  break;
410
463
  after = read.next;
411
464
  }
465
+ agentsKnown = true;
412
466
  const named = JSON.stringify([...names]) !== JSON.stringify([...agentNames]);
413
- if (!named && JSON.stringify([...retired]) === JSON.stringify([...retiredAgents]))
467
+ if (!named && JSON.stringify([...retired]) === JSON.stringify([...retiredAgents])) {
468
+ learned();
414
469
  return;
470
+ }
415
471
  agentNames = names;
416
472
  retiredAgents = retired;
473
+ emitAgents();
417
474
  if (named)
418
475
  emitList();
419
- emitAgents();
476
+ learned();
420
477
  const ended = [...drafts.keys()].filter(retiredChat);
421
478
  if (ended.length > 0)
422
479
  await remove(ended);
@@ -485,12 +542,6 @@ export function createConversationStore(deps) {
485
542
  }
486
543
  async function remove(leaving) {
487
544
  await deps.durably(async (local) => {
488
- const removed = [];
489
- for (const conversation of leaving) {
490
- for (const identity of await local.messageIdentities(conversation)) {
491
- removed.push({ conversation, identity, text: null });
492
- }
493
- }
494
545
  await local.dropConversations(leaving);
495
546
  const changed = [];
496
547
  for (const conversation of leaving) {
@@ -507,9 +558,23 @@ export function createConversationStore(deps) {
507
558
  await slide(local, conversation, null);
508
559
  }
509
560
  if (changed.length > 0)
510
- deps.publish(conversationChangeSet(removed, changed));
561
+ deps.publish(conversationChangeSet(changed));
511
562
  });
512
563
  }
564
+ function missed(conversation) {
565
+ const read = reads.get(conversation);
566
+ const newest = listing.get(conversation)?.newest;
567
+ return (read === undefined ||
568
+ newest === undefined ||
569
+ partials.has(conversation) ||
570
+ (newest !== null && (read === null || newest > read)));
571
+ }
572
+ function noted(conversation, message) {
573
+ const entry = listing.get(conversation);
574
+ if (entry === undefined || (entry.newest !== null && entry.newest >= message.position))
575
+ return;
576
+ listing.set(conversation, { ...entry, newest: message.position });
577
+ }
513
578
  function gap(conversation) {
514
579
  gaps.set(conversation, (gaps.get(conversation) ?? 0) + 1);
515
580
  behind.add(conversation);
@@ -533,16 +598,17 @@ export function createConversationStore(deps) {
533
598
  reads.set(conversation, message.position);
534
599
  sealTurns(conversation, new Set([message.turn]));
535
600
  await slide(local, conversation, [message]);
536
- deps.publish(conversationChangeSet(changesOf(conversation, [message]), [conversation]));
601
+ deps.publish(conversationChangeSet([conversation]));
537
602
  });
538
603
  }
539
604
  async function readHistories(conversations, ended) {
540
605
  const generations = new Map(conversations.map((one) => [one, gaps.get(one) ?? 0]));
541
- let asking = conversations.map((conversation) => ({
606
+ let waiting = conversations.map((conversation) => ({
542
607
  conversation,
543
608
  after: reads.get(conversation) ?? undefined,
544
609
  }));
545
- while (asking.length > 0) {
610
+ while (waiting.length > 0) {
611
+ const asking = waiting.slice(0, HISTORY_CONVERSATIONS);
546
612
  const result = await deps.call('conversation.history', {
547
613
  conversations: asking.map(({ conversation, after }) => ({
548
614
  conversation,
@@ -566,7 +632,7 @@ export function createConversationStore(deps) {
566
632
  if (!following.some((next) => next.conversation === conversation))
567
633
  ended(conversation);
568
634
  }
569
- asking = following;
635
+ waiting = [...waiting.slice(HISTORY_CONVERSATIONS), ...following];
570
636
  }
571
637
  return null;
572
638
  }
@@ -609,7 +675,7 @@ export function createConversationStore(deps) {
609
675
  behind.delete(conversation);
610
676
  await slide(local, conversation, arriving);
611
677
  if (arriving.length > 0 || sealing || whole) {
612
- deps.publish(conversationChangeSet(changesOf(conversation, arriving), [conversation]));
678
+ deps.publish(conversationChangeSet([conversation]));
613
679
  }
614
680
  });
615
681
  }
@@ -657,8 +723,16 @@ export function createConversationStore(deps) {
657
723
  const arriving = acceptedMessage(event.message);
658
724
  if (arriving === null)
659
725
  return;
726
+ noted(conversation, arriving);
660
727
  if (replicated.has(conversation)) {
661
- void keep(conversation, arriving).catch(() => { });
728
+ if (deps.full()) {
729
+ gap(conversation);
730
+ return;
731
+ }
732
+ void keep(conversation, arriving).catch((error) => {
733
+ if (refusedForSpace(error))
734
+ gap(conversation);
735
+ });
662
736
  return;
663
737
  }
664
738
  if (sealTurns(conversation, new Set([arriving.turn])))
@@ -702,7 +776,7 @@ export function createConversationStore(deps) {
702
776
  drafts.set(from, left);
703
777
  for (const one of taken)
704
778
  drafts.set(to, one);
705
- deps.publish(conversationChangeSet([], [from, to]));
779
+ deps.publish(conversationChangeSet([from, to]));
706
780
  });
707
781
  }
708
782
  function withDraft(conversation, next) {
@@ -711,7 +785,7 @@ export function createConversationStore(deps) {
711
785
  if (following === undefined)
712
786
  return;
713
787
  await kept(local, conversation, following);
714
- deps.publish(conversationChangeSet([], [conversation]));
788
+ deps.publish(conversationChangeSet([conversation]));
715
789
  });
716
790
  }
717
791
  async function submitted(conversation, operation, draft) {
@@ -743,13 +817,14 @@ export function createConversationStore(deps) {
743
817
  });
744
818
  }
745
819
  async function dispatched(conversation, submission) {
746
- const dispatch = {};
820
+ const dispatch = { answered: false };
747
821
  sending.set(submission.operation, dispatch);
748
822
  try {
749
823
  const result = await invoke('conversation.send', conversation, {
750
824
  text: submission.text,
751
825
  operation_id: submission.operation,
752
826
  });
827
+ dispatch.answered = result.kind !== 'transport-uncertainty';
753
828
  if (result.kind === 'revoked-authorization')
754
829
  return result;
755
830
  if (result.kind !== 'action' && result.retryable) {
@@ -782,7 +857,15 @@ export function createConversationStore(deps) {
782
857
  const surface = {
783
858
  async list() {
784
859
  await agentsReady();
785
- return entries();
860
+ return new Promise((settle) => {
861
+ const answer = (listed) => {
862
+ unlisted.delete(answer);
863
+ listWatchers.delete(answer);
864
+ settle(listed);
865
+ };
866
+ unlisted.add(answer);
867
+ learned();
868
+ });
786
869
  },
787
870
  async read(conversation, options = {}) {
788
871
  const asked = askedOf(options);
@@ -805,8 +888,17 @@ export function createConversationStore(deps) {
805
888
  return result;
806
889
  },
807
890
  async send(conversation, operation = changeBatchIdentity(), draft) {
891
+ if (deps.full())
892
+ return DURABLE_WRITE;
808
893
  if (deps.online()) {
809
- const { submission, earlier } = await submitted(conversation, operation, draft);
894
+ const held = await submitted(conversation, operation, draft).catch((error) => {
895
+ if (refusedForSpace(error))
896
+ return null;
897
+ throw error;
898
+ });
899
+ if (held === null)
900
+ return DURABLE_WRITE;
901
+ const { submission, earlier } = held;
810
902
  if (!earlier || !deps.expired(operation))
811
903
  return dispatched(conversation, submission);
812
904
  await forgotten(conversation, submission);
@@ -819,15 +911,6 @@ export function createConversationStore(deps) {
819
911
  }
820
912
  return OFFLINE;
821
913
  },
822
- async attach(room, file) {
823
- if (!deps.online())
824
- return OFFLINE;
825
- return deps.call('conversation.attach', {
826
- room,
827
- ...(await declaredFile(file)),
828
- blob: file.blob,
829
- });
830
- },
831
914
  answer(conversation, answer) {
832
915
  return invoke('conversation.answer', conversation, { answer });
833
916
  },
@@ -879,7 +962,13 @@ export function createConversationStore(deps) {
879
962
  return {
880
963
  surface,
881
964
  chatDraft,
882
- hydrate(held, kept) {
965
+ hydrate(held, kept, list) {
966
+ if (list !== null && !listKnown) {
967
+ listing.clear();
968
+ for (const entry of list)
969
+ listing.set(entry.conversation, { ...entry });
970
+ listHeld = true;
971
+ }
883
972
  stored.clear();
884
973
  reads.clear();
885
974
  partials.clear();
@@ -893,6 +982,8 @@ export function createConversationStore(deps) {
893
982
  drafts.clear();
894
983
  for (const record of kept)
895
984
  drafts.set(record.conversation, record);
985
+ if (listHeld)
986
+ learned();
896
987
  },
897
988
  async reconcile() {
898
989
  if (!listKnown)
@@ -904,7 +995,7 @@ export function createConversationStore(deps) {
904
995
  !creations.has(conversation) &&
905
996
  (!conversation.startsWith(NEW_CHAT) || retiredChat(conversation)));
906
997
  for (const conversation of named) {
907
- if (!replicated.has(conversation))
998
+ if (!replicated.has(conversation) && missed(conversation))
908
999
  behind.add(conversation);
909
1000
  }
910
1001
  replicated = named;
@@ -913,6 +1004,11 @@ export function createConversationStore(deps) {
913
1004
  await remove(leaving);
914
1005
  },
915
1006
  async catchUp(progress) {
1007
+ if (deps.full()) {
1008
+ if (behind.size > 0)
1009
+ progress.complete = false;
1010
+ return;
1011
+ }
916
1012
  const owed = (conversation) => behind.has(conversation) && replicated.has(conversation);
917
1013
  const read = async (conversations) => {
918
1014
  if (conversations.length === 0 || deps.closed())
@@ -961,12 +1057,10 @@ export function createConversationStore(deps) {
961
1057
  known() {
962
1058
  return listKnown;
963
1059
  },
964
- reconnected() {
965
- for (const conversation of replicated)
966
- gap(conversation);
967
- },
968
1060
  reopened() {
969
- sending.clear();
1061
+ for (const [operation, dispatch] of sending)
1062
+ if (!dispatch.answered)
1063
+ sending.delete(operation);
970
1064
  },
971
1065
  lost() {
972
1066
  catching.clear();
@@ -985,15 +1079,15 @@ export function createConversationStore(deps) {
985
1079
  views.set(key, view);
986
1080
  const watcher = { notify: deliver, ready: false };
987
1081
  view.watchers.add(watcher);
988
- void deps
989
- .durably(async (local) => {
1082
+ const reading = new AbortController();
1083
+ void untilAnswered(() => deps.durably(async (local) => {
990
1084
  if (view.window !== null)
991
1085
  return;
992
1086
  const { messages, more } = await local.messageWindow(conversation, asked.limit, asked.before);
993
1087
  view.window = messages;
994
1088
  view.more = more;
995
1089
  view.total = asked.total ? await local.messageCount(conversation) : null;
996
- })
1090
+ }), reading.signal)
997
1091
  .then(() => {
998
1092
  if (deps.closed() || !view.watchers.has(watcher))
999
1093
  return;
@@ -1003,6 +1097,7 @@ export function createConversationStore(deps) {
1003
1097
  })
1004
1098
  .catch(() => { });
1005
1099
  return () => {
1100
+ reading.abort();
1006
1101
  if (!view.watchers.delete(watcher))
1007
1102
  return;
1008
1103
  if (view.watchers.size === 0)
@@ -1010,25 +1105,35 @@ export function createConversationStore(deps) {
1010
1105
  };
1011
1106
  },
1012
1107
  watchList(deliver) {
1013
- listWatchers.add(deliver);
1108
+ let ended = false;
1014
1109
  void agentsReady().then(() => {
1015
- if (!deps.closed() && listWatchers.has(deliver))
1016
- deliver(entries());
1110
+ if (ended)
1111
+ return;
1112
+ unlisted.add(deliver);
1113
+ learned();
1017
1114
  });
1018
1115
  return () => {
1116
+ ended = true;
1117
+ unlisted.delete(deliver);
1019
1118
  listWatchers.delete(deliver);
1020
1119
  };
1021
1120
  },
1022
1121
  watchAgents(deliver) {
1023
- agentWatchers.add(deliver);
1024
- void agentsReady().then(() => {
1025
- if (!deps.closed() && agentWatchers.has(deliver))
1026
- deliver(agents());
1027
- });
1122
+ unnamed.add(deliver);
1123
+ void agentsReady().then(learned);
1028
1124
  return () => {
1125
+ unnamed.delete(deliver);
1029
1126
  agentWatchers.delete(deliver);
1030
1127
  };
1031
1128
  },
1129
+ learned,
1130
+ declared() {
1131
+ if (JSON.stringify(deps.agents()) === agentsFrom)
1132
+ return;
1133
+ agentsRead = readAgents().catch(() => {
1134
+ agentsRead = null;
1135
+ });
1136
+ },
1032
1137
  changed(set) {
1033
1138
  for (const conversation of set.conversations)
1034
1139
  emit(conversation);
@@ -1051,6 +1156,14 @@ export function createConversationStore(deps) {
1051
1156
  creations.delete(entry.conversation);
1052
1157
  }
1053
1158
  listKnown = true;
1159
+ for (const conversation of replicated) {
1160
+ if (!listing.has(conversation))
1161
+ continue;
1162
+ if (!missed(conversation))
1163
+ behind.delete(conversation);
1164
+ else if (!behind.has(conversation))
1165
+ gap(conversation);
1166
+ }
1054
1167
  openingEnded();
1055
1168
  }
1056
1169
  else if (event.kind === 'listed') {
@@ -1060,6 +1173,7 @@ export function createConversationStore(deps) {
1060
1173
  else {
1061
1174
  listing.delete(event.conversation);
1062
1175
  }
1176
+ keepList();
1063
1177
  emitList();
1064
1178
  return (event.kind !== 'list' &&
1065
1179
  listKnown &&
@@ -1080,7 +1194,9 @@ export function createConversationStore(deps) {
1080
1194
  lives.clear();
1081
1195
  unsent.clear();
1082
1196
  listWatchers.clear();
1197
+ unlisted.clear();
1083
1198
  agentWatchers.clear();
1199
+ unnamed.clear();
1084
1200
  },
1085
1201
  };
1086
1202
  }
@@ -1,16 +1,12 @@
1
1
  import type { Persistence } from './readiness.js';
2
- export type StorageEstimate = {
3
- readonly usage: number;
4
- readonly total: number;
5
- };
6
2
  export type RuntimeShell = {
7
3
  persistence: Persistence;
8
4
  generation: string | null;
9
5
  keepGeneration(value: string): void | Promise<void>;
10
6
  dropGeneration(): void | Promise<void>;
11
- estimate?(): Promise<StorageEstimate | null>;
12
7
  cleanUp?(): Promise<number>;
13
8
  };
9
+ export declare function refusedForSpace(error: unknown): boolean;
14
10
  export declare function detectStorageLoss(stored: string | null, reported: string | null): string | null;
15
11
  export declare function nextGeneration(stored: string | null, reported: string | null): string;
16
12
  //# sourceMappingURL=durability.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"durability.d.ts","sourceRoot":"","sources":["../src/durability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAIlD,MAAM,MAAM,eAAe,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjF,MAAM,MAAM,YAAY,GAAG;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,cAAc,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,QAAQ,CAAC,IAAI,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IAC7C,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC7B,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAG/F;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAGrF"}
1
+ {"version":3,"file":"durability.d.ts","sourceRoot":"","sources":["../src/durability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAIlD,MAAM,MAAM,YAAY,GAAG;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,cAAc,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC7B,CAAC;AAEF,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAMvD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAG/F;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAGrF"}
@@ -1,4 +1,9 @@
1
1
  const STORAGE_LOSS_CODE = 'storage-loss';
2
+ export function refusedForSpace(error) {
3
+ return (typeof error === 'object' &&
4
+ error !== null &&
5
+ error.name === 'QuotaExceededError');
6
+ }
2
7
  export function detectStorageLoss(stored, reported) {
3
8
  if (reported === null || reported === stored)
4
9
  return null;
package/dist/entry.d.ts CHANGED
@@ -6,6 +6,7 @@ export type EntryRoom = {
6
6
  locator: string;
7
7
  schema: string | null;
8
8
  documents: Readonly<Record<string, string>>;
9
+ revisions?: Readonly<Record<string, string>>;
9
10
  };
10
11
  export type EntryArguments = Readonly<Record<string, string>>;
11
12
  export type EntryParameterKind = 'string' | 'integer' | 'number' | 'boolean';
@@ -1 +1 @@
1
- {"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAK1D,OAAO,EAML,KAAK,SAAS,EAEf,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE9D,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AA0D7E,wBAAgB,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAE3E;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAMpE;AAkCD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAQ7D;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;CACzF,CAAC;AAEF,wBAAgB,UAAU,CACxB,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,UAAU,GACrB,UAAU,CAmDZ"}
1
+ {"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAK1D,OAAO,EAML,KAAK,SAAS,EAEf,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE9D,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AA0D7E,wBAAgB,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAE3E;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAMpE;AAkCD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAQ7D;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;CACzF,CAAC;AAEF,wBAAgB,UAAU,CACxB,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,UAAU,GACrB,UAAU,CAmDZ"}
package/dist/entry.js CHANGED
@@ -130,7 +130,7 @@ export function entryScope(rooms, roomTypes, connection) {
130
130
  path,
131
131
  content: room.documents[path],
132
132
  binary: null,
133
- revision: null,
133
+ revision: room.revisions?.[path] ?? null,
134
134
  fileId: null,
135
135
  change: null,
136
136
  written: null,
package/dist/file.d.ts CHANGED
@@ -1,12 +1,3 @@
1
- export type ChosenFile = {
2
- name: string;
3
- blob: Blob;
4
- };
5
- export type FileDeclaration = {
6
- name: string;
7
- mediaType: string;
8
- byteLength: number;
9
- contentHash: string;
10
- };
11
- export declare function declaredFile(file: ChosenFile): Promise<FileDeclaration>;
1
+ import type { AttachRequest } from './adapter.js';
2
+ export declare function attachedFile(locator: string, file: File): Promise<AttachRequest>;
12
3
  //# sourceMappingURL=file.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../src/file.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,wBAAsB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,CAO7E"}
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../src/file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGlD,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,CAStF"}
package/dist/file.js CHANGED
@@ -1,9 +1,11 @@
1
1
  import { sha256 } from './digest.js';
2
- export async function declaredFile(file) {
2
+ export async function attachedFile(locator, file) {
3
3
  return {
4
+ locator,
4
5
  name: file.name,
5
- mediaType: file.blob.type,
6
- byteLength: file.blob.size,
7
- contentHash: await sha256(file.blob),
6
+ mediaType: file.type,
7
+ byteLength: file.size,
8
+ sha256: await sha256(file),
9
+ blob: file,
8
10
  };
9
11
  }