@agentshouse/mdruntime 0.1.0-alpha.21 → 0.1.0-alpha.23
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.
- package/AGENTS.md +9 -1
- package/dist/adapter.d.ts +20 -3
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js.map +1 -1
- package/dist/bootstrap.d.ts +1 -2
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +2 -2
- package/dist/bootstrap.js.map +1 -1
- package/dist/change-set.d.ts +7 -0
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +22 -2
- package/dist/change-set.js.map +1 -1
- package/dist/client.d.ts +7 -6
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +19 -13
- package/dist/client.js.map +1 -1
- package/dist/collection.d.ts +2 -11
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +11 -16
- package/dist/collection.js.map +1 -1
- package/dist/connection.d.ts +4 -4
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +78 -22
- package/dist/connection.js.map +1 -1
- package/dist/conversation.d.ts +28 -16
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +371 -269
- package/dist/conversation.js.map +1 -1
- package/dist/file.d.ts +2 -2
- package/dist/file.d.ts.map +1 -1
- package/dist/file.js.map +1 -1
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +6 -8
- package/dist/host.js.map +1 -1
- package/dist/index.d.ts +4 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/memory.d.ts +3 -2
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +24 -20
- package/dist/memory.js.map +1 -1
- package/dist/model.d.ts +10 -24
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +10 -1
- package/dist/model.js.map +1 -1
- package/dist/refresh.d.ts +1 -2
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +2 -2
- package/dist/refresh.js.map +1 -1
- package/dist/replica.d.ts +2 -3
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +5 -5
- package/dist/replica.js.map +1 -1
- package/dist/save.d.ts +0 -3
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +7 -30
- package/dist/save.js.map +1 -1
- package/dist/store.d.ts +19 -14
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +83 -20
- package/dist/store.js.map +1 -1
- package/dist/wire.d.ts +2 -2
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +4 -5
- package/dist/wire.js.map +1 -1
- package/package.json +3 -3
package/dist/collection.js
CHANGED
|
@@ -9,16 +9,15 @@ export const PRESENTED = {
|
|
|
9
9
|
$regex: '\\.md$'
|
|
10
10
|
}
|
|
11
11
|
};
|
|
12
|
+
const NO_TYPES = {
|
|
13
|
+
types: {}
|
|
14
|
+
};
|
|
12
15
|
function selected(composition, path) {
|
|
13
16
|
return composition.selection !== null && composition.selection.roots.some((root)=>beneath(root, path));
|
|
14
17
|
}
|
|
15
18
|
export function governing(composition, path) {
|
|
16
19
|
return composition.selection !== null && selected(composition, path) ? composition.selection.model : composition.model;
|
|
17
20
|
}
|
|
18
|
-
export function typesAt(composition, path) {
|
|
19
|
-
const model = governing(composition, path);
|
|
20
|
-
return model.status === 'unavailable' ? [] : model.types;
|
|
21
|
-
}
|
|
22
21
|
export function parseCollection(text, composition, previous) {
|
|
23
22
|
const documents = {};
|
|
24
23
|
for (const path of Object.keys(text).sort()){
|
|
@@ -48,8 +47,8 @@ export function validRoot(root) {
|
|
|
48
47
|
function member(path, root) {
|
|
49
48
|
return root === '' || path.startsWith(`${root}/`);
|
|
50
49
|
}
|
|
51
|
-
function validateAgainst(documents, binaryTargets, prefix, model
|
|
52
|
-
if (model.status === 'unavailable'
|
|
50
|
+
function validateAgainst(documents, binaryTargets, prefix, model) {
|
|
51
|
+
if (model.status === 'unavailable') {
|
|
53
52
|
const typed = Object.entries(documents).find(([, content])=>{
|
|
54
53
|
const parsed = parse(content);
|
|
55
54
|
return parsed.ok && parsed.document.type !== undefined && parsed.document.type !== 'any';
|
|
@@ -60,16 +59,12 @@ function validateAgainst(documents, binaryTargets, prefix, model, binding) {
|
|
|
60
59
|
file: `${prefix}${typed[0]}`,
|
|
61
60
|
version: VERSION
|
|
62
61
|
};
|
|
63
|
-
return validate(documents, {
|
|
64
|
-
binaryTargets
|
|
65
|
-
});
|
|
66
62
|
}
|
|
67
|
-
const verdict =
|
|
68
|
-
model: model.snapshot,
|
|
69
|
-
documents,
|
|
63
|
+
const verdict = validate(documents, {
|
|
70
64
|
binaryTargets
|
|
65
|
+
}, model.status === 'unavailable' ? NO_TYPES : {
|
|
66
|
+
types: model.types
|
|
71
67
|
});
|
|
72
|
-
if (verdict.verdict === 'refuse' && verdict.source === 'model') return verdict;
|
|
73
68
|
if (verdict.verdict === 'accept') return verdict;
|
|
74
69
|
return {
|
|
75
70
|
...verdict,
|
|
@@ -79,7 +74,7 @@ function validateAgainst(documents, binaryTargets, prefix, model, binding) {
|
|
|
79
74
|
}
|
|
80
75
|
};
|
|
81
76
|
}
|
|
82
|
-
export function validateCollection(text, binaryTargets, composition
|
|
77
|
+
export function validateCollection(text, binaryTargets, composition) {
|
|
83
78
|
const prefix = composition.collectionRoot === '' ? '' : `${composition.collectionRoot}/`;
|
|
84
79
|
const collection = {};
|
|
85
80
|
const selection = {};
|
|
@@ -107,10 +102,10 @@ export function validateCollection(text, binaryTargets, composition, binding) {
|
|
|
107
102
|
}
|
|
108
103
|
}
|
|
109
104
|
const verdicts = [
|
|
110
|
-
validateAgainst(collection, binaryTargets.filter((path)=>member(path, composition.collectionRoot)).map((path)=>path.slice(prefix.length)), prefix, composition.model
|
|
105
|
+
validateAgainst(collection, binaryTargets.filter((path)=>member(path, composition.collectionRoot)).map((path)=>path.slice(prefix.length)), prefix, composition.model)
|
|
111
106
|
];
|
|
112
107
|
if (composition.selection !== null) {
|
|
113
|
-
verdicts.push(validateAgainst(selection, binaryTargets.filter((path)=>selected(composition, path)), '', composition.selection.model
|
|
108
|
+
verdicts.push(validateAgainst(selection, binaryTargets.filter((path)=>selected(composition, path)), '', composition.selection.model));
|
|
114
109
|
}
|
|
115
110
|
const refusals = verdicts.filter((verdict)=>verdict.verdict === 'refuse');
|
|
116
111
|
if (refusals.length === 0) return verdicts[0];
|
package/dist/collection.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/workspace/packages/mdruntime/src/collection.ts"],"sourcesContent":["import { parse, validate, VERSION, type Document, type Validation } from '@agentshouse/mdmodel';\nimport type { Selector } from '@agentshouse/query';\nimport { beneath, normalize } from './paths.js';\nimport type { AttachedModelBinding, ModelState } from './model.js';\nimport type { MdModelIdentity } from './adapter.js';\n\nexport const MD_MODEL: MdModelIdentity = { identity: '@agentshouse/mdmodel', version: VERSION };\n\nexport const PRESENTED: Selector = { path: { $regex: '\\\\.md$' } };\n\nexport type MdType = {\n name: string;\n path: string;\n fields: Readonly<Record<string, unknown>>;\n sections: Readonly<Record<string, unknown>>;\n};\n\nexport type Collection = {\n documents: Readonly<Record<string, Document>>;\n composition: Composition;\n};\n\nexport type Composition = {\n collectionRoot: string;\n model: ModelState;\n selection: { roots: readonly string[]; model: ModelState } | null;\n};\n\nfunction selected(composition: Composition, path: string): boolean {\n return (\n composition.selection !== null &&\n composition.selection.roots.some((root) => beneath(root, path))\n );\n}\n\nexport function governing(composition: Composition, path: string): ModelState {\n return composition.selection !== null && selected(composition, path)\n ? composition.selection.model\n : composition.model;\n}\n\nexport function typesAt(composition: Composition, path: string): readonly MdType[] {\n const model = governing(composition, path);\n return model.status === 'unavailable' ? [] : model.types;\n}\n\nexport function parseCollection(\n text: Readonly<Record<string, string>>,\n composition: Composition,\n previous?: { text: Readonly<Record<string, string>>; collection: Collection },\n): Collection {\n const documents: Record<string, Document> = {};\n for (const path of Object.keys(text).sort()) {\n const retained = previous?.collection.documents[path];\n if (retained !== undefined && previous?.text[path] === text[path]) {\n documents[path] = retained;\n continue;\n }\n const parsed = parse(text[path], path);\n if (parsed.ok) documents[path] = parsed.document;\n }\n return { documents, composition };\n}\n\nexport function readCollection(\n text: Readonly<Record<string, string>>,\n composition: Composition,\n previous?: { text: Readonly<Record<string, string>>; collection: Collection },\n): Collection | null {\n if (!validRoot(composition.collectionRoot)) return null;\n const collection = parseCollection(text, composition, previous);\n if (Object.keys(collection.documents).length !== Object.keys(text).length) return null;\n if (\n Object.entries(collection.documents).some(\n ([path, document]) =>\n !member(path, composition.collectionRoot) &&\n !selected(composition, path) &&\n document.type !== undefined &&\n document.type !== 'any',\n )\n )\n return null;\n return collection;\n}\n\nexport function validRoot(root: unknown): root is string {\n return typeof root === 'string' && normalize(root) === root;\n}\n\nfunction member(path: string, root: string): boolean {\n return root === '' || path.startsWith(`${root}/`);\n}\n\ntype Refusal = Extract<Validation, { verdict: 'refuse' }> & { source?: 'content' | 'model' };\n\nfunction validateAgainst(\n documents: Readonly<Record<string, string>>,\n binaryTargets: readonly string[],\n prefix: string,\n model: ModelState,\n binding: AttachedModelBinding | null,\n): Validation & { source?: 'content' | 'model' } {\n if (model.status === 'unavailable' || binding === null) {\n const typed = Object.entries(documents).find(([, content]) => {\n const parsed = parse(content);\n return parsed.ok && parsed.document.type !== undefined && parsed.document.type !== 'any';\n });\n if (typed !== undefined)\n return {\n verdict: 'refuse',\n rule: 'model-unavailable',\n file: `${prefix}${typed[0]}`,\n version: VERSION,\n };\n return validate(documents, { binaryTargets });\n }\n const verdict = binding.validate({ model: model.snapshot, documents, binaryTargets });\n if (verdict.verdict === 'refuse' && verdict.source === 'model') return verdict;\n if (verdict.verdict === 'accept') return verdict;\n return {\n ...verdict,\n file: `${prefix}${verdict.file}`,\n ...(verdict.referrers === undefined\n ? {}\n : { referrers: verdict.referrers.map((path) => `${prefix}${path}`) }),\n };\n}\n\nexport function validateCollection(\n text: Readonly<Record<string, string>>,\n binaryTargets: readonly string[],\n composition: Composition,\n binding: AttachedModelBinding | null,\n): Validation & { source?: 'content' | 'model' } {\n const prefix = composition.collectionRoot === '' ? '' : `${composition.collectionRoot}/`;\n const collection: Record<string, string> = {};\n const selection: Record<string, string> = {};\n for (const [path, content] of Object.entries(text)) {\n if (member(path, composition.collectionRoot)) {\n collection[path.slice(prefix.length)] = content;\n continue;\n }\n if (selected(composition, path)) {\n selection[path] = content;\n continue;\n }\n const parsed = parse(content, path);\n if (!parsed.ok) return { verdict: 'refuse', ...parsed.refusal };\n if (Object.hasOwn(parsed.document.fields, 'type') && parsed.document.fields.type !== 'any') {\n return { verdict: 'refuse', rule: 'outside-collection-type', file: path, version: VERSION };\n }\n }\n const verdicts = [\n validateAgainst(\n collection,\n binaryTargets\n .filter((path) => member(path, composition.collectionRoot))\n .map((path) => path.slice(prefix.length)),\n prefix,\n composition.model,\n binding,\n ),\n ];\n if (composition.selection !== null) {\n verdicts.push(\n validateAgainst(\n selection,\n binaryTargets.filter((path) => selected(composition, path)),\n '',\n composition.selection.model,\n binding,\n ),\n );\n }\n const refusals = verdicts.filter((verdict): verdict is Refusal => verdict.verdict === 'refuse');\n if (refusals.length === 0) return verdicts[0];\n return refusals.find((refusal) => refusal.rule !== 'model-unavailable') ?? refusals[0];\n}\n"],"names":["parse","validate","VERSION","beneath","normalize","MD_MODEL","identity","version","PRESENTED","path","$regex","selected","composition","selection","roots","some","root","governing","model","typesAt","status","types","parseCollection","text","previous","documents","Object","keys","sort","retained","collection","undefined","parsed","ok","document","readCollection","validRoot","collectionRoot","length","entries","member","type","startsWith","validateAgainst","binaryTargets","prefix","binding","typed","find","content","verdict","rule","file","snapshot","source","referrers","map","validateCollection","slice","refusal","hasOwn","fields","verdicts","filter","push","refusals"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/workspace/packages/mdruntime/src/collection.ts"],"sourcesContent":["import {\n parse,\n validate,\n VERSION,\n type Document,\n type Validation,\n type VerifiedModel,\n} from '@agentshouse/mdmodel';\nimport type { Selector } from '@agentshouse/query';\nimport { beneath, normalize } from './paths.js';\nimport type { ModelState } from './model.js';\nimport type { MdModelIdentity } from './adapter.js';\n\nexport const MD_MODEL: MdModelIdentity = { identity: '@agentshouse/mdmodel', version: VERSION };\n\nexport const PRESENTED: Selector = { path: { $regex: '\\\\.md$' } };\n\nconst NO_TYPES: VerifiedModel = { types: {} };\n\nexport type Collection = {\n documents: Readonly<Record<string, Document>>;\n composition: Composition;\n};\n\nexport type Composition = {\n collectionRoot: string;\n model: ModelState;\n selection: { roots: readonly string[]; model: ModelState } | null;\n};\n\nfunction selected(composition: Composition, path: string): boolean {\n return (\n composition.selection !== null &&\n composition.selection.roots.some((root) => beneath(root, path))\n );\n}\n\nexport function governing(composition: Composition, path: string): ModelState {\n return composition.selection !== null && selected(composition, path)\n ? composition.selection.model\n : composition.model;\n}\n\nexport function parseCollection(\n text: Readonly<Record<string, string>>,\n composition: Composition,\n previous?: { text: Readonly<Record<string, string>>; collection: Collection },\n): Collection {\n const documents: Record<string, Document> = {};\n for (const path of Object.keys(text).sort()) {\n const retained = previous?.collection.documents[path];\n if (retained !== undefined && previous?.text[path] === text[path]) {\n documents[path] = retained;\n continue;\n }\n const parsed = parse(text[path], path);\n if (parsed.ok) documents[path] = parsed.document;\n }\n return { documents, composition };\n}\n\nexport function readCollection(\n text: Readonly<Record<string, string>>,\n composition: Composition,\n previous?: { text: Readonly<Record<string, string>>; collection: Collection },\n): Collection | null {\n if (!validRoot(composition.collectionRoot)) return null;\n const collection = parseCollection(text, composition, previous);\n if (Object.keys(collection.documents).length !== Object.keys(text).length) return null;\n if (\n Object.entries(collection.documents).some(\n ([path, document]) =>\n !member(path, composition.collectionRoot) &&\n !selected(composition, path) &&\n document.type !== undefined &&\n document.type !== 'any',\n )\n )\n return null;\n return collection;\n}\n\nexport function validRoot(root: unknown): root is string {\n return typeof root === 'string' && normalize(root) === root;\n}\n\nfunction member(path: string, root: string): boolean {\n return root === '' || path.startsWith(`${root}/`);\n}\n\ntype Refusal = Extract<Validation, { verdict: 'refuse' }>;\n\nfunction validateAgainst(\n documents: Readonly<Record<string, string>>,\n binaryTargets: readonly string[],\n prefix: string,\n model: ModelState,\n): Validation {\n if (model.status === 'unavailable') {\n const typed = Object.entries(documents).find(([, content]) => {\n const parsed = parse(content);\n return parsed.ok && parsed.document.type !== undefined && parsed.document.type !== 'any';\n });\n if (typed !== undefined)\n return {\n verdict: 'refuse',\n rule: 'model-unavailable',\n file: `${prefix}${typed[0]}`,\n version: VERSION,\n };\n }\n const verdict = validate(\n documents,\n { binaryTargets },\n model.status === 'unavailable' ? NO_TYPES : { types: model.types },\n );\n if (verdict.verdict === 'accept') return verdict;\n return {\n ...verdict,\n file: `${prefix}${verdict.file}`,\n ...(verdict.referrers === undefined\n ? {}\n : { referrers: verdict.referrers.map((path) => `${prefix}${path}`) }),\n };\n}\n\nexport function validateCollection(\n text: Readonly<Record<string, string>>,\n binaryTargets: readonly string[],\n composition: Composition,\n): Validation {\n const prefix = composition.collectionRoot === '' ? '' : `${composition.collectionRoot}/`;\n const collection: Record<string, string> = {};\n const selection: Record<string, string> = {};\n for (const [path, content] of Object.entries(text)) {\n if (member(path, composition.collectionRoot)) {\n collection[path.slice(prefix.length)] = content;\n continue;\n }\n if (selected(composition, path)) {\n selection[path] = content;\n continue;\n }\n const parsed = parse(content, path);\n if (!parsed.ok) return { verdict: 'refuse', ...parsed.refusal };\n if (Object.hasOwn(parsed.document.fields, 'type') && parsed.document.fields.type !== 'any') {\n return { verdict: 'refuse', rule: 'outside-collection-type', file: path, version: VERSION };\n }\n }\n const verdicts = [\n validateAgainst(\n collection,\n binaryTargets\n .filter((path) => member(path, composition.collectionRoot))\n .map((path) => path.slice(prefix.length)),\n prefix,\n composition.model,\n ),\n ];\n if (composition.selection !== null) {\n verdicts.push(\n validateAgainst(\n selection,\n binaryTargets.filter((path) => selected(composition, path)),\n '',\n composition.selection.model,\n ),\n );\n }\n const refusals = verdicts.filter((verdict): verdict is Refusal => verdict.verdict === 'refuse');\n if (refusals.length === 0) return verdicts[0];\n return refusals.find((refusal) => refusal.rule !== 'model-unavailable') ?? refusals[0];\n}\n"],"names":["parse","validate","VERSION","beneath","normalize","MD_MODEL","identity","version","PRESENTED","path","$regex","NO_TYPES","types","selected","composition","selection","roots","some","root","governing","model","parseCollection","text","previous","documents","Object","keys","sort","retained","collection","undefined","parsed","ok","document","readCollection","validRoot","collectionRoot","length","entries","member","type","startsWith","validateAgainst","binaryTargets","prefix","status","typed","find","content","verdict","rule","file","referrers","map","validateCollection","slice","refusal","hasOwn","fields","verdicts","filter","push","refusals"],"mappings":"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"}
|
package/dist/connection.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { type QueryBinding } from './query.js';
|
|
2
|
-
import { type
|
|
2
|
+
import { type TypesResult } from './model.js';
|
|
3
3
|
import { type QueryOptions, type QueryResult } from '@agentshouse/query';
|
|
4
4
|
import { type Adapter, type Authorization, type HistoryResult, type ProviderRefusal } from './adapter.js';
|
|
5
|
-
import { type ConversationSurface, type ConversationView } from './conversation.js';
|
|
5
|
+
import { type ChatDraftSurface, type ConversationOptions, type ConversationSurface, type ConversationView } from './conversation.js';
|
|
6
6
|
import type { Change, WrittenBy } from './change.js';
|
|
7
7
|
import { type CallResult, type QueueEntry, type SubmissionOutcome } from './outcome.js';
|
|
8
8
|
import { type SaveRefusal } from './save.js';
|
|
@@ -48,7 +48,6 @@ export type ConnectionRefusal = {
|
|
|
48
48
|
export type MdRuntimeOptions = {
|
|
49
49
|
adapter: Adapter;
|
|
50
50
|
shell: RuntimeShell;
|
|
51
|
-
modelBinding: AttachedModelBinding | null;
|
|
52
51
|
queryBinding: QueryBinding | null;
|
|
53
52
|
requiredGuarantees: readonly string[];
|
|
54
53
|
authorization?: Authorization;
|
|
@@ -92,6 +91,7 @@ export type MdRuntime = {
|
|
|
92
91
|
syncStatus(): SyncStatus;
|
|
93
92
|
draft: DraftSurface;
|
|
94
93
|
conversation: ConversationSurface;
|
|
94
|
+
chatDraft: ChatDraftSurface;
|
|
95
95
|
presentation: PresentationSurface;
|
|
96
96
|
save(locator: string, changes: readonly Change[], replacing?: string, writtenBy?: WrittenBy): Promise<SaveResult>;
|
|
97
97
|
outcome(identifier: string): SubmissionOutcome | null;
|
|
@@ -110,7 +110,7 @@ export type MdRuntime = {
|
|
|
110
110
|
(topic: 'queue', locator: string, listener: (entries: readonly QueueEntry[]) => void): () => void;
|
|
111
111
|
(topic: 'drafts', listener: (drafts: readonly DraftEntry[]) => void): () => void;
|
|
112
112
|
(topic: 'presentation', app: string, listener: (value: unknown) => void): () => void;
|
|
113
|
-
(topic: 'conversation', conversation: string, listener: (view: ConversationView) => void): () => void;
|
|
113
|
+
(topic: 'conversation', conversation: string, options: ConversationOptions, listener: (view: ConversationView) => void): () => void;
|
|
114
114
|
};
|
|
115
115
|
reauthorize(): Promise<void>;
|
|
116
116
|
};
|
package/dist/connection.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,YAAY,EAAmB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
|
package/dist/connection.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { rawQuery } from './query.js';
|
|
2
|
+
import { verify } from '@agentshouse/mdmodel';
|
|
2
3
|
import { cached, modelTypes, NO_MODEL, sameModel } from './model.js';
|
|
3
4
|
import { ROOM_CONTRACT_VERSION, VERSION_1_CAPABILITIES } from './adapter.js';
|
|
4
5
|
import { bootstrapRoom } from './bootstrap.js';
|
|
@@ -79,6 +80,7 @@ export function createMdRuntime(options) {
|
|
|
79
80
|
let refusal = null;
|
|
80
81
|
let storageLoss = null;
|
|
81
82
|
let status = STARTING;
|
|
83
|
+
let shown = STARTING;
|
|
82
84
|
let discoveryPaused = false;
|
|
83
85
|
let timer;
|
|
84
86
|
let closed = false;
|
|
@@ -98,12 +100,14 @@ export function createMdRuntime(options) {
|
|
|
98
100
|
const draftListeners = new Set();
|
|
99
101
|
const presentationListeners = new Set();
|
|
100
102
|
let withdrawConversations;
|
|
103
|
+
let currencyQueued = false;
|
|
101
104
|
const conversations = createConversationStore({
|
|
102
105
|
cards: declaredCards,
|
|
103
|
-
documents: ()=>visible({}),
|
|
106
|
+
documents: ()=>visible({}).documents,
|
|
104
107
|
call: (name, input)=>invokeAction(name, input),
|
|
105
108
|
durably,
|
|
106
|
-
|
|
109
|
+
stream: ()=>options.adapter.conversations,
|
|
110
|
+
publish: publishChangeSet,
|
|
107
111
|
closed: ()=>closed
|
|
108
112
|
});
|
|
109
113
|
const journal = createLog();
|
|
@@ -263,9 +267,19 @@ export function createMdRuntime(options) {
|
|
|
263
267
|
for (const listener of storageLossListeners)listener(storageLoss);
|
|
264
268
|
}
|
|
265
269
|
function moveTo(next) {
|
|
266
|
-
if (closed
|
|
270
|
+
if (closed) return;
|
|
267
271
|
status = next;
|
|
268
|
-
|
|
272
|
+
show();
|
|
273
|
+
}
|
|
274
|
+
function show() {
|
|
275
|
+
if (closed) return;
|
|
276
|
+
const next = status.state === 'synced' && !conversations.current() ? {
|
|
277
|
+
...status,
|
|
278
|
+
state: 'syncing'
|
|
279
|
+
} : status;
|
|
280
|
+
if (same(shown, next)) return;
|
|
281
|
+
shown = next;
|
|
282
|
+
for (const listener of statusListeners)listener(shown);
|
|
269
283
|
}
|
|
270
284
|
function visible(request) {
|
|
271
285
|
if (options.queryBinding === null) {
|
|
@@ -307,6 +321,11 @@ export function createMdRuntime(options) {
|
|
|
307
321
|
for (const locator of set.queues)emitQueue(locator);
|
|
308
322
|
if (set.drafts.length > 0) emitDrafts();
|
|
309
323
|
for (const app of set.presentations)emitPresentation(app);
|
|
324
|
+
conversations.changed(set);
|
|
325
|
+
const cards = declaredCards();
|
|
326
|
+
if (cards !== undefined && set.documents.some((change)=>change.locator === cards.locator)) {
|
|
327
|
+
scheduleCurrency();
|
|
328
|
+
}
|
|
310
329
|
}
|
|
311
330
|
function stopTimer() {
|
|
312
331
|
if (timer === undefined) return;
|
|
@@ -494,14 +513,14 @@ export function createMdRuntime(options) {
|
|
|
494
513
|
return model;
|
|
495
514
|
}
|
|
496
515
|
async function hydrate(opened) {
|
|
497
|
-
const [records, queues, recordedOutcomes, kept, presented,
|
|
516
|
+
const [records, queues, recordedOutcomes, kept, presented, held, chatDrafts, lastCompleted, declared, named, listedSlots] = await Promise.all([
|
|
498
517
|
opened.all(),
|
|
499
518
|
opened.queues(),
|
|
500
519
|
opened.outcomes(),
|
|
501
520
|
opened.drafts(),
|
|
502
521
|
opened.presentation(),
|
|
503
522
|
opened.conversations(),
|
|
504
|
-
opened.
|
|
523
|
+
opened.chatDrafts(),
|
|
505
524
|
opened.lastCompleted(),
|
|
506
525
|
opened.providerLimits(),
|
|
507
526
|
opened.capabilities(),
|
|
@@ -514,7 +533,7 @@ export function createMdRuntime(options) {
|
|
|
514
533
|
for (const draft of kept)rememberDraft(draft.locator, draft.path, draft.content);
|
|
515
534
|
presentations.clear();
|
|
516
535
|
for (const record of presented)presentations.set(record.app, record.value);
|
|
517
|
-
conversations.hydrate(
|
|
536
|
+
conversations.hydrate(held, chatDrafts);
|
|
518
537
|
const queuedBatches = new Map(queues.map((queue)=>[
|
|
519
538
|
queue.locator,
|
|
520
539
|
queue.batches
|
|
@@ -652,7 +671,6 @@ export function createMdRuntime(options) {
|
|
|
652
671
|
baseRoomVersion: replica.confirmed.record.roomVersion,
|
|
653
672
|
composition: compositionFor(replica.confirmed.record),
|
|
654
673
|
operations: room.operations,
|
|
655
|
-
binding: options.modelBinding,
|
|
656
674
|
providerOwnedPaths: room.providerOwnedPaths,
|
|
657
675
|
providerLimits: limits,
|
|
658
676
|
rewriting: rewriting(),
|
|
@@ -853,7 +871,7 @@ export function createMdRuntime(options) {
|
|
|
853
871
|
}
|
|
854
872
|
async function pullRefresh(authorized, confirmed) {
|
|
855
873
|
try {
|
|
856
|
-
const result = await refreshRoom(options.adapter, authorized, confirmed
|
|
874
|
+
const result = await refreshRoom(options.adapter, authorized, confirmed);
|
|
857
875
|
const detail = result.kind === 'advanced' ? result.confirmed.record.roomVersion : result.kind;
|
|
858
876
|
journal.record(`transfer refresh ${confirmed.record.locator} ${detail}`);
|
|
859
877
|
return result;
|
|
@@ -867,7 +885,7 @@ export function createMdRuntime(options) {
|
|
|
867
885
|
const result = await bootstrapRoom(options.adapter, authorized, room, {
|
|
868
886
|
collection: modelOf(room.locator),
|
|
869
887
|
selection: modelOf(room.locator, 'typed-selection')
|
|
870
|
-
}
|
|
888
|
+
});
|
|
871
889
|
const detail = result.kind === 'staged' ? result.confirmed.record.roomVersion : result.kind;
|
|
872
890
|
journal.record(`transfer bootstrap ${room.locator} ${detail}`);
|
|
873
891
|
return result;
|
|
@@ -944,7 +962,7 @@ export function createMdRuntime(options) {
|
|
|
944
962
|
selectionModel: modelOf(room.locator, 'typed-selection')
|
|
945
963
|
}, base);
|
|
946
964
|
if (retainedBase === null) return false;
|
|
947
|
-
const applied = overlay ? applyReturned(retainedBase, accepted.documents, accepted.revisions, accepted.removals, accepted.roomVersion
|
|
965
|
+
const applied = overlay ? applyReturned(retainedBase, accepted.documents, accepted.revisions, accepted.removals, accepted.roomVersion) : retainedBase;
|
|
948
966
|
if (applied === null) return false;
|
|
949
967
|
const acceptedOutcome = {
|
|
950
968
|
kind: 'accepted',
|
|
@@ -1261,15 +1279,16 @@ export function createMdRuntime(options) {
|
|
|
1261
1279
|
});
|
|
1262
1280
|
return;
|
|
1263
1281
|
}
|
|
1264
|
-
const verified =
|
|
1265
|
-
|
|
1282
|
+
const verified = verify(answer.snapshot.definitions);
|
|
1283
|
+
if (verified.verdict === 'refuse') journal.record(`model invalid ${room.locator} ${attached} ${verified.rule} ${verified.file}`);
|
|
1284
|
+
await retainModel(local, room, attached, verified.verdict === 'accept' ? {
|
|
1266
1285
|
status: 'current',
|
|
1267
1286
|
snapshot: structuredClone(answer.snapshot),
|
|
1268
1287
|
verifiedWith: MD_MODEL,
|
|
1269
|
-
types: verified.types
|
|
1288
|
+
types: verified.model.types
|
|
1270
1289
|
} : {
|
|
1271
1290
|
status: 'unavailable',
|
|
1272
|
-
reason:
|
|
1291
|
+
reason: 'invalid'
|
|
1273
1292
|
});
|
|
1274
1293
|
}
|
|
1275
1294
|
async function scoped(result, room, local) {
|
|
@@ -1476,6 +1495,10 @@ export function createMdRuntime(options) {
|
|
|
1476
1495
|
handSelected(result.rooms.filter((room)=>room.replica.admission === 'admitted').map((room)=>room.locator).sort());
|
|
1477
1496
|
progress.complete = true;
|
|
1478
1497
|
await synchronize(result.rooms, local, progress);
|
|
1498
|
+
if (closed || discoveryPaused) return;
|
|
1499
|
+
await conversations.reconcile();
|
|
1500
|
+
if (status.providerUnreachable) conversations.reconnected();
|
|
1501
|
+
await conversations.catchUp(progress);
|
|
1479
1502
|
}
|
|
1480
1503
|
async function ensureAuthorization() {
|
|
1481
1504
|
if (authorization !== undefined) return;
|
|
@@ -1539,12 +1562,44 @@ export function createMdRuntime(options) {
|
|
|
1539
1562
|
});
|
|
1540
1563
|
}
|
|
1541
1564
|
function observeConversations() {
|
|
1542
|
-
const
|
|
1543
|
-
if (
|
|
1544
|
-
withdrawConversations =
|
|
1565
|
+
const stream = options.adapter.conversations;
|
|
1566
|
+
if (stream === undefined || withdrawConversations !== undefined) return;
|
|
1567
|
+
withdrawConversations = stream.observe((event)=>{
|
|
1545
1568
|
conversations.receive(event);
|
|
1569
|
+
if (event.kind !== 'gap' || conversations.current()) return;
|
|
1570
|
+
show();
|
|
1571
|
+
scheduleCurrency();
|
|
1546
1572
|
});
|
|
1547
1573
|
}
|
|
1574
|
+
function scheduleCurrency() {
|
|
1575
|
+
if (currencyQueued || closed) return;
|
|
1576
|
+
currencyQueued = true;
|
|
1577
|
+
chain = chain.then(runCurrency, runCurrency);
|
|
1578
|
+
}
|
|
1579
|
+
async function runCurrency() {
|
|
1580
|
+
currencyQueued = false;
|
|
1581
|
+
if (closed || discoveryPaused) return;
|
|
1582
|
+
await conversations.reconcile();
|
|
1583
|
+
if (conversations.current()) {
|
|
1584
|
+
show();
|
|
1585
|
+
return;
|
|
1586
|
+
}
|
|
1587
|
+
const resting = status;
|
|
1588
|
+
const progress = {
|
|
1589
|
+
complete: false,
|
|
1590
|
+
reachable: !resting.providerUnreachable
|
|
1591
|
+
};
|
|
1592
|
+
moveTo(transferring(resting));
|
|
1593
|
+
try {
|
|
1594
|
+
await conversations.catchUp(progress);
|
|
1595
|
+
} catch {
|
|
1596
|
+
progress.reachable = false;
|
|
1597
|
+
} finally{
|
|
1598
|
+
if (!closed) {
|
|
1599
|
+
moveTo(settled(resting, progress, resting.lastCompleted, pending(), attention()));
|
|
1600
|
+
}
|
|
1601
|
+
}
|
|
1602
|
+
}
|
|
1548
1603
|
function handSelected(locators) {
|
|
1549
1604
|
const path = options.adapter.roomVersions;
|
|
1550
1605
|
if (path === undefined || withdrawNotifications === undefined) return;
|
|
@@ -1660,7 +1715,7 @@ export function createMdRuntime(options) {
|
|
|
1660
1715
|
};
|
|
1661
1716
|
},
|
|
1662
1717
|
syncStatus () {
|
|
1663
|
-
return
|
|
1718
|
+
return shown;
|
|
1664
1719
|
},
|
|
1665
1720
|
draft: {
|
|
1666
1721
|
list () {
|
|
@@ -1695,6 +1750,7 @@ export function createMdRuntime(options) {
|
|
|
1695
1750
|
}
|
|
1696
1751
|
},
|
|
1697
1752
|
conversation: conversations.surface,
|
|
1753
|
+
chatDraft: conversations.chatDraft,
|
|
1698
1754
|
presentation: {
|
|
1699
1755
|
read (app) {
|
|
1700
1756
|
return exclusive(async ()=>{
|
|
@@ -1750,7 +1806,7 @@ export function createMdRuntime(options) {
|
|
|
1750
1806
|
persistence () {
|
|
1751
1807
|
return options.shell.persistentStorage;
|
|
1752
1808
|
},
|
|
1753
|
-
observe (topic, second, third) {
|
|
1809
|
+
observe (topic, second, third, fourth) {
|
|
1754
1810
|
if (topic === 'drafts') {
|
|
1755
1811
|
const notify = second;
|
|
1756
1812
|
const listener = {
|
|
@@ -1771,7 +1827,7 @@ export function createMdRuntime(options) {
|
|
|
1771
1827
|
};
|
|
1772
1828
|
}
|
|
1773
1829
|
if (topic === 'conversation') {
|
|
1774
|
-
return conversations.observe(second, third);
|
|
1830
|
+
return conversations.observe(second, third, fourth);
|
|
1775
1831
|
}
|
|
1776
1832
|
if (topic === 'presentation') {
|
|
1777
1833
|
const listener = {
|
|
@@ -1818,7 +1874,7 @@ export function createMdRuntime(options) {
|
|
|
1818
1874
|
if (topic === 'sync-status') {
|
|
1819
1875
|
const notify = second;
|
|
1820
1876
|
statusListeners.add(notify);
|
|
1821
|
-
notify(
|
|
1877
|
+
notify(shown);
|
|
1822
1878
|
return ()=>{
|
|
1823
1879
|
statusListeners.delete(notify);
|
|
1824
1880
|
};
|