@agentshouse/mdruntime 0.1.0-alpha.9 → 0.1.0-c30ed2b8e04d5

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 (130) hide show
  1. package/AGENTS.md +217 -0
  2. package/README.md +43 -0
  3. package/dist/adapter.d.ts +184 -34
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/adapter.js +1 -10
  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 +34 -0
  9. package/dist/attachment.d.ts +3 -0
  10. package/dist/attachment.d.ts.map +1 -0
  11. package/dist/attachment.js +8 -0
  12. package/dist/bootstrap.d.ts +7 -9
  13. package/dist/bootstrap.d.ts.map +1 -1
  14. package/dist/bootstrap.js +29 -28
  15. package/dist/change-set.d.ts +33 -0
  16. package/dist/change-set.d.ts.map +1 -0
  17. package/dist/change-set.js +83 -0
  18. package/dist/change.d.ts +9 -0
  19. package/dist/change.d.ts.map +1 -1
  20. package/dist/change.js +6 -5
  21. package/dist/client.d.ts +38 -32
  22. package/dist/client.d.ts.map +1 -1
  23. package/dist/client.js +114 -183
  24. package/dist/collection.d.ts +13 -16
  25. package/dist/collection.d.ts.map +1 -1
  26. package/dist/collection.js +45 -88
  27. package/dist/connection.d.ts +47 -44
  28. package/dist/connection.d.ts.map +1 -1
  29. package/dist/connection.js +1542 -1158
  30. package/dist/conversation.d.ts +44 -22
  31. package/dist/conversation.d.ts.map +1 -1
  32. package/dist/conversation.js +540 -328
  33. package/dist/durability.js +6 -6
  34. package/dist/file.d.ts +2 -2
  35. package/dist/file.d.ts.map +1 -1
  36. package/dist/file.js +48 -71
  37. package/dist/host.d.ts +12 -2
  38. package/dist/host.d.ts.map +1 -1
  39. package/dist/host.js +97 -119
  40. package/dist/identity.d.ts +1 -0
  41. package/dist/identity.d.ts.map +1 -1
  42. package/dist/identity.js +10 -9
  43. package/dist/index.d.ts +12 -11
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +1 -3
  46. package/dist/log.js +5 -6
  47. package/dist/memory.d.ts +15 -7
  48. package/dist/memory.d.ts.map +1 -1
  49. package/dist/memory.js +255 -220
  50. package/dist/model.d.ts +10 -29
  51. package/dist/model.d.ts.map +1 -1
  52. package/dist/model.js +18 -21
  53. package/dist/observation.d.ts +27 -0
  54. package/dist/observation.d.ts.map +1 -0
  55. package/dist/observation.js +95 -0
  56. package/dist/outcome.d.ts +10 -29
  57. package/dist/outcome.d.ts.map +1 -1
  58. package/dist/outcome.js +1 -23
  59. package/dist/overlay.d.ts +9 -2
  60. package/dist/overlay.d.ts.map +1 -1
  61. package/dist/overlay.js +187 -43
  62. package/dist/paths.d.ts +0 -1
  63. package/dist/paths.d.ts.map +1 -1
  64. package/dist/paths.js +12 -19
  65. package/dist/query.d.ts +215 -10
  66. package/dist/query.d.ts.map +1 -1
  67. package/dist/query.js +421 -15
  68. package/dist/reach.d.ts +40 -0
  69. package/dist/reach.d.ts.map +1 -0
  70. package/dist/reach.js +277 -0
  71. package/dist/read-side.d.ts +18 -0
  72. package/dist/read-side.d.ts.map +1 -0
  73. package/dist/read-side.js +377 -0
  74. package/dist/refresh.d.ts +5 -5
  75. package/dist/refresh.d.ts.map +1 -1
  76. package/dist/refresh.js +49 -30
  77. package/dist/replica.d.ts +25 -5
  78. package/dist/replica.d.ts.map +1 -1
  79. package/dist/replica.js +227 -38
  80. package/dist/room-draft.d.ts +127 -0
  81. package/dist/room-draft.d.ts.map +1 -0
  82. package/dist/room-draft.js +329 -0
  83. package/dist/rows.d.ts +41 -0
  84. package/dist/rows.d.ts.map +1 -0
  85. package/dist/rows.js +100 -0
  86. package/dist/save.d.ts +6 -4
  87. package/dist/save.d.ts.map +1 -1
  88. package/dist/save.js +262 -350
  89. package/dist/search.d.ts +61 -0
  90. package/dist/search.d.ts.map +1 -0
  91. package/dist/search.js +125 -0
  92. package/dist/status.d.ts +4 -6
  93. package/dist/status.d.ts.map +1 -1
  94. package/dist/status.js +9 -13
  95. package/dist/store.d.ts +59 -32
  96. package/dist/store.d.ts.map +1 -1
  97. package/dist/store.js +338 -134
  98. package/dist/transfer.d.ts +5 -0
  99. package/dist/transfer.d.ts.map +1 -1
  100. package/dist/transfer.js +1 -5
  101. package/dist/wire.d.ts +51 -16
  102. package/dist/wire.d.ts.map +1 -1
  103. package/dist/wire.js +77 -108
  104. package/package.json +6 -12
  105. package/dist/adapter.js.map +0 -1
  106. package/dist/bootstrap.js.map +0 -1
  107. package/dist/change.js.map +0 -1
  108. package/dist/client.js.map +0 -1
  109. package/dist/collection.js.map +0 -1
  110. package/dist/connection.js.map +0 -1
  111. package/dist/conversation.js.map +0 -1
  112. package/dist/durability.js.map +0 -1
  113. package/dist/file.js.map +0 -1
  114. package/dist/host.js.map +0 -1
  115. package/dist/identity.js.map +0 -1
  116. package/dist/index.js.map +0 -1
  117. package/dist/log.js.map +0 -1
  118. package/dist/memory.js.map +0 -1
  119. package/dist/model.js.map +0 -1
  120. package/dist/outcome.js.map +0 -1
  121. package/dist/overlay.js.map +0 -1
  122. package/dist/paths.js.map +0 -1
  123. package/dist/query.js.map +0 -1
  124. package/dist/refresh.js.map +0 -1
  125. package/dist/replica.js.map +0 -1
  126. package/dist/save.js.map +0 -1
  127. package/dist/status.js.map +0 -1
  128. package/dist/store.js.map +0 -1
  129. package/dist/transfer.js.map +0 -1
  130. package/dist/wire.js.map +0 -1
@@ -0,0 +1,61 @@
1
+ import type { ChangeSet } from './change-set.js';
2
+ import { type Filter } from './query.js';
3
+ export type DocumentPart = 'fields' | 'sections' | 'preamble' | 'path';
4
+ export type SearchRequest = {
5
+ text: string;
6
+ documents?: Filter;
7
+ conversations?: readonly string[];
8
+ limit?: number;
9
+ };
10
+ export type DocumentHit = {
11
+ room: string;
12
+ path: string;
13
+ type: string;
14
+ score: number;
15
+ matches: Readonly<Record<string, readonly DocumentPart[]>>;
16
+ };
17
+ export type MessageHit = {
18
+ conversation: string;
19
+ identity: string;
20
+ score: number;
21
+ matches: Readonly<Record<string, readonly 'text'[]>>;
22
+ };
23
+ export type SearchResult = {
24
+ documents: readonly DocumentHit[];
25
+ messages: readonly MessageHit[];
26
+ };
27
+ export type SearchedDocument = {
28
+ room: string;
29
+ path: string;
30
+ type: string;
31
+ fields: Readonly<Record<string, unknown>>;
32
+ preamble: string;
33
+ sections: Readonly<Record<string, string>>;
34
+ };
35
+ export type SearchedMessage = {
36
+ conversation: string;
37
+ identity: string;
38
+ text: string;
39
+ };
40
+ export type SearchSource = {
41
+ documents(): readonly SearchedDocument[];
42
+ document(room: string, path: string): SearchedDocument | null;
43
+ messages(): readonly SearchedMessage[];
44
+ message(conversation: string, identity: string): SearchedMessage | null;
45
+ };
46
+ export type SearchPlan = {
47
+ text: string;
48
+ documents: unknown;
49
+ conversations: readonly string[] | null;
50
+ limit: number | null;
51
+ };
52
+ export type SearchIndex = {
53
+ changed(set: ChangeSet): void;
54
+ search(plan: SearchPlan, documents: readonly {
55
+ room: string;
56
+ path: string;
57
+ }[] | null): SearchResult;
58
+ };
59
+ export declare function searchPlanOf(input: unknown): SearchPlan;
60
+ export declare function createSearchIndex(source: SearchSource): SearchIndex;
61
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAkC,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzE,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;AAEvE,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC,CAAC,CAAC;CAC5D,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;CACtD,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,EAAE,SAAS,WAAW,EAAE,CAAC;IAClC,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvF,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,IAAI,SAAS,gBAAgB,EAAE,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAAC;IAC9D,QAAQ,IAAI,SAAS,eAAe,EAAE,CAAC;IACvC,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAAC;CACzE,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IACxC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC9B,MAAM,CACJ,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,IAAI,GAC1D,YAAY,CAAC;CACjB,CAAC;AA4BF,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAiBvD;AAMD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,WAAW,CAyGnE"}
package/dist/search.js ADDED
@@ -0,0 +1,125 @@
1
+ import MiniSearch from 'minisearch';
2
+ import { invalid, known, limitOf, plain } from './query.js';
3
+ const FIELDS = ['fields', 'sections', 'preamble', 'path', 'text'];
4
+ function documentId(room, path) {
5
+ return JSON.stringify(['document', room, path]);
6
+ }
7
+ function messageId(conversation, identity) {
8
+ return JSON.stringify(['message', conversation, identity]);
9
+ }
10
+ function scalars(value) {
11
+ if (value === null || value === undefined)
12
+ return [];
13
+ if (Array.isArray(value))
14
+ return value.flatMap(scalars);
15
+ if (typeof value === 'object')
16
+ return Object.values(value).flatMap(scalars);
17
+ return [String(value)];
18
+ }
19
+ export function searchPlanOf(input) {
20
+ if (!plain(input))
21
+ invalid('search', 'expects a search object');
22
+ known(input, ['text', 'documents', 'conversations', 'limit'], '');
23
+ if (typeof input.text !== 'string')
24
+ invalid('text', 'expects text');
25
+ const conversations = input.conversations;
26
+ if (conversations !== undefined &&
27
+ (!Array.isArray(conversations) || conversations.some((named) => typeof named !== 'string'))) {
28
+ invalid('conversations', 'expects a list of conversations');
29
+ }
30
+ return {
31
+ text: input.text,
32
+ documents: input.documents,
33
+ conversations: conversations ?? null,
34
+ limit: limitOf(input.limit),
35
+ };
36
+ }
37
+ export function createSearchIndex(source) {
38
+ let index = null;
39
+ const documents = new Map();
40
+ const messages = new Map();
41
+ const changedDocuments = new Map();
42
+ const changedMessages = new Map();
43
+ function addDocument(built, document) {
44
+ const id = documentId(document.room, document.path);
45
+ documents.set(id, { room: document.room, path: document.path, type: document.type });
46
+ built.add({
47
+ id,
48
+ fields: scalars(document.fields).join('\n'),
49
+ sections: Object.entries(document.sections)
50
+ .map(([heading, text]) => `${heading}\n${text}`)
51
+ .join('\n'),
52
+ preamble: document.preamble,
53
+ path: document.path,
54
+ });
55
+ }
56
+ function addMessage(built, message) {
57
+ const id = messageId(message.conversation, message.identity);
58
+ messages.set(id, { conversation: message.conversation, identity: message.identity });
59
+ built.add({ id, text: message.text });
60
+ }
61
+ function current() {
62
+ if (index === null) {
63
+ const built = new MiniSearch({ fields: FIELDS });
64
+ for (const document of source.documents())
65
+ addDocument(built, document);
66
+ for (const message of source.messages())
67
+ addMessage(built, message);
68
+ index = built;
69
+ return built;
70
+ }
71
+ const built = index;
72
+ for (const [id, { room, path }] of changedDocuments) {
73
+ if (documents.delete(id))
74
+ built.discard(id);
75
+ const document = source.document(room, path);
76
+ if (document !== null)
77
+ addDocument(built, document);
78
+ }
79
+ changedDocuments.clear();
80
+ for (const [id, { conversation, identity }] of changedMessages) {
81
+ if (messages.delete(id))
82
+ built.discard(id);
83
+ const message = source.message(conversation, identity);
84
+ if (message !== null)
85
+ addMessage(built, message);
86
+ }
87
+ changedMessages.clear();
88
+ return built;
89
+ }
90
+ function ranked(built, text, entries, keep, limit) {
91
+ const found = built.search(text, {
92
+ filter: ({ id }) => {
93
+ const entry = entries.get(id);
94
+ return entry !== undefined && keep(entry, id);
95
+ },
96
+ });
97
+ return (limit === null ? found : found.slice(0, limit)).map(({ id, score, match }) => ({
98
+ ...entries.get(id),
99
+ score,
100
+ match,
101
+ }));
102
+ }
103
+ return {
104
+ changed(set) {
105
+ if (index === null)
106
+ return;
107
+ for (const { locator, path } of set.documents) {
108
+ changedDocuments.set(documentId(locator, path), { room: locator, path });
109
+ }
110
+ for (const { conversation, identity } of set.messages) {
111
+ changedMessages.set(messageId(conversation, identity), { conversation, identity });
112
+ }
113
+ },
114
+ search({ text, conversations, limit }, selected) {
115
+ const built = current();
116
+ const chosen = selected === null
117
+ ? null
118
+ : new Set(selected.map(({ room, path }) => documentId(room, path)));
119
+ return {
120
+ documents: ranked(built, text, documents, (_entry, id) => chosen === null || chosen.has(id), limit).map(({ match, ...hit }) => ({ ...hit, matches: match })),
121
+ messages: ranked(built, text, messages, ({ conversation }) => conversations === null || conversations.includes(conversation), limit).map(({ match, ...hit }) => ({ ...hit, matches: match })),
122
+ };
123
+ },
124
+ };
125
+ }
package/dist/status.d.ts CHANGED
@@ -1,10 +1,8 @@
1
- import type { ProviderRefusal } from './adapter.js';
1
+ import type { ReturnReason } from './room-draft.js';
2
2
  export type AttentionEntry = {
3
- locator: string;
4
- batch: string;
5
- outcome: 'conflicted' | 'rejected' | 'expired';
6
- refusal: ProviderRefusal | null;
7
- roomVersion?: string;
3
+ room: string;
4
+ path: string;
5
+ returned: ReturnReason;
8
6
  };
9
7
  export type SyncStatus = {
10
8
  state: 'pending' | 'syncing' | 'synced';
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,GAAG,UAAU,GAAG,SAAS,CAAC;IAC/C,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACxC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,iBAAiB,EAAE,SAAS,cAAc,EAAE,CAAC;IAC7C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,UAMtB,CAAC;AAEF,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAE3D;AAED,wBAAgB,OAAO,CACrB,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,aAAa,EACvB,EAAE,EAAE,MAAM,GAAG,IAAI,EACjB,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,mBAAmB,GAAG,OAAO,CAAC,GACzD,UAAU,CAOZ;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAErD;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAQhE"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,YAAY,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACxC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,iBAAiB,EAAE,SAAS,cAAc,EAAE,CAAC;IAC7C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,UAMtB,CAAC;AAEF,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAE3D;AAED,wBAAgB,OAAO,CACrB,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,aAAa,EACvB,EAAE,EAAE,MAAM,GAAG,IAAI,EACjB,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,mBAAmB,GAAG,OAAO,CAAC,GACzD,UAAU,CAOZ;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAErD;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAQhE"}
package/dist/status.js CHANGED
@@ -3,30 +3,26 @@ export const STARTING = {
3
3
  lastCompleted: null,
4
4
  providerUnreachable: false,
5
5
  attentionRequired: [],
6
- reset: null
6
+ reset: null,
7
7
  };
8
8
  export function transferring(status) {
9
- return {
10
- ...status,
11
- state: 'syncing'
12
- };
9
+ return { ...status, state: 'syncing' };
13
10
  }
14
11
  export function settled(status, progress, at, queued, attention) {
15
12
  return {
16
13
  state: queued ? 'pending' : progress.complete ? 'synced' : status.state,
17
14
  lastCompleted: progress.complete ? at : status.lastCompleted,
18
15
  providerUnreachable: !progress.reachable,
19
- ...attention
16
+ ...attention,
20
17
  };
21
18
  }
22
19
  export function saving(status) {
23
- return {
24
- ...status,
25
- state: 'pending'
26
- };
20
+ return { ...status, state: 'pending' };
27
21
  }
28
22
  export function same(one, other) {
29
- return one.state === other.state && one.lastCompleted === other.lastCompleted && one.providerUnreachable === other.providerUnreachable && one.reset === other.reset && JSON.stringify(one.attentionRequired) === JSON.stringify(other.attentionRequired);
23
+ return (one.state === other.state &&
24
+ one.lastCompleted === other.lastCompleted &&
25
+ one.providerUnreachable === other.providerUnreachable &&
26
+ one.reset === other.reset &&
27
+ JSON.stringify(one.attentionRequired) === JSON.stringify(other.attentionRequired));
30
28
  }
31
-
32
- //# sourceMappingURL=status.js.map
package/dist/store.d.ts CHANGED
@@ -1,17 +1,16 @@
1
1
  import type { ModelState } from './model.js';
2
- import type { OperationScopes, ProviderLimit, ReplicaAdmission, TypedSelection } from './adapter.js';
3
- import type { ConversationMessage } from './adapter.js';
2
+ import type { Capability, HeadChange, OperationScopes, ProviderLimit, ReplicaAdmission, RoomAttachment, TypedSelection } from './adapter.js';
3
+ import type { AcceptedMessage } from './adapter.js';
4
4
  import type { ChangeBatch } from './change.js';
5
- import type { InstructionFile } from './file.js';
6
- import type { QueueOutcome } from './outcome.js';
5
+ import type { ChatDraftFile } from './file.js';
6
+ import type { Submission } from './outcome.js';
7
+ import type { RoomDraftRecord, SavedDraft } from './room-draft.js';
7
8
  export type ReplicaRecord = {
8
- collectionRoot: string;
9
9
  locator: string;
10
10
  name: string;
11
11
  operations: OperationScopes;
12
12
  replica: ReplicaAdmission;
13
13
  model: ModelState;
14
- attachedModel: import('./model.js').ModelIdentity | null;
15
14
  typedSelection: TypedSelection | null;
16
15
  selectionModel: ModelState;
17
16
  providerOwnedPaths: readonly string[];
@@ -19,54 +18,82 @@ export type ReplicaRecord = {
19
18
  documents: Readonly<Record<string, string>>;
20
19
  binaryTargets: readonly string[];
21
20
  revisions: Readonly<Record<string, string>>;
21
+ changes: Readonly<Record<string, HeadChange>>;
22
+ written: Readonly<Record<string, string>>;
23
+ attachments: readonly RoomAttachment[];
22
24
  };
23
- export type QueueRecord = {
24
- locator: string;
25
- batches: readonly ChangeBatch[];
26
- outcomes: Readonly<Record<string, QueueOutcome>>;
25
+ export type PendingState = {
26
+ readonly drafts: readonly SavedDraft[];
27
+ readonly submission: Submission;
28
+ readonly lost: boolean;
29
+ readonly upload?: unknown;
30
+ readonly accepted?: string;
27
31
  };
28
- export type DraftRecord = {
32
+ export type QueueRecord = {
29
33
  locator: string;
30
- path: string;
31
- content: unknown;
34
+ pending: readonly {
35
+ batch: ChangeBatch;
36
+ state: PendingState;
37
+ }[];
32
38
  };
33
39
  export type PresentationRecord = {
34
40
  app: string;
35
41
  value: unknown;
36
42
  };
37
- export type ConversationRecord = {
43
+ export type HeldConversation = {
38
44
  conversation: string;
39
- messages: readonly ConversationMessage[];
40
- cursor: string | null;
41
- summary: unknown;
45
+ read: string | null | undefined;
46
+ messages: readonly AcceptedMessage[];
42
47
  };
43
- export type InstructionRecord = {
48
+ export type ConversationWrite = {
49
+ conversation: string;
50
+ messages: readonly AcceptedMessage[];
51
+ read?: string | null;
52
+ sealed?: boolean;
53
+ };
54
+ export type ChatDraftRecord = {
44
55
  conversation: string;
45
56
  text: string;
46
- files: readonly InstructionFile[];
57
+ files: readonly ChatDraftFile[];
47
58
  turn: string | null;
48
59
  };
60
+ export type RecordWrite = {
61
+ next: ReplicaRecord;
62
+ previous: ReplicaRecord | null;
63
+ queue: readonly ChangeBatch[];
64
+ previousQueue?: readonly ChangeBatch[];
65
+ saved?: readonly SavedDraft[];
66
+ roomDrafts?: readonly RoomDraftRecord[];
67
+ consumedRoomDrafts?: readonly string[];
68
+ };
49
69
  export type RuntimeStore = {
50
70
  all(): Promise<readonly ReplicaRecord[]>;
51
- publish(record: ReplicaRecord): Promise<void>;
71
+ write(input: RecordWrite): Promise<void>;
72
+ revokeModels(records: readonly {
73
+ record: ReplicaRecord;
74
+ queue: readonly ChangeBatch[];
75
+ }[]): Promise<void>;
52
76
  lastCompleted(): Promise<string | null>;
53
77
  complete(at: string): Promise<void>;
54
78
  providerLimits(): Promise<readonly ProviderLimit[]>;
55
- declare(limits: readonly ProviderLimit[]): Promise<void>;
79
+ capabilities(): Promise<readonly Capability[]>;
80
+ declare(limits: readonly ProviderLimit[], capabilities: readonly Capability[]): Promise<void>;
56
81
  queues(): Promise<readonly QueueRecord[]>;
57
- drafts(): Promise<readonly DraftRecord[]>;
82
+ submit(locator: string, id: string, submission: Submission, lost: boolean): Promise<void>;
83
+ accept(locator: string, id: string, roomVersion: string): Promise<void>;
84
+ keepUpload(locator: string, id: string, upload: unknown): Promise<void>;
85
+ roomDrafts(): Promise<readonly RoomDraftRecord[]>;
58
86
  presentation(): Promise<readonly PresentationRecord[]>;
59
87
  present(record: PresentationRecord): Promise<void>;
60
- conversations(): Promise<readonly ConversationRecord[]>;
61
- keepConversation(record: ConversationRecord): Promise<void>;
62
- dropConversation(conversation: string): Promise<void>;
63
- instructions(): Promise<readonly InstructionRecord[]>;
64
- keepInstruction(record: InstructionRecord): Promise<void>;
65
- dropInstruction(conversation: string): Promise<void>;
66
- keep(draft: DraftRecord): Promise<void>;
67
- discard(locator: string, path: string): Promise<void>;
68
- append(queue: QueueRecord, consumed: readonly string[]): Promise<void>;
69
- writeQueue(queue: QueueRecord): Promise<void>;
88
+ conversations(): Promise<readonly HeldConversation[]>;
89
+ keepMessages(write: ConversationWrite): Promise<void>;
90
+ dropConversations(conversations: readonly string[]): Promise<void>;
91
+ chatDrafts(): Promise<readonly ChatDraftRecord[]>;
92
+ keepChatDraft(record: ChatDraftRecord): Promise<void>;
93
+ dropChatDraft(conversation: string): Promise<void>;
94
+ keepRoomDraft(record: RoomDraftRecord): Promise<void>;
95
+ discardRoomDraft(locator: string, path: string): Promise<void>;
96
+ dropRooms(locators: readonly string[]): Promise<void>;
70
97
  generation(): Promise<string | null>;
71
98
  rememberGeneration(value: string): Promise<void>;
72
99
  close(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}