@agentshouse/mdruntime 0.1.0-c3903a68dcbbf → 0.1.0-c56daf494ecb4

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 (178) hide show
  1. package/AGENTS.md +184 -92
  2. package/README.md +22 -12
  3. package/dist/adapter.d.ts +125 -63
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/adapter.js +1 -9
  6. package/dist/attached-model.d.ts +11 -0
  7. package/dist/attached-model.d.ts.map +1 -0
  8. package/dist/attached-model.js +47 -0
  9. package/dist/attempt.d.ts +16 -0
  10. package/dist/attempt.d.ts.map +1 -0
  11. package/dist/attempt.js +70 -0
  12. package/dist/binary.d.ts +23 -0
  13. package/dist/binary.d.ts.map +1 -0
  14. package/dist/binary.js +8 -0
  15. package/dist/bootstrap.d.ts +20 -6
  16. package/dist/bootstrap.d.ts.map +1 -1
  17. package/dist/bootstrap.js +93 -39
  18. package/dist/change-set.d.ts.map +1 -1
  19. package/dist/change-set.js +20 -17
  20. package/dist/change.d.ts +15 -0
  21. package/dist/change.d.ts.map +1 -1
  22. package/dist/change.js +26 -1
  23. package/dist/chat/acts.d.ts +34 -0
  24. package/dist/chat/acts.d.ts.map +1 -0
  25. package/dist/chat/acts.js +36 -0
  26. package/dist/chat/context.d.ts +3 -0
  27. package/dist/chat/context.d.ts.map +1 -0
  28. package/dist/chat/context.js +10 -0
  29. package/dist/chat/input.d.ts +9 -0
  30. package/dist/chat/input.d.ts.map +1 -0
  31. package/dist/chat/input.js +99 -0
  32. package/dist/chat/kit.d.ts +60 -0
  33. package/dist/chat/kit.d.ts.map +1 -0
  34. package/dist/chat/kit.js +123 -0
  35. package/dist/chat/lasting.d.ts +6 -0
  36. package/dist/chat/lasting.d.ts.map +1 -0
  37. package/dist/chat/lasting.js +19 -0
  38. package/dist/chat/list.d.ts +26 -0
  39. package/dist/chat/list.d.ts.map +1 -0
  40. package/dist/chat/list.js +62 -0
  41. package/dist/chat/markdown.d.ts +20 -0
  42. package/dist/chat/markdown.d.ts.map +1 -0
  43. package/dist/chat/markdown.js +188 -0
  44. package/dist/chat/message.d.ts +6 -0
  45. package/dist/chat/message.d.ts.map +1 -0
  46. package/dist/chat/message.js +192 -0
  47. package/dist/chat/messages.d.ts +21 -0
  48. package/dist/chat/messages.d.ts.map +1 -0
  49. package/dist/chat/messages.js +151 -0
  50. package/dist/chat/name.d.ts +6 -0
  51. package/dist/chat/name.d.ts.map +1 -0
  52. package/dist/chat/name.js +37 -0
  53. package/dist/chat/opened.d.ts +11 -0
  54. package/dist/chat/opened.d.ts.map +1 -0
  55. package/dist/chat/opened.js +17 -0
  56. package/dist/chat/overlay.d.ts +31 -0
  57. package/dist/chat/overlay.d.ts.map +1 -0
  58. package/dist/chat/overlay.js +97 -0
  59. package/dist/chat/parts.d.ts +57 -0
  60. package/dist/chat/parts.d.ts.map +1 -0
  61. package/dist/chat/parts.js +119 -0
  62. package/dist/chat/process.d.ts +20 -0
  63. package/dist/chat/process.d.ts.map +1 -0
  64. package/dist/chat/process.js +32 -0
  65. package/dist/chat/provider.d.ts +63 -0
  66. package/dist/chat/provider.d.ts.map +1 -0
  67. package/dist/chat/provider.js +645 -0
  68. package/dist/chat/question.d.ts +9 -0
  69. package/dist/chat/question.d.ts.map +1 -0
  70. package/dist/chat/question.js +80 -0
  71. package/dist/chat/questions.d.ts +31 -0
  72. package/dist/chat/questions.d.ts.map +1 -0
  73. package/dist/chat/questions.js +111 -0
  74. package/dist/chat/read.d.ts +5 -0
  75. package/dist/chat/read.d.ts.map +1 -0
  76. package/dist/chat/read.js +13 -0
  77. package/dist/chat/ready.d.ts +33 -0
  78. package/dist/chat/ready.d.ts.map +1 -0
  79. package/dist/chat/ready.js +91 -0
  80. package/dist/chat/style.d.ts +4 -0
  81. package/dist/chat/style.d.ts.map +1 -0
  82. package/dist/chat/style.js +302 -0
  83. package/dist/chat.d.ts +14 -0
  84. package/dist/chat.d.ts.map +1 -0
  85. package/dist/chat.js +8 -0
  86. package/dist/client.d.ts +17 -13
  87. package/dist/client.d.ts.map +1 -1
  88. package/dist/client.js +68 -31
  89. package/dist/collection.d.ts +6 -13
  90. package/dist/collection.d.ts.map +1 -1
  91. package/dist/collection.js +56 -29
  92. package/dist/connection.d.ts +28 -33
  93. package/dist/connection.d.ts.map +1 -1
  94. package/dist/connection.js +951 -745
  95. package/dist/conversation.d.ts +32 -13
  96. package/dist/conversation.d.ts.map +1 -1
  97. package/dist/conversation.js +293 -108
  98. package/dist/entry.d.ts +17 -0
  99. package/dist/entry.d.ts.map +1 -0
  100. package/dist/entry.js +156 -0
  101. package/dist/expectation.d.ts +21 -0
  102. package/dist/expectation.d.ts.map +1 -0
  103. package/dist/expectation.js +70 -0
  104. package/dist/failure.d.ts +13 -0
  105. package/dist/failure.d.ts.map +1 -0
  106. package/dist/failure.js +19 -0
  107. package/dist/host.d.ts +9 -3
  108. package/dist/host.d.ts.map +1 -1
  109. package/dist/host.js +49 -68
  110. package/dist/identity.d.ts +3 -0
  111. package/dist/identity.d.ts.map +1 -1
  112. package/dist/identity.js +13 -1
  113. package/dist/index.d.ts +9 -5
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.js +3 -1
  116. package/dist/memory.d.ts +14 -7
  117. package/dist/memory.d.ts.map +1 -1
  118. package/dist/memory.js +137 -46
  119. package/dist/model.d.ts +13 -12
  120. package/dist/model.d.ts.map +1 -1
  121. package/dist/model.js +6 -3
  122. package/dist/observation.d.ts +2 -0
  123. package/dist/observation.d.ts.map +1 -1
  124. package/dist/observation.js +24 -14
  125. package/dist/open.d.ts +2 -0
  126. package/dist/open.d.ts.map +1 -0
  127. package/dist/open.js +1 -0
  128. package/dist/outcome.d.ts +32 -23
  129. package/dist/outcome.d.ts.map +1 -1
  130. package/dist/outcome.js +41 -1
  131. package/dist/overlay.d.ts +14 -3
  132. package/dist/overlay.d.ts.map +1 -1
  133. package/dist/overlay.js +75 -37
  134. package/dist/paths.d.ts +0 -1
  135. package/dist/paths.d.ts.map +1 -1
  136. package/dist/paths.js +0 -16
  137. package/dist/query.d.ts +12 -3
  138. package/dist/query.d.ts.map +1 -1
  139. package/dist/query.js +78 -36
  140. package/dist/reach.d.ts +42 -0
  141. package/dist/reach.d.ts.map +1 -0
  142. package/dist/reach.js +294 -0
  143. package/dist/react.d.ts +41 -0
  144. package/dist/react.d.ts.map +1 -0
  145. package/dist/react.js +64 -0
  146. package/dist/read-side.d.ts +4 -0
  147. package/dist/read-side.d.ts.map +1 -1
  148. package/dist/read-side.js +125 -56
  149. package/dist/refresh.d.ts +12 -1
  150. package/dist/refresh.d.ts.map +1 -1
  151. package/dist/refresh.js +44 -36
  152. package/dist/replica.d.ts +9 -6
  153. package/dist/replica.d.ts.map +1 -1
  154. package/dist/replica.js +83 -68
  155. package/dist/room-draft.d.ts +29 -9
  156. package/dist/room-draft.d.ts.map +1 -1
  157. package/dist/room-draft.js +137 -26
  158. package/dist/rows.d.ts +7 -2
  159. package/dist/rows.d.ts.map +1 -1
  160. package/dist/rows.js +85 -40
  161. package/dist/save.d.ts +27 -3
  162. package/dist/save.d.ts.map +1 -1
  163. package/dist/save.js +435 -86
  164. package/dist/search.d.ts +3 -2
  165. package/dist/search.d.ts.map +1 -1
  166. package/dist/status.d.ts +2 -2
  167. package/dist/status.d.ts.map +1 -1
  168. package/dist/status.js +0 -8
  169. package/dist/store.d.ts +41 -25
  170. package/dist/store.d.ts.map +1 -1
  171. package/dist/store.js +315 -191
  172. package/dist/wire.d.ts +58 -19
  173. package/dist/wire.d.ts.map +1 -1
  174. package/dist/wire.js +65 -67
  175. package/package.json +31 -7
  176. package/dist/attachment.d.ts +0 -3
  177. package/dist/attachment.d.ts.map +0 -1
  178. package/dist/attachment.js +0 -8
package/dist/memory.d.ts CHANGED
@@ -1,16 +1,17 @@
1
1
  import type { ModelResult } from './model.js';
2
- import { type AcceptedMessage, type ActionResult, type Adapter, type Capability, type ConversationAction, type ConversationEvent, type DiscoveredRoom, type HeadChange, type MdModelIdentity, type ProviderLimit, type Retention, type RoomAttachment, type RoomVersionNotification, type ServiceMode } from './adapter.js';
2
+ import { type AcceptedMessage, type ActionResult, type Adapter, type BinaryFile, type Capability, type ConversationAction, type ConversationEvent, type DiscoveredRoom, type HeadChange, type ListedConversation, type Member, type ProviderLimit, type Retention, type ServiceMode } from './adapter.js';
3
3
  export type MemoryRoom = DiscoveredRoom & {
4
4
  model?: ModelResult;
5
5
  selectionModel?: ModelResult;
6
6
  documents?: Readonly<Record<string, string>>;
7
7
  revisions?: Readonly<Record<string, string>>;
8
8
  changes?: Readonly<Record<string, HeadChange>>;
9
- binaryTargets?: readonly string[];
10
- attachments?: readonly RoomAttachment[];
9
+ binaryFiles?: Readonly<Record<string, BinaryFile>>;
10
+ blobs?: Readonly<Record<string, Blob>>;
11
11
  };
12
12
  export type MemoryConversation = {
13
13
  conversation: string;
14
+ listed?: Omit<ListedConversation, 'conversation'>;
14
15
  messages?: readonly AcceptedMessage[];
15
16
  outcomes?: Partial<Record<ConversationAction, ActionResult>>;
16
17
  };
@@ -19,20 +20,26 @@ export type MemoryAdapterOptions = {
19
20
  conversations?: readonly MemoryConversation[];
20
21
  historyPageSize?: number;
21
22
  pageSize?: number;
22
- mdModel?: MdModelIdentity;
23
- supportedVersions?: readonly number[];
24
23
  capabilities?: readonly Capability[];
25
24
  providerLimits?: readonly ProviderLimit[];
26
25
  retention?: Retention;
26
+ member?: Member;
27
+ unopened?: boolean;
27
28
  };
28
29
  export type MemoryAdapter = Adapter & {
29
30
  setRooms(rooms: readonly MemoryRoom[]): void;
30
31
  setConversations(conversations: readonly MemoryConversation[]): void;
31
32
  script(operation: keyof Adapter, answer: unknown): void;
32
- notifyRoomVersion(notification: RoomVersionNotification): void;
33
+ open(): void;
34
+ close(revoked?: boolean): void;
35
+ expire(locators: readonly string[]): void;
36
+ notifyRoomVersion(notification: {
37
+ locator: string;
38
+ roomVersion: string;
39
+ }): void;
33
40
  notifyConversation(event: ConversationEvent): void;
34
41
  notifyServiceMode(mode: ServiceMode): void;
35
- selectedRooms(): readonly string[];
42
+ heldRooms(): readonly string[];
36
43
  replicatedConversations(): readonly string[];
37
44
  };
38
45
  export declare function createMemoryAdapter(options?: MemoryAdapterOptions): MemoryAdapter;
@@ -1 +1 @@
1
- {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAEL,KAAK,eAAe,EAEpB,KAAK,YAAY,EACjB,KAAK,OAAO,EAIZ,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EAItB,KAAK,cAAc,EACnB,KAAK,UAAU,EAGf,KAAK,eAAe,EAGpB,KAAK,aAAa,EAGlB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC5B,KAAK,WAAW,EACjB,MAAM,cAAc,CAAC;AAmBtB,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG;IACxC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,cAAc,CAAC,EAAE,WAAW,CAAC;IAC7B,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7C,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/C,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,WAAW,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC,CAAC;CAC9D,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAC9B,aAAa,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC9C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,YAAY,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACrC,cAAc,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC1C,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,IAAI,CAAC;IAC7C,gBAAgB,CAAC,aAAa,EAAE,SAAS,kBAAkB,EAAE,GAAG,IAAI,CAAC;IACrE,MAAM,CAAC,SAAS,EAAE,MAAM,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACxD,iBAAiB,CAAC,YAAY,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC/D,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnD,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3C,aAAa,IAAI,SAAS,MAAM,EAAE,CAAC;IACnC,uBAAuB,IAAI,SAAS,MAAM,EAAE,CAAC;CAC9C,CAAC;AA+BF,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG,aAAa,CAkZrF"}
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
package/dist/memory.js CHANGED
@@ -1,5 +1,3 @@
1
- import { ROOM_CONTRACT_VERSION, } from './adapter.js';
2
- import { MD_MODEL } from './collection.js';
3
1
  import { sameChange } from './overlay.js';
4
2
  const FIXTURE_RETENTION = {
5
3
  history: { kind: 'duration', seconds: 1 },
@@ -15,6 +13,19 @@ function declaredRetention(value) {
15
13
  }
16
14
  throw new Error('history retention duration must be a finite positive number of seconds');
17
15
  }
16
+ const MODEL_ABSENT = { kind: 'model-unavailable', reason: 'not-readable' };
17
+ function modelsOf(room) {
18
+ return {
19
+ collection: room.model ?? MODEL_ABSENT,
20
+ ...(room.typedSelection === undefined
21
+ ? {}
22
+ : { selection: room.selectionModel ?? MODEL_ABSENT }),
23
+ };
24
+ }
25
+ function changedModels(room, from) {
26
+ const now = modelsOf(room);
27
+ return JSON.stringify(now) === JSON.stringify(modelsOf(from)) ? undefined : now;
28
+ }
18
29
  function named(source, paths) {
19
30
  const taken = {};
20
31
  for (const path of paths) {
@@ -31,8 +42,6 @@ async function resolveScript(answer, fallback, request) {
31
42
  }
32
43
  export function createMemoryAdapter(options = {}) {
33
44
  let rooms = options.rooms === undefined ? [] : [...options.rooms];
34
- const mdModel = options.mdModel ?? MD_MODEL;
35
- const supportedVersions = options.supportedVersions ?? [ROOM_CONTRACT_VERSION];
36
45
  const capabilities = options.capabilities ?? [];
37
46
  const providerLimits = options.providerLimits ?? [];
38
47
  const retention = declaredRetention(options.retention);
@@ -47,7 +56,8 @@ export function createMemoryAdapter(options = {}) {
47
56
  const unsealed = new Map();
48
57
  const sealed = new Set();
49
58
  const historyPageSize = options.historyPageSize;
50
- let selected = [];
59
+ let held = [];
60
+ let expiring = [];
51
61
  let replicated = [];
52
62
  let issued = 0;
53
63
  function scriptConversations(entries) {
@@ -89,37 +99,38 @@ export function createMemoryAdapter(options = {}) {
89
99
  return {
90
100
  name: room.name,
91
101
  locator: room.locator,
102
+ handle: room.handle,
92
103
  roomVersion: room.roomVersion,
93
104
  operations: room.operations,
94
105
  replica: room.replica,
95
- attachedModel: room.attachedModel,
96
106
  ...(room.typedSelection === undefined ? {} : { typedSelection: room.typedSelection }),
97
- ...(room.untypedFolders === undefined ? {} : { untypedFolders: room.untypedFolders }),
98
107
  providerOwnedPaths: room.providerOwnedPaths,
99
108
  };
100
109
  }
101
- function page(room, from) {
110
+ function page(room, after) {
102
111
  const paths = Object.keys(room.documents ?? {}).sort();
112
+ const opening = after === undefined;
113
+ const from = opening ? 0 : paths.filter((path) => path <= after).length;
103
114
  const size = pageSize ?? paths.length;
104
115
  const taken = paths.slice(from, from + size);
105
116
  const next = from + taken.length;
106
- const targets = from === 0 ? (room.binaryTargets ?? []) : [];
117
+ const targets = opening ? Object.keys(room.binaryFiles ?? {}) : [];
107
118
  return {
108
119
  kind: 'bootstrap',
109
120
  roomVersion: room.roomVersion,
121
+ ...(opening ? { models: modelsOf(room) } : {}),
110
122
  documents: named(room.documents ?? {}, taken),
111
- revisions: named(room.revisions ?? {}, taken),
123
+ revisions: named(room.revisions ?? {}, [...taken, ...targets]),
112
124
  changes: named(room.changes ?? {}, [...taken, ...targets]),
113
- binaryTargets: targets,
114
- ...(from === 0 && room.attachments !== undefined ? { attachments: room.attachments } : {}),
115
- ...(next < paths.length ? { pageToken: String(next) } : {}),
125
+ binaryFiles: named(room.binaryFiles ?? {}, targets),
126
+ ...(next < paths.length ? { pageToken: taken.at(-1) } : {}),
116
127
  };
117
128
  }
118
129
  function advancement(room, from, at) {
119
130
  const current = room.documents ?? {};
120
131
  const previous = from.documents ?? {};
121
- const currentTargets = new Set(room.binaryTargets ?? []);
122
- const previousTargets = new Set(from.binaryTargets ?? []);
132
+ const currentTargets = new Set(Object.keys(room.binaryFiles ?? {}));
133
+ const previousTargets = new Set(Object.keys(from.binaryFiles ?? {}));
123
134
  const headMoved = (path) => room.revisions?.[path] !== from.revisions?.[path] ||
124
135
  !sameChange(room.changes?.[path], from.changes?.[path]);
125
136
  const changed = Object.keys(current)
@@ -135,22 +146,21 @@ export function createMemoryAdapter(options = {}) {
135
146
  const targets = opening
136
147
  ? [...currentTargets].filter((target) => !previousTargets.has(target) || headMoved(target))
137
148
  : [];
138
- const attachments = room.attachments ?? [];
139
- const declared = opening && JSON.stringify(attachments) !== JSON.stringify(from.attachments ?? []);
149
+ const models = opening ? changedModels(room, from) : undefined;
140
150
  return {
141
151
  kind: 'net-advancement',
142
152
  roomVersion: room.roomVersion,
153
+ ...(models === undefined ? {} : { models }),
143
154
  documents: named(current, taken),
144
- revisions: named(room.revisions ?? {}, taken),
155
+ revisions: named(room.revisions ?? {}, [...taken, ...targets]),
145
156
  changes: named(room.changes ?? {}, [...taken, ...targets]),
146
- binaryTargets: targets,
157
+ binaryFiles: named(room.binaryFiles ?? {}, targets),
147
158
  removals: opening
148
159
  ? [
149
160
  ...Object.keys(previous).filter((path) => !(path in current) && !currentTargets.has(path)),
150
161
  ...[...previousTargets].filter((target) => !currentTargets.has(target) && !(target in current)),
151
162
  ].sort()
152
163
  : [],
153
- ...(declared ? { attachments } : {}),
154
164
  ...(pageToken === undefined ? {} : { pageToken }),
155
165
  };
156
166
  }
@@ -171,7 +181,7 @@ export function createMemoryAdapter(options = {}) {
171
181
  function historiesOf(input) {
172
182
  const asked = input?.conversations;
173
183
  if (!Array.isArray(asked))
174
- return { kind: 'rejected', code: 'invalid_request', fields: {} };
184
+ return { kind: 'rejected', code: 'invalid_request', fields: {}, retryable: false };
175
185
  const histories = [];
176
186
  for (const entry of asked) {
177
187
  const conversation = typeof entry.conversation === 'string' ? scripted.get(entry.conversation) : undefined;
@@ -199,7 +209,12 @@ export function createMemoryAdapter(options = {}) {
199
209
  const named = typeof input.conversation === 'string' ? input.conversation : '';
200
210
  const conversation = scripted.get(named);
201
211
  if (conversation === undefined) {
202
- return { kind: 'rejected', code: 'unknown-conversation', fields: { conversation: named } };
212
+ return {
213
+ kind: 'rejected',
214
+ code: 'unknown-conversation',
215
+ fields: { conversation: named },
216
+ retryable: false,
217
+ };
203
218
  }
204
219
  const outcome = conversation.outcomes?.[name];
205
220
  if (outcome !== undefined)
@@ -213,7 +228,7 @@ export function createMemoryAdapter(options = {}) {
213
228
  if (name === 'conversation.cancel') {
214
229
  const turn = typeof input.turn === 'string' ? input.turn : '';
215
230
  if (sealed.has(turn) || !unsealed.has(turn)) {
216
- return { kind: 'rejected', code: 'turn-sealed', fields: { turn } };
231
+ return { kind: 'rejected', code: 'turn-sealed', fields: { turn }, retryable: false };
217
232
  }
218
233
  unsealed.delete(turn);
219
234
  return { kind: 'action', result: { turn, cancelled: true } };
@@ -222,15 +237,19 @@ export function createMemoryAdapter(options = {}) {
222
237
  scripted.delete(named);
223
238
  return { kind: 'action', result: { conversation: named } };
224
239
  }
240
+ function announceList() {
241
+ const entries = [...scripted.values()].flatMap(({ conversation, listed }) => listed === undefined ? [] : [{ conversation, ...listed }]);
242
+ for (const listener of listeners)
243
+ listener({ kind: 'list', entries });
244
+ }
225
245
  function discovery() {
226
246
  return {
227
247
  kind: 'discovery',
228
- supportedVersions,
229
- mdModel,
230
248
  rooms: rooms.map(declared),
231
249
  capabilities,
232
250
  providerLimits,
233
251
  retention,
252
+ ...(options.member === undefined ? {} : { member: options.member }),
234
253
  };
235
254
  }
236
255
  return {
@@ -241,9 +260,21 @@ export function createMemoryAdapter(options = {}) {
241
260
  setConversations(next) {
242
261
  scriptConversations(next);
243
262
  },
244
- notifyRoomVersion(notification) {
263
+ open() {
264
+ announceList();
265
+ for (const observer of observers)
266
+ observer({ kind: 'opened' });
267
+ },
268
+ close(revoked = false) {
245
269
  for (const observer of observers)
246
- observer(notification);
270
+ observer({ kind: 'closed', revoked });
271
+ },
272
+ expire(locators) {
273
+ expiring = [...locators];
274
+ },
275
+ notifyRoomVersion({ locator, roomVersion }) {
276
+ for (const observer of observers)
277
+ observer({ kind: 'room-version', locator, roomVersion });
247
278
  },
248
279
  notifyConversation(event) {
249
280
  if (event.kind === 'accepted-message') {
@@ -257,8 +288,8 @@ export function createMemoryAdapter(options = {}) {
257
288
  for (const observer of modeObservers)
258
289
  observer(mode);
259
290
  },
260
- selectedRooms() {
261
- return selected;
291
+ heldRooms() {
292
+ return held;
262
293
  },
263
294
  replicatedConversations() {
264
295
  return replicated;
@@ -282,12 +313,45 @@ export function createMemoryAdapter(options = {}) {
282
313
  };
283
314
  },
284
315
  },
285
- roomVersions: {
286
- select(locators) {
287
- selected = [...locators];
316
+ roomStream: {
317
+ hold(asked) {
318
+ held = asked.map((room) => room.locator);
319
+ const expired = expiring.filter((locator) => held.includes(locator));
320
+ expiring = [];
321
+ const moved = asked.flatMap((room) => {
322
+ const current = rooms.find((entry) => entry.locator === room.locator);
323
+ return current === undefined ||
324
+ expired.includes(room.locator) ||
325
+ current.roomVersion === room.roomVersion
326
+ ? []
327
+ : [{ locator: room.locator, roomVersion: current.roomVersion }];
328
+ });
329
+ queueMicrotask(() => {
330
+ for (const observer of observers) {
331
+ for (const room of moved)
332
+ observer({ kind: 'room-version', ...room });
333
+ observer({ kind: 'opening', expired });
334
+ }
335
+ });
336
+ },
337
+ reopen() {
338
+ queueMicrotask(() => {
339
+ for (const observer of observers)
340
+ observer({ kind: 'closed', revoked: false });
341
+ });
288
342
  },
289
343
  observe(notify) {
290
344
  observers.add(notify);
345
+ queueMicrotask(() => {
346
+ if (!observers.has(notify))
347
+ return;
348
+ if (options.unopened === true) {
349
+ notify({ kind: 'closed', revoked: false });
350
+ return;
351
+ }
352
+ announceList();
353
+ notify({ kind: 'opened' });
354
+ });
291
355
  return () => {
292
356
  observers.delete(notify);
293
357
  };
@@ -299,13 +363,6 @@ export function createMemoryAdapter(options = {}) {
299
363
  else
300
364
  scripts[operation] = answer;
301
365
  },
302
- async model(_authorization, request) {
303
- return resolveScript(scripts.model, () => {
304
- const room = rooms.find((entry) => entry.locator === request.locator);
305
- const answer = request.attached === 'collection' ? room?.model : room?.selectionModel;
306
- return answer ?? { kind: 'model-unavailable', reason: 'not-readable' };
307
- }, request);
308
- },
309
366
  async authorize() {
310
367
  return resolveScript(scripts.authorize, () => ({}), undefined);
311
368
  },
@@ -318,13 +375,21 @@ export function createMemoryAdapter(options = {}) {
318
375
  });
319
376
  },
320
377
  reached,
378
+ follows(locator, roomVersion, next) {
379
+ const scripted = scripts.follows;
380
+ if (typeof scripted === 'boolean')
381
+ return scripted;
382
+ if (scripted !== undefined)
383
+ return scripted(locator, roomVersion, next);
384
+ return true;
385
+ },
321
386
  async bootstrap(_authorization, request) {
322
387
  return resolveScript(scripts.bootstrap, () => {
323
388
  const room = rooms.find((entry) => entry.locator === request.locator);
324
389
  if (room === undefined) {
325
390
  return { kind: 'room-not-readable', locator: request.locator };
326
391
  }
327
- return page(room, request.pageToken === undefined ? 0 : Number(request.pageToken));
392
+ return page(room, request.pageToken);
328
393
  }, request).then((answer) => note(request.locator, answer));
329
394
  },
330
395
  async refresh(_authorization, request) {
@@ -342,10 +407,6 @@ export function createMemoryAdapter(options = {}) {
342
407
  }
343
408
  return advancement(continuation.room, continuation.from, continuation.at);
344
409
  }
345
- if (request.minPosition !== undefined &&
346
- !reached(room.locator, room.roomVersion, request.minPosition)) {
347
- return { kind: 'retryable-refusal', code: 'replica_behind', fields: {} };
348
- }
349
410
  if (request.fromRoomVersion === room.roomVersion) {
350
411
  return { kind: 'still-current' };
351
412
  }
@@ -361,7 +422,13 @@ export function createMemoryAdapter(options = {}) {
361
422
  if (room === undefined) {
362
423
  return { kind: 'room-not-readable', locator: request.locator };
363
424
  }
364
- return { kind: 'rejected', code: 'unscripted-mutation', fields: {}, affected: {} };
425
+ return {
426
+ kind: 'rejected',
427
+ code: 'unscripted-mutation',
428
+ fields: {},
429
+ retryable: false,
430
+ affected: {},
431
+ };
365
432
  }, request).then((answer) => note(request.locator, answer));
366
433
  },
367
434
  async history(_authorization, request) {
@@ -376,11 +443,35 @@ export function createMemoryAdapter(options = {}) {
376
443
  };
377
444
  }, request);
378
445
  },
446
+ async binary(_authorization, request) {
447
+ return resolveScript(scripts.binary, () => {
448
+ if (request.kind === 'reference') {
449
+ return { kind: 'rejected', code: 'unscripted-binary', fields: {}, retryable: false };
450
+ }
451
+ const room = rooms.find((entry) => entry.locator === request.locator);
452
+ if (room === undefined)
453
+ return { kind: 'room-not-readable', locator: request.locator };
454
+ const blob = room.blobs?.[request.path];
455
+ return blob === undefined
456
+ ? { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false }
457
+ : { kind: 'binary', blob };
458
+ }, request);
459
+ },
460
+ referrerScope(referrer) {
461
+ if (typeof referrer !== 'object' || referrer === null)
462
+ return null;
463
+ const { room, path, message } = referrer;
464
+ if (typeof message === 'string')
465
+ return { kind: 'conversations' };
466
+ if (typeof room !== 'string')
467
+ return null;
468
+ return { kind: 'room', locator: room, ...(typeof path === 'string' ? { path } : {}) };
469
+ },
379
470
  async action(_authorization, request) {
380
471
  return resolveScript(scripts.action, () => {
381
472
  if (request.name.startsWith('conversation.'))
382
473
  return conversationAction(request);
383
- return { kind: 'rejected', code: 'unscripted-action', fields: {} };
474
+ return { kind: 'rejected', code: 'unscripted-action', fields: {}, retryable: false };
384
475
  }, request).then((answer) => {
385
476
  if (answer.kind === 'action' && answer.at !== undefined)
386
477
  note(answer.at.locator, answer.at);
package/dist/model.d.ts CHANGED
@@ -1,31 +1,27 @@
1
- import type { Definition, FieldSpec, SectionSpec, VerifiedModel } from '@agentshouse/mdmodel';
1
+ import type { Definition, ValueFacts, VerifiedModel } from '@agentshouse/mdmodel';
2
+ import type { Open } from './open.js';
2
3
  export type ModelIdentity = {
3
4
  identity: string;
4
5
  version: string;
5
6
  };
6
7
  export type ModelSnapshot = ModelIdentity & {
7
8
  schema: string | null;
9
+ revision: string | null;
8
10
  };
9
- export type ModelUnavailableReason = 'not-readable' | 'revoked' | 'not-acquired' | 'version-changed' | 'invalid';
11
+ export type ModelUnavailableReason = Open<'not-readable' | 'revoked' | 'not-acquired' | 'invalid'>;
10
12
  export type ModelResult = {
11
13
  kind: 'model';
12
14
  snapshot: ModelSnapshot;
13
15
  } | {
14
16
  kind: 'model-unavailable';
15
17
  reason: ModelUnavailableReason;
16
- } | {
17
- kind: 'transport-uncertainty';
18
- } | {
19
- kind: 'revoked-authorization';
20
- };
21
- export type MdType = {
22
- name: string;
23
- fields: Readonly<Record<string, FieldSpec>>;
24
- sections: Readonly<Record<string, SectionSpec>>;
25
18
  };
19
+ export type MdType = Definition;
26
20
  export type ModelState = {
27
21
  status: 'unavailable';
28
22
  reason: ModelUnavailableReason;
23
+ schema?: string | null;
24
+ revision?: string | null;
29
25
  } | {
30
26
  status: 'current' | 'cached';
31
27
  snapshot: ModelSnapshot;
@@ -35,21 +31,26 @@ export type ModelState = {
35
31
  export type TypesResult = {
36
32
  status: 'unavailable';
37
33
  reason: ModelUnavailableReason;
34
+ schema?: string | null;
35
+ revision?: string | null;
38
36
  } | {
39
37
  status: 'current' | 'cached';
40
38
  identity: string;
41
39
  version: string;
42
40
  verifiedWith: ModelIdentity;
43
41
  types: readonly MdType[];
42
+ schema: string | null;
43
+ revision: string | null;
44
44
  };
45
45
  export type ValidationReceipt = {
46
46
  identity: string;
47
47
  version: string;
48
- source: 'current' | 'cached';
48
+ source: Open<'current' | 'cached'>;
49
49
  };
50
50
  export declare const NO_MODEL: ModelState;
51
51
  export declare function definitionOf(state: ModelState, type: string | undefined): Definition | undefined;
52
52
  export declare function modelTypes(state: ModelState): TypesResult;
53
53
  export declare function cached(state: ModelState): ModelState;
54
54
  export declare function sameModel(left: ModelIdentity, right: ModelIdentity): boolean;
55
+ export declare function referenceField(facts: ValueFacts | undefined): boolean;
55
56
  //# sourceMappingURL=model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE9F,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,CAAA;CAAE,CAAC;AACtE,MAAM,MAAM,sBAAsB,GAC9B,cAAc,GACd,SAAS,GACT,cAAc,GACd,iBAAiB,GACjB,SAAS,CAAC;AACd,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,GAC7D;IAAE,IAAI,EAAE,uBAAuB,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,uBAAuB,CAAA;CAAE,CAAC;AACtC,MAAM,MAAM,MAAM,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IAC5C,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;CACjD,CAAC;AACF,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;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,GACzD;IACE,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,aAAa,CAAC;IAC5B,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1B,CAAC;AACN,MAAM,MAAM,iBAAiB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAA;CAAE,CAAC;AACpG,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,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAEpD;AACD,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAE5E"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAClF,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,GAAG,SAAS,CAAC,CAAC;AACnG,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;IACE,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,GACD;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;IACE,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,GACD;IACE,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,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,CAgBzD;AACD,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAEpD;AACD,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAE5E;AACD,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAErE"}
package/dist/model.js CHANGED
@@ -12,9 +12,9 @@ export function modelTypes(state) {
12
12
  identity: state.snapshot.identity,
13
13
  version: state.snapshot.version,
14
14
  verifiedWith: { ...state.verifiedWith },
15
- types: structuredClone(Object.values(state.types)
16
- .sort((left, right) => (left.name < right.name ? -1 : left.name > right.name ? 1 : 0))
17
- .map(({ name, fields, sections }) => ({ name, fields, sections }))),
15
+ schema: state.snapshot.schema,
16
+ revision: state.snapshot.revision,
17
+ types: structuredClone(Object.values(state.types).sort((left, right) => left.name < right.name ? -1 : left.name > right.name ? 1 : 0)),
18
18
  };
19
19
  }
20
20
  export function cached(state) {
@@ -23,3 +23,6 @@ export function cached(state) {
23
23
  export function sameModel(left, right) {
24
24
  return left.identity === right.identity && left.version === right.version;
25
25
  }
26
+ export function referenceField(facts) {
27
+ return facts?.reference !== undefined || facts?.items?.reference !== undefined;
28
+ }
@@ -20,6 +20,8 @@ export type Observed = {
20
20
  end(): void;
21
21
  };
22
22
  export declare function rowsOf(result: QueryResult): readonly (QueryDocument | QueryGroup)[];
23
+ export declare function applied(keyed: KeyedResult, change: QueryChange): KeyedResult;
23
24
  export declare function observed(first: unknown, stop: () => void, keyed: boolean): Observed;
24
25
  export declare function opened(watch: (deliver: (message: unknown) => void) => () => void, keyed: boolean): Promise<Observation<unknown>>;
26
+ export declare function observing<Topic extends string>(watch: (topic: Topic, input: readonly unknown[], deliver: (message: unknown) => void) => () => void): (topic: Topic, ...input: unknown[]) => Promise<Observation<unknown>>;
25
27
  //# sourceMappingURL=observation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"observation.d.ts","sourceRoot":"","sources":["../src/observation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzE,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC3B,OAAO,IAAI,CAAC,CAAC;IACb,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACpD,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAErC,MAAM,MAAM,WAAW,GAAG;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAE3E,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC;IACpE,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,GAAG,IAAI,IAAI,CAAC;CACb,CAAC;AAEF,wBAAgB,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC,aAAa,GAAG,UAAU,CAAC,EAAE,CAEnF;AA0BD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,QAAQ,CAkCnF;AAED,wBAAgB,MAAM,CACpB,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,KAAK,MAAM,IAAI,EAC1D,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAiB/B"}
1
+ {"version":3,"file":"observation.d.ts","sourceRoot":"","sources":["../src/observation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzE,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC3B,OAAO,IAAI,CAAC,CAAC;IACb,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACpD,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAErC,MAAM,MAAM,WAAW,GAAG;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAE3E,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC;IACpE,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,GAAG,IAAI,IAAI,CAAC;CACb,CAAC;AAEF,wBAAgB,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC,aAAa,GAAG,UAAU,CAAC,EAAE,CAEnF;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,WAAW,CAc5E;AAiBD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,QAAQ,CAkCnF;AAED,wBAAgB,MAAM,CACpB,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,KAAK,MAAM,IAAI,EAC1D,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAiB/B;AAED,wBAAgB,SAAS,CAAC,KAAK,SAAS,MAAM,EAC5C,KAAK,EAAE,CACL,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,SAAS,OAAO,EAAE,EACzB,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,KAChC,MAAM,IAAI,WAEA,KAAK,YAAY,OAAO,EAAE,KAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAQ1E"}
@@ -1,24 +1,29 @@
1
1
  export function rowsOf(result) {
2
2
  return 'groups' in result ? result.groups : result.documents;
3
3
  }
4
+ export function applied(keyed, change) {
5
+ const rows = rowsOf(keyed.result);
6
+ const byKey = new Map(keyed.keys.map((key, index) => [key, rows[index]]));
7
+ for (const key of change.removed)
8
+ byKey.delete(key);
9
+ for (const [key, row] of change.changed)
10
+ byKey.set(key, row);
11
+ const keys = change.order ?? keyed.keys.filter((key) => byKey.has(key));
12
+ const next = keys.map((key) => byKey.get(key));
13
+ return {
14
+ result: 'groups' in keyed.result
15
+ ? { groups: next }
16
+ : { documents: next },
17
+ keys,
18
+ };
19
+ }
4
20
  function keyedResult(first) {
5
- const grouped = 'groups' in first.result;
6
- const rows = rowsOf(first.result);
7
- const byKey = new Map(first.keys.map((key, index) => [key, rows[index]]));
8
- let keys = first.keys;
21
+ let keyed = first;
9
22
  return {
10
23
  value: first.result,
11
24
  next(message) {
12
- const change = message;
13
- for (const key of change.removed)
14
- byKey.delete(key);
15
- for (const [key, row] of change.changed)
16
- byKey.set(key, row);
17
- keys = change.order ?? keys.filter((key) => byKey.has(key));
18
- const next = keys.map((key) => byKey.get(key));
19
- return grouped
20
- ? { groups: next }
21
- : { documents: next };
25
+ keyed = applied(keyed, message);
26
+ return keyed.result;
22
27
  },
23
28
  };
24
29
  }
@@ -83,3 +88,8 @@ export function opened(watch, keyed) {
83
88
  }
84
89
  });
85
90
  }
91
+ export function observing(watch) {
92
+ return (topic, ...input) => opened((deliver) => watch(topic, input, (message) => {
93
+ deliver(structuredClone(message));
94
+ }), topic === 'query');
95
+ }
package/dist/open.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export type Open<Value extends string> = Value | (string & {});
2
+ //# sourceMappingURL=open.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../src/open.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,IAAI,CAAC,KAAK,SAAS,MAAM,IAAI,KAAK,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC"}
package/dist/open.js ADDED
@@ -0,0 +1 @@
1
+ export {};