@agentshouse/mdruntime 0.1.0-alpha.49 → 0.1.0-alpha.50

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/dist/host.js CHANGED
@@ -26,7 +26,7 @@ function answered(md, app, writtenBy, member, input, deploymentFacts) {
26
26
  case 'call':
27
27
  return md.call(input[0], input[1]);
28
28
  case 'reached':
29
- return md.reached(input[0], input[1]);
29
+ return md.reached(input[0], input[1], input[2]);
30
30
  case 'log':
31
31
  return md.log();
32
32
  case 'storageLoss':
package/dist/host.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime/src/host.ts"],"sourcesContent":["import type { WrittenBy } from './change.js';\nimport {\n composeRuntime,\n type HistoryQuery,\n type MdRuntime,\n type MdRuntimeOptions,\n type SavedRoomDraft,\n} from './connection.js';\nimport type { ChatDraft, ConversationOptions } from './conversation.js';\nimport type { DocumentQuery } from './query.js';\nimport type { SearchRequest } from './search.js';\nimport { removeRuntimeStore } from './store.js';\nimport {\n AUTHORIZATION_ENDED,\n carried,\n envelope,\n PROTOCOL_MISMATCH,\n request,\n type RuntimePort,\n type WireAnswer,\n type WireMember,\n type WireRequest,\n} from './wire.js';\n\nexport type MdRuntimeHostOptions = MdRuntimeOptions & { deploymentFacts?: unknown };\n\nexport type MdRuntimeHost = {\n replaceDeploymentFacts(value: unknown): void;\n attach(port: RuntimePort, app: string, release?: string): () => void;\n endAuthorization(): Promise<void>;\n stop(): Promise<void>;\n};\n\nfunction answered(\n md: MdRuntime,\n app: string,\n writtenBy: WrittenBy | undefined,\n member: WireMember,\n input: readonly unknown[],\n deploymentFacts: unknown,\n): unknown {\n switch (member) {\n case 'rooms':\n return md.rooms();\n case 'slots':\n return md.slots();\n case 'query':\n return md.query(input[0] as DocumentQuery);\n case 'search':\n return md.search(input[0] as SearchRequest);\n case 'types':\n return md.types(input[0] as string);\n case 'syncStatus':\n return md.syncStatus();\n case 'serviceMode':\n return md.serviceMode();\n case 'save':\n return md.save(input[0] as string, input[1] as readonly SavedRoomDraft[], writtenBy);\n case 'outcome':\n return md.outcome(input[0] as string);\n case 'history':\n return md.history(input[0] as string, input[1] as string, input[2] as HistoryQuery);\n case 'call':\n return md.call(input[0] as string, input[1]);\n case 'reached':\n return md.reached(input[0] as string, input[1] as string);\n case 'log':\n return md.log();\n case 'storageLoss':\n return md.storageLoss();\n case 'deploymentFacts':\n return structuredClone(deploymentFacts);\n case 'persistence':\n return md.persistence();\n case 'reauthorize':\n return md.reauthorize();\n case 'roomDraft.list':\n return md.roomDraft.list();\n case 'roomDraft.read':\n return md.roomDraft.read(input[0] as string, input[1] as string);\n case 'roomDraft.write':\n return md.roomDraft.write(\n input[0] as string,\n input[1] as string,\n input[2] as string | null,\n input[3],\n );\n case 'roomDraft.discard':\n return md.roomDraft.discard(input[0] as string, input[1] as string, input[2] as string);\n case 'presentation.read':\n return md.presentation.read(app);\n case 'presentation.write':\n return md.presentation.write(app, input[0]);\n case 'conversation.list':\n return md.conversation.list();\n case 'conversation.read':\n return md.conversation.read(input[0] as string, input[1] as ConversationOptions | undefined);\n case 'conversation.create':\n return md.conversation.create(input[0]);\n case 'conversation.send':\n return md.conversation.send(input[0] as string);\n case 'conversation.answer':\n return md.conversation.answer(input[0] as string, input[1]);\n case 'conversation.interrupt':\n return md.conversation.interrupt(input[0] as string);\n case 'conversation.kill':\n return md.conversation.kill(input[0] as string);\n case 'conversation.cancel':\n return md.conversation.cancel(input[0] as string, input[1] as string);\n case 'conversation.delete':\n return md.conversation.delete(input[0] as string);\n case 'chatDraft.write':\n return md.chatDraft.write(input[0] as string, input[1] as ChatDraft);\n case 'chatDraft.discard':\n return md.chatDraft.discard(input[0] as string);\n }\n}\n\nexport function serveMdRuntime(options: MdRuntimeHostOptions): MdRuntimeHost {\n let deploymentFacts = structuredClone(options.deploymentFacts);\n const closing = new AbortController();\n const close = () => {\n closing.abort();\n };\n options.signal?.addEventListener('abort', close, { once: true });\n if (options.signal?.aborted === true) close();\n const runtime = composeRuntime({ ...options, signal: closing.signal });\n const { md, watch } = runtime;\n const attachments = new Map<() => void, (message: WireAnswer) => void>();\n let authorized = true;\n const factsObservers = new Set<(value: unknown) => void>();\n const watchFacts = (deliver: (value: unknown) => void) => {\n factsObservers.add(deliver);\n deliver(structuredClone(deploymentFacts));\n return () => {\n factsObservers.delete(deliver);\n };\n };\n\n function attach(port: RuntimePort, app: string, release?: string): () => void {\n if (!authorized) throw new Error(AUTHORIZATION_ENDED);\n const writtenBy = release === undefined ? undefined : { app, release };\n const subscriptions = new Map<number, () => void>();\n let serving = true;\n const send = (message: WireAnswer) => {\n port.postMessage(envelope(message));\n };\n const detach = () => {\n if (!serving) return;\n serving = false;\n for (const end of subscriptions.values()) end();\n subscriptions.clear();\n attachments.delete(detach);\n };\n const serve = async (message: WireRequest) => {\n if (message.kind === 'hello') return;\n if (message.kind === 'stop') {\n subscriptions.get(message.id)?.();\n subscriptions.delete(message.id);\n return;\n }\n try {\n if (message.kind !== 'observe' || message.topic !== 'room-drafts') await md.loaded();\n if (message.kind === 'observe') {\n const { id, topic } = message;\n let resolved = false;\n const deliver = (value: unknown) => {\n if (!serving) return;\n send(resolved ? { kind: 'event', id, value } : { kind: 'result', id, value });\n resolved = true;\n };\n subscriptions.set(\n id,\n topic === 'deployment-facts'\n ? watchFacts(deliver)\n : watch(topic, topic === 'presentation' ? [app] : message.input, deliver),\n );\n return;\n }\n const value = await answered(\n md,\n app,\n writtenBy,\n message.member,\n message.input,\n deploymentFacts,\n );\n if (serving) send({ kind: 'result', id: message.id, value });\n } catch (error) {\n if (serving) {\n send({\n kind: 'failure',\n id: message.id,\n message: error instanceof Error ? error.message : String(error),\n });\n }\n }\n };\n port.addEventListener('message', (event) => {\n if (!serving) return;\n const wire = carried(event.data);\n if (wire === null) return;\n if (!wire.matching) {\n send({ kind: 'refusal', refusal: PROTOCOL_MISMATCH });\n detach();\n return;\n }\n const message = request(wire.message);\n if (message === null) return;\n void serve(message);\n });\n port.addEventListener('close', detach);\n port.start();\n attachments.set(detach, send);\n return detach;\n }\n\n return {\n attach,\n replaceDeploymentFacts(value) {\n if (!authorized) throw new Error(AUTHORIZATION_ENDED);\n deploymentFacts = structuredClone(value);\n for (const deliver of factsObservers) deliver(structuredClone(deploymentFacts));\n },\n async endAuthorization() {\n authorized = false;\n for (const [detach, send] of [...attachments]) {\n send({ kind: 'ended' });\n detach();\n }\n close();\n await removeRuntimeStore();\n await options.shell.dropGeneration();\n },\n stop() {\n return runtime.stop();\n },\n };\n}\n\nexport type { RuntimePort } from './wire.js';\n"],"names":["composeRuntime","removeRuntimeStore","AUTHORIZATION_ENDED","carried","envelope","PROTOCOL_MISMATCH","request","answered","md","app","writtenBy","member","input","deploymentFacts","rooms","slots","query","search","types","syncStatus","serviceMode","save","outcome","history","call","reached","log","storageLoss","structuredClone","persistence","reauthorize","roomDraft","list","read","write","discard","presentation","conversation","create","send","answer","interrupt","kill","cancel","delete","chatDraft","serveMdRuntime","options","closing","AbortController","close","abort","signal","addEventListener","once","aborted","runtime","watch","attachments","Map","authorized","factsObservers","Set","watchFacts","deliver","add","attach","port","release","Error","undefined","subscriptions","serving","message","postMessage","detach","end","values","clear","serve","kind","get","id","topic","loaded","resolved","value","set","error","String","event","wire","data","matching","refusal","start","replaceDeploymentFacts","endAuthorization","shell","dropGeneration","stop"],"mappings":"AACA,SACEA,cAAc,QAKT,kBAAkB;AAIzB,SAASC,kBAAkB,QAAQ,aAAa;AAChD,SACEC,mBAAmB,EACnBC,OAAO,EACPC,QAAQ,EACRC,iBAAiB,EACjBC,OAAO,QAKF,YAAY;AAWnB,SAASC,SACPC,EAAa,EACbC,GAAW,EACXC,SAAgC,EAChCC,MAAkB,EAClBC,KAAyB,EACzBC,eAAwB;IAExB,OAAQF;QACN,KAAK;YACH,OAAOH,GAAGM,KAAK;QACjB,KAAK;YACH,OAAON,GAAGO,KAAK;QACjB,KAAK;YACH,OAAOP,GAAGQ,KAAK,CAACJ,KAAK,CAAC,EAAE;QAC1B,KAAK;YACH,OAAOJ,GAAGS,MAAM,CAACL,KAAK,CAAC,EAAE;QAC3B,KAAK;YACH,OAAOJ,GAAGU,KAAK,CAACN,KAAK,CAAC,EAAE;QAC1B,KAAK;YACH,OAAOJ,GAAGW,UAAU;QACtB,KAAK;YACH,OAAOX,GAAGY,WAAW;QACvB,KAAK;YACH,OAAOZ,GAAGa,IAAI,CAACT,KAAK,CAAC,EAAE,EAAYA,KAAK,CAAC,EAAE,EAA+BF;QAC5E,KAAK;YACH,OAAOF,GAAGc,OAAO,CAACV,KAAK,CAAC,EAAE;QAC5B,KAAK;YACH,OAAOJ,GAAGe,OAAO,CAACX,KAAK,CAAC,EAAE,EAAYA,KAAK,CAAC,EAAE,EAAYA,KAAK,CAAC,EAAE;QACpE,KAAK;YACH,OAAOJ,GAAGgB,IAAI,CAACZ,KAAK,CAAC,EAAE,EAAYA,KAAK,CAAC,EAAE;QAC7C,KAAK;YACH,OAAOJ,GAAGiB,OAAO,CAACb,KAAK,CAAC,EAAE,EAAYA,KAAK,CAAC,EAAE;QAChD,KAAK;YACH,OAAOJ,GAAGkB,GAAG;QACf,KAAK;YACH,OAAOlB,GAAGmB,WAAW;QACvB,KAAK;YACH,OAAOC,gBAAgBf;QACzB,KAAK;YACH,OAAOL,GAAGqB,WAAW;QACvB,KAAK;YACH,OAAOrB,GAAGsB,WAAW;QACvB,KAAK;YACH,OAAOtB,GAAGuB,SAAS,CAACC,IAAI;QAC1B,KAAK;YACH,OAAOxB,GAAGuB,SAAS,CAACE,IAAI,CAACrB,KAAK,CAAC,EAAE,EAAYA,KAAK,CAAC,EAAE;QACvD,KAAK;YACH,OAAOJ,GAAGuB,SAAS,CAACG,KAAK,CACvBtB,KAAK,CAAC,EAAE,EACRA,KAAK,CAAC,EAAE,EACRA,KAAK,CAAC,EAAE,EACRA,KAAK,CAAC,EAAE;QAEZ,KAAK;YACH,OAAOJ,GAAGuB,SAAS,CAACI,OAAO,CAACvB,KAAK,CAAC,EAAE,EAAYA,KAAK,CAAC,EAAE,EAAYA,KAAK,CAAC,EAAE;QAC9E,KAAK;YACH,OAAOJ,GAAG4B,YAAY,CAACH,IAAI,CAACxB;QAC9B,KAAK;YACH,OAAOD,GAAG4B,YAAY,CAACF,KAAK,CAACzB,KAAKG,KAAK,CAAC,EAAE;QAC5C,KAAK;YACH,OAAOJ,GAAG6B,YAAY,CAACL,IAAI;QAC7B,KAAK;YACH,OAAOxB,GAAG6B,YAAY,CAACJ,IAAI,CAACrB,KAAK,CAAC,EAAE,EAAYA,KAAK,CAAC,EAAE;QAC1D,KAAK;YACH,OAAOJ,GAAG6B,YAAY,CAACC,MAAM,CAAC1B,KAAK,CAAC,EAAE;QACxC,KAAK;YACH,OAAOJ,GAAG6B,YAAY,CAACE,IAAI,CAAC3B,KAAK,CAAC,EAAE;QACtC,KAAK;YACH,OAAOJ,GAAG6B,YAAY,CAACG,MAAM,CAAC5B,KAAK,CAAC,EAAE,EAAYA,KAAK,CAAC,EAAE;QAC5D,KAAK;YACH,OAAOJ,GAAG6B,YAAY,CAACI,SAAS,CAAC7B,KAAK,CAAC,EAAE;QAC3C,KAAK;YACH,OAAOJ,GAAG6B,YAAY,CAACK,IAAI,CAAC9B,KAAK,CAAC,EAAE;QACtC,KAAK;YACH,OAAOJ,GAAG6B,YAAY,CAACM,MAAM,CAAC/B,KAAK,CAAC,EAAE,EAAYA,KAAK,CAAC,EAAE;QAC5D,KAAK;YACH,OAAOJ,GAAG6B,YAAY,CAACO,MAAM,CAAChC,KAAK,CAAC,EAAE;QACxC,KAAK;YACH,OAAOJ,GAAGqC,SAAS,CAACX,KAAK,CAACtB,KAAK,CAAC,EAAE,EAAYA,KAAK,CAAC,EAAE;QACxD,KAAK;YACH,OAAOJ,GAAGqC,SAAS,CAACV,OAAO,CAACvB,KAAK,CAAC,EAAE;IACxC;AACF;AAEA,OAAO,SAASkC,eAAeC,OAA6B;IAC1D,IAAIlC,kBAAkBe,gBAAgBmB,QAAQlC,eAAe;IAC7D,MAAMmC,UAAU,IAAIC;IACpB,MAAMC,QAAQ;QACZF,QAAQG,KAAK;IACf;IACAJ,QAAQK,MAAM,EAAEC,iBAAiB,SAASH,OAAO;QAAEI,MAAM;IAAK;IAC9D,IAAIP,QAAQK,MAAM,EAAEG,YAAY,MAAML;IACtC,MAAMM,UAAUxD,eAAe;QAAE,GAAG+C,OAAO;QAAEK,QAAQJ,QAAQI,MAAM;IAAC;IACpE,MAAM,EAAE5C,EAAE,EAAEiD,KAAK,EAAE,GAAGD;IACtB,MAAME,cAAc,IAAIC;IACxB,IAAIC,aAAa;IACjB,MAAMC,iBAAiB,IAAIC;IAC3B,MAAMC,aAAa,CAACC;QAClBH,eAAeI,GAAG,CAACD;QACnBA,QAAQpC,gBAAgBf;QACxB,OAAO;YACLgD,eAAejB,MAAM,CAACoB;QACxB;IACF;IAEA,SAASE,OAAOC,IAAiB,EAAE1D,GAAW,EAAE2D,OAAgB;QAC9D,IAAI,CAACR,YAAY,MAAM,IAAIS,MAAMnE;QACjC,MAAMQ,YAAY0D,YAAYE,YAAYA,YAAY;YAAE7D;YAAK2D;QAAQ;QACrE,MAAMG,gBAAgB,IAAIZ;QAC1B,IAAIa,UAAU;QACd,MAAMjC,OAAO,CAACkC;YACZN,KAAKO,WAAW,CAACtE,SAASqE;QAC5B;QACA,MAAME,SAAS;YACb,IAAI,CAACH,SAAS;YACdA,UAAU;YACV,KAAK,MAAMI,OAAOL,cAAcM,MAAM,GAAID;YAC1CL,cAAcO,KAAK;YACnBpB,YAAYd,MAAM,CAAC+B;QACrB;QACA,MAAMI,QAAQ,OAAON;YACnB,IAAIA,QAAQO,IAAI,KAAK,SAAS;YAC9B,IAAIP,QAAQO,IAAI,KAAK,QAAQ;gBAC3BT,cAAcU,GAAG,CAACR,QAAQS,EAAE;gBAC5BX,cAAc3B,MAAM,CAAC6B,QAAQS,EAAE;gBAC/B;YACF;YACA,IAAI;gBACF,IAAIT,QAAQO,IAAI,KAAK,aAAaP,QAAQU,KAAK,KAAK,eAAe,MAAM3E,GAAG4E,MAAM;gBAClF,IAAIX,QAAQO,IAAI,KAAK,WAAW;oBAC9B,MAAM,EAAEE,EAAE,EAAEC,KAAK,EAAE,GAAGV;oBACtB,IAAIY,WAAW;oBACf,MAAMrB,UAAU,CAACsB;wBACf,IAAI,CAACd,SAAS;wBACdjC,KAAK8C,WAAW;4BAAEL,MAAM;4BAASE;4BAAII;wBAAM,IAAI;4BAAEN,MAAM;4BAAUE;4BAAII;wBAAM;wBAC3ED,WAAW;oBACb;oBACAd,cAAcgB,GAAG,CACfL,IACAC,UAAU,qBACNpB,WAAWC,WACXP,MAAM0B,OAAOA,UAAU,iBAAiB;wBAAC1E;qBAAI,GAAGgE,QAAQ7D,KAAK,EAAEoD;oBAErE;gBACF;gBACA,MAAMsB,QAAQ,MAAM/E,SAClBC,IACAC,KACAC,WACA+D,QAAQ9D,MAAM,EACd8D,QAAQ7D,KAAK,EACbC;gBAEF,IAAI2D,SAASjC,KAAK;oBAAEyC,MAAM;oBAAUE,IAAIT,QAAQS,EAAE;oBAAEI;gBAAM;YAC5D,EAAE,OAAOE,OAAO;gBACd,IAAIhB,SAAS;oBACXjC,KAAK;wBACHyC,MAAM;wBACNE,IAAIT,QAAQS,EAAE;wBACdT,SAASe,iBAAiBnB,QAAQmB,MAAMf,OAAO,GAAGgB,OAAOD;oBAC3D;gBACF;YACF;QACF;QACArB,KAAKd,gBAAgB,CAAC,WAAW,CAACqC;YAChC,IAAI,CAAClB,SAAS;YACd,MAAMmB,OAAOxF,QAAQuF,MAAME,IAAI;YAC/B,IAAID,SAAS,MAAM;YACnB,IAAI,CAACA,KAAKE,QAAQ,EAAE;gBAClBtD,KAAK;oBAAEyC,MAAM;oBAAWc,SAASzF;gBAAkB;gBACnDsE;gBACA;YACF;YACA,MAAMF,UAAUnE,QAAQqF,KAAKlB,OAAO;YACpC,IAAIA,YAAY,MAAM;YACtB,KAAKM,MAAMN;QACb;QACAN,KAAKd,gBAAgB,CAAC,SAASsB;QAC/BR,KAAK4B,KAAK;QACVrC,YAAY6B,GAAG,CAACZ,QAAQpC;QACxB,OAAOoC;IACT;IAEA,OAAO;QACLT;QACA8B,wBAAuBV,KAAK;YAC1B,IAAI,CAAC1B,YAAY,MAAM,IAAIS,MAAMnE;YACjCW,kBAAkBe,gBAAgB0D;YAClC,KAAK,MAAMtB,WAAWH,eAAgBG,QAAQpC,gBAAgBf;QAChE;QACA,MAAMoF;YACJrC,aAAa;YACb,KAAK,MAAM,CAACe,QAAQpC,KAAK,IAAI;mBAAImB;aAAY,CAAE;gBAC7CnB,KAAK;oBAAEyC,MAAM;gBAAQ;gBACrBL;YACF;YACAzB;YACA,MAAMjD;YACN,MAAM8C,QAAQmD,KAAK,CAACC,cAAc;QACpC;QACAC;YACE,OAAO5C,QAAQ4C,IAAI;QACrB;IACF;AACF"}
1
+ {"version":3,"sources":["/workspace/packages/mdruntime/src/host.ts"],"sourcesContent":["import type { WrittenBy } from './change.js';\nimport {\n composeRuntime,\n type HistoryQuery,\n type MdRuntime,\n type MdRuntimeOptions,\n type SavedRoomDraft,\n} from './connection.js';\nimport type { ChatDraft, ConversationOptions } from './conversation.js';\nimport type { DocumentQuery } from './query.js';\nimport type { SearchRequest } from './search.js';\nimport { removeRuntimeStore } from './store.js';\nimport {\n AUTHORIZATION_ENDED,\n carried,\n envelope,\n PROTOCOL_MISMATCH,\n request,\n type RuntimePort,\n type WireAnswer,\n type WireMember,\n type WireRequest,\n} from './wire.js';\n\nexport type MdRuntimeHostOptions = MdRuntimeOptions & { deploymentFacts?: unknown };\n\nexport type MdRuntimeHost = {\n replaceDeploymentFacts(value: unknown): void;\n attach(port: RuntimePort, app: string, release?: string): () => void;\n endAuthorization(): Promise<void>;\n stop(): Promise<void>;\n};\n\nfunction answered(\n md: MdRuntime,\n app: string,\n writtenBy: WrittenBy | undefined,\n member: WireMember,\n input: readonly unknown[],\n deploymentFacts: unknown,\n): unknown {\n switch (member) {\n case 'rooms':\n return md.rooms();\n case 'slots':\n return md.slots();\n case 'query':\n return md.query(input[0] as DocumentQuery);\n case 'search':\n return md.search(input[0] as SearchRequest);\n case 'types':\n return md.types(input[0] as string);\n case 'syncStatus':\n return md.syncStatus();\n case 'serviceMode':\n return md.serviceMode();\n case 'save':\n return md.save(input[0] as string, input[1] as readonly SavedRoomDraft[], writtenBy);\n case 'outcome':\n return md.outcome(input[0] as string);\n case 'history':\n return md.history(input[0] as string, input[1] as string, input[2] as HistoryQuery);\n case 'call':\n return md.call(input[0] as string, input[1]);\n case 'reached':\n return md.reached(input[0] as string, input[1] as string, input[2] as string | undefined);\n case 'log':\n return md.log();\n case 'storageLoss':\n return md.storageLoss();\n case 'deploymentFacts':\n return structuredClone(deploymentFacts);\n case 'persistence':\n return md.persistence();\n case 'reauthorize':\n return md.reauthorize();\n case 'roomDraft.list':\n return md.roomDraft.list();\n case 'roomDraft.read':\n return md.roomDraft.read(input[0] as string, input[1] as string);\n case 'roomDraft.write':\n return md.roomDraft.write(\n input[0] as string,\n input[1] as string,\n input[2] as string | null,\n input[3],\n );\n case 'roomDraft.discard':\n return md.roomDraft.discard(input[0] as string, input[1] as string, input[2] as string);\n case 'presentation.read':\n return md.presentation.read(app);\n case 'presentation.write':\n return md.presentation.write(app, input[0]);\n case 'conversation.list':\n return md.conversation.list();\n case 'conversation.read':\n return md.conversation.read(input[0] as string, input[1] as ConversationOptions | undefined);\n case 'conversation.create':\n return md.conversation.create(input[0]);\n case 'conversation.send':\n return md.conversation.send(input[0] as string);\n case 'conversation.answer':\n return md.conversation.answer(input[0] as string, input[1]);\n case 'conversation.interrupt':\n return md.conversation.interrupt(input[0] as string);\n case 'conversation.kill':\n return md.conversation.kill(input[0] as string);\n case 'conversation.cancel':\n return md.conversation.cancel(input[0] as string, input[1] as string);\n case 'conversation.delete':\n return md.conversation.delete(input[0] as string);\n case 'chatDraft.write':\n return md.chatDraft.write(input[0] as string, input[1] as ChatDraft);\n case 'chatDraft.discard':\n return md.chatDraft.discard(input[0] as string);\n }\n}\n\nexport function serveMdRuntime(options: MdRuntimeHostOptions): MdRuntimeHost {\n let deploymentFacts = structuredClone(options.deploymentFacts);\n const closing = new AbortController();\n const close = () => {\n closing.abort();\n };\n options.signal?.addEventListener('abort', close, { once: true });\n if (options.signal?.aborted === true) close();\n const runtime = composeRuntime({ ...options, signal: closing.signal });\n const { md, watch } = runtime;\n const attachments = new Map<() => void, (message: WireAnswer) => void>();\n let authorized = true;\n const factsObservers = new Set<(value: unknown) => void>();\n const watchFacts = (deliver: (value: unknown) => void) => {\n factsObservers.add(deliver);\n deliver(structuredClone(deploymentFacts));\n return () => {\n factsObservers.delete(deliver);\n };\n };\n\n function attach(port: RuntimePort, app: string, release?: string): () => void {\n if (!authorized) throw new Error(AUTHORIZATION_ENDED);\n const writtenBy = release === undefined ? undefined : { app, release };\n const subscriptions = new Map<number, () => void>();\n let serving = true;\n const send = (message: WireAnswer) => {\n port.postMessage(envelope(message));\n };\n const detach = () => {\n if (!serving) return;\n serving = false;\n for (const end of subscriptions.values()) end();\n subscriptions.clear();\n attachments.delete(detach);\n };\n const serve = async (message: WireRequest) => {\n if (message.kind === 'hello') return;\n if (message.kind === 'stop') {\n subscriptions.get(message.id)?.();\n subscriptions.delete(message.id);\n return;\n }\n try {\n if (message.kind !== 'observe' || message.topic !== 'room-drafts') await md.loaded();\n if (message.kind === 'observe') {\n const { id, topic } = message;\n let resolved = false;\n const deliver = (value: unknown) => {\n if (!serving) return;\n send(resolved ? { kind: 'event', id, value } : { kind: 'result', id, value });\n resolved = true;\n };\n subscriptions.set(\n id,\n topic === 'deployment-facts'\n ? watchFacts(deliver)\n : watch(topic, topic === 'presentation' ? [app] : message.input, deliver),\n );\n return;\n }\n const value = await answered(\n md,\n app,\n writtenBy,\n message.member,\n message.input,\n deploymentFacts,\n );\n if (serving) send({ kind: 'result', id: message.id, value });\n } catch (error) {\n if (serving) {\n send({\n kind: 'failure',\n id: message.id,\n message: error instanceof Error ? error.message : String(error),\n });\n }\n }\n };\n port.addEventListener('message', (event) => {\n if (!serving) return;\n const wire = carried(event.data);\n if (wire === null) return;\n if (!wire.matching) {\n send({ kind: 'refusal', refusal: PROTOCOL_MISMATCH });\n detach();\n return;\n }\n const message = request(wire.message);\n if (message === null) return;\n void serve(message);\n });\n port.addEventListener('close', detach);\n port.start();\n attachments.set(detach, send);\n return detach;\n }\n\n return {\n attach,\n replaceDeploymentFacts(value) {\n if (!authorized) throw new Error(AUTHORIZATION_ENDED);\n deploymentFacts = structuredClone(value);\n for (const deliver of factsObservers) deliver(structuredClone(deploymentFacts));\n },\n async endAuthorization() {\n authorized = false;\n for (const [detach, send] of [...attachments]) {\n send({ kind: 'ended' });\n detach();\n }\n close();\n await removeRuntimeStore();\n await options.shell.dropGeneration();\n },\n stop() {\n return runtime.stop();\n },\n };\n}\n\nexport type { RuntimePort } from './wire.js';\n"],"names":["composeRuntime","removeRuntimeStore","AUTHORIZATION_ENDED","carried","envelope","PROTOCOL_MISMATCH","request","answered","md","app","writtenBy","member","input","deploymentFacts","rooms","slots","query","search","types","syncStatus","serviceMode","save","outcome","history","call","reached","log","storageLoss","structuredClone","persistence","reauthorize","roomDraft","list","read","write","discard","presentation","conversation","create","send","answer","interrupt","kill","cancel","delete","chatDraft","serveMdRuntime","options","closing","AbortController","close","abort","signal","addEventListener","once","aborted","runtime","watch","attachments","Map","authorized","factsObservers","Set","watchFacts","deliver","add","attach","port","release","Error","undefined","subscriptions","serving","message","postMessage","detach","end","values","clear","serve","kind","get","id","topic","loaded","resolved","value","set","error","String","event","wire","data","matching","refusal","start","replaceDeploymentFacts","endAuthorization","shell","dropGeneration","stop"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,aAAa,EAGb,gBAAgB,EAEjB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAe,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5E,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B,gBAAgB,GAChB,WAAW,GACX,OAAO,GACP,cAAc,CAAC;AAEnB,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,cAAc,EACzB,UAAU,EAAE,MAAM,OAAO,EACzB,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,OAAO,CAAC,cAAc,CAAC,CAqEzB"}
1
+ {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,aAAa,EAGb,gBAAgB,EAEjB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAe,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5E,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B,gBAAgB,GAChB,WAAW,GACX,OAAO,GACP,cAAc,CAAC;AAEnB,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,cAAc,EACzB,UAAU,EAAE,MAAM,OAAO,EACzB,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,OAAO,CAAC,cAAc,CAAC,CA0EzB"}
package/dist/refresh.js CHANGED
@@ -23,6 +23,9 @@ export async function refreshRoom(adapter, authorization, confirmed, continuing,
23
23
  const changes = {
24
24
  ...confirmed.record.changes
25
25
  };
26
+ const written = {
27
+ ...confirmed.record.written
28
+ };
26
29
  const binaryTargets = new Set(confirmed.record.binaryTargets);
27
30
  const attachments = [];
28
31
  const stage = (page)=>{
@@ -32,11 +35,13 @@ export async function refreshRoom(adapter, authorization, confirmed, continuing,
32
35
  for (const path of Object.keys(page.documents)){
33
36
  binaryTargets.delete(path);
34
37
  delete changes[path];
38
+ written[path] = roomVersion;
35
39
  }
36
40
  for (const target of page.binaryTargets){
37
41
  delete documents[target];
38
42
  delete revisions[target];
39
43
  delete changes[target];
44
+ delete written[target];
40
45
  binaryTargets.add(target);
41
46
  }
42
47
  Object.assign(changes, page.changes);
@@ -44,6 +49,7 @@ export async function refreshRoom(adapter, authorization, confirmed, continuing,
44
49
  delete documents[path];
45
50
  delete revisions[path];
46
51
  delete changes[path];
52
+ delete written[path];
47
53
  binaryTargets.delete(path);
48
54
  }
49
55
  };
@@ -75,6 +81,7 @@ export async function refreshRoom(adapter, authorization, confirmed, continuing,
75
81
  ].sort(),
76
82
  revisions,
77
83
  changes,
84
+ written,
78
85
  attachments: attachments.length === 0 ? confirmed.record.attachments : declaredAttachments(attachments)
79
86
  }, confirmed);
80
87
  return staged.kind === 'staged' ? {
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime/src/refresh.ts"],"sourcesContent":["import type {\n Adapter,\n AdapterFailure,\n Authorization,\n HeadChange,\n RefreshPage,\n RetryableRefusal,\n RoomAttachment,\n} from './adapter.js';\nimport { declaredAttachments } from './attachment.js';\nimport { readStaged, type ConfirmedLayer } from './replica.js';\nimport { unconfirmed, type Refused, type Unconfirmed } from './transfer.js';\n\nexport type RefreshOutcome =\n | { kind: 'still-current' }\n | { kind: 'advanced'; confirmed: ConfirmedLayer }\n | { kind: 'beyond-horizon' }\n | RetryableRefusal\n | Unconfirmed\n | Refused\n | AdapterFailure;\n\nexport async function refreshRoom(\n adapter: Adapter,\n authorization: Authorization,\n confirmed: ConfirmedLayer,\n continuing: () => boolean,\n minPosition: string | undefined,\n): Promise<RefreshOutcome> {\n const locator = confirmed.record.locator;\n const fromRoomVersion = confirmed.record.roomVersion;\n const first = await adapter.refresh(authorization, {\n locator,\n selection: confirmed.record.replica.selection,\n fromRoomVersion,\n ...(minPosition === undefined ? {} : { minPosition }),\n });\n if (first.kind !== 'net-advancement') return first;\n const roomVersion = first.roomVersion;\n const documents: Record<string, string> = { ...confirmed.record.documents };\n const revisions: Record<string, string> = { ...confirmed.record.revisions };\n const changes: Record<string, HeadChange> = { ...confirmed.record.changes };\n const binaryTargets = new Set(confirmed.record.binaryTargets);\n const attachments: (readonly RoomAttachment[])[] = [];\n const stage = (page: RefreshPage) => {\n if (page.attachments !== undefined) attachments.push(page.attachments);\n Object.assign(documents, page.documents);\n Object.assign(revisions, page.revisions);\n for (const path of Object.keys(page.documents)) {\n binaryTargets.delete(path);\n delete changes[path];\n }\n for (const target of page.binaryTargets) {\n delete documents[target];\n delete revisions[target];\n delete changes[target];\n binaryTargets.add(target);\n }\n Object.assign(changes, page.changes);\n for (const path of page.removals) {\n delete documents[path];\n delete revisions[path];\n delete changes[path];\n binaryTargets.delete(path);\n }\n };\n stage(first);\n let pageToken = first.pageToken;\n while (pageToken !== undefined) {\n if (!continuing()) return unconfirmed;\n const page = await adapter.refresh(authorization, {\n locator,\n selection: confirmed.record.replica.selection,\n fromRoomVersion,\n ...(minPosition === undefined ? {} : { minPosition }),\n pageToken,\n });\n if (page.kind === 'still-current' || page.kind === 'beyond-horizon') return unconfirmed;\n if (page.kind !== 'net-advancement') return page;\n if (page.roomVersion !== roomVersion) return unconfirmed;\n stage(page);\n pageToken = page.pageToken;\n }\n const staged = readStaged(\n {\n ...confirmed.record,\n roomVersion,\n documents,\n binaryTargets: [...binaryTargets].sort(),\n revisions,\n changes,\n attachments:\n attachments.length === 0 ? confirmed.record.attachments : declaredAttachments(attachments),\n },\n confirmed,\n );\n return staged.kind === 'staged' ? { kind: 'advanced', confirmed: staged.confirmed } : staged;\n}\n"],"names":["declaredAttachments","readStaged","unconfirmed","refreshRoom","adapter","authorization","confirmed","continuing","minPosition","locator","record","fromRoomVersion","roomVersion","first","refresh","selection","replica","undefined","kind","documents","revisions","changes","binaryTargets","Set","attachments","stage","page","push","Object","assign","path","keys","delete","target","add","removals","pageToken","staged","sort","length"],"mappings":"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"}
1
+ {"version":3,"sources":["/workspace/packages/mdruntime/src/refresh.ts"],"sourcesContent":["import type {\n Adapter,\n AdapterFailure,\n Authorization,\n HeadChange,\n RefreshPage,\n RetryableRefusal,\n RoomAttachment,\n} from './adapter.js';\nimport { declaredAttachments } from './attachment.js';\nimport { readStaged, type ConfirmedLayer } from './replica.js';\nimport { unconfirmed, type Refused, type Unconfirmed } from './transfer.js';\n\nexport type RefreshOutcome =\n | { kind: 'still-current' }\n | { kind: 'advanced'; confirmed: ConfirmedLayer }\n | { kind: 'beyond-horizon' }\n | RetryableRefusal\n | Unconfirmed\n | Refused\n | AdapterFailure;\n\nexport async function refreshRoom(\n adapter: Adapter,\n authorization: Authorization,\n confirmed: ConfirmedLayer,\n continuing: () => boolean,\n minPosition: string | undefined,\n): Promise<RefreshOutcome> {\n const locator = confirmed.record.locator;\n const fromRoomVersion = confirmed.record.roomVersion;\n const first = await adapter.refresh(authorization, {\n locator,\n selection: confirmed.record.replica.selection,\n fromRoomVersion,\n ...(minPosition === undefined ? {} : { minPosition }),\n });\n if (first.kind !== 'net-advancement') return first;\n const roomVersion = first.roomVersion;\n const documents: Record<string, string> = { ...confirmed.record.documents };\n const revisions: Record<string, string> = { ...confirmed.record.revisions };\n const changes: Record<string, HeadChange> = { ...confirmed.record.changes };\n const written: Record<string, string> = { ...confirmed.record.written };\n const binaryTargets = new Set(confirmed.record.binaryTargets);\n const attachments: (readonly RoomAttachment[])[] = [];\n const stage = (page: RefreshPage) => {\n if (page.attachments !== undefined) attachments.push(page.attachments);\n Object.assign(documents, page.documents);\n Object.assign(revisions, page.revisions);\n for (const path of Object.keys(page.documents)) {\n binaryTargets.delete(path);\n delete changes[path];\n written[path] = roomVersion;\n }\n for (const target of page.binaryTargets) {\n delete documents[target];\n delete revisions[target];\n delete changes[target];\n delete written[target];\n binaryTargets.add(target);\n }\n Object.assign(changes, page.changes);\n for (const path of page.removals) {\n delete documents[path];\n delete revisions[path];\n delete changes[path];\n delete written[path];\n binaryTargets.delete(path);\n }\n };\n stage(first);\n let pageToken = first.pageToken;\n while (pageToken !== undefined) {\n if (!continuing()) return unconfirmed;\n const page = await adapter.refresh(authorization, {\n locator,\n selection: confirmed.record.replica.selection,\n fromRoomVersion,\n ...(minPosition === undefined ? {} : { minPosition }),\n pageToken,\n });\n if (page.kind === 'still-current' || page.kind === 'beyond-horizon') return unconfirmed;\n if (page.kind !== 'net-advancement') return page;\n if (page.roomVersion !== roomVersion) return unconfirmed;\n stage(page);\n pageToken = page.pageToken;\n }\n const staged = readStaged(\n {\n ...confirmed.record,\n roomVersion,\n documents,\n binaryTargets: [...binaryTargets].sort(),\n revisions,\n changes,\n written,\n attachments:\n attachments.length === 0 ? confirmed.record.attachments : declaredAttachments(attachments),\n },\n confirmed,\n );\n return staged.kind === 'staged' ? { kind: 'advanced', confirmed: staged.confirmed } : staged;\n}\n"],"names":["declaredAttachments","readStaged","unconfirmed","refreshRoom","adapter","authorization","confirmed","continuing","minPosition","locator","record","fromRoomVersion","roomVersion","first","refresh","selection","replica","undefined","kind","documents","revisions","changes","written","binaryTargets","Set","attachments","stage","page","push","Object","assign","path","keys","delete","target","add","removals","pageToken","staged","sort","length"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"replica.d.ts","sourceRoot":"","sources":["../src/replica.ts"],"names":[],"mappings":"AACA,OAAO,EAA0B,KAAK,WAAW,EAAqB,MAAM,aAAa,CAAC;AAC1F,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAA0C,KAAK,KAAK,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAE9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG;IACjC,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAE,GAAG,OAAO,CAAC;AAE7E,MAAM,MAAM,OAAO,GAAG;IACpB,SAAS,EAAE,cAAc,CAAC;IAC1B,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IAC9B,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;CAC/B,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,KAAK,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,WAAW,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,CAAC;AAEF,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAShE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM,CAWtF;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAMnF;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM,CAkBnF;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,cAAc,GACvB,MAAM,GAAG;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAM/B;AAED,wBAAgB,aAAa,CAC3B,SAAS,EAAE,cAAc,EACzB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC3C,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC3C,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,WAAW,EAAE,MAAM,GAClB,MAAM,CAyBR;AAwDD,wBAAgB,SAAS,CACvB,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,SAAS,EAAE,SAAS,EACpB,QAAQ,CAAC,EAAE,OAAO,GACjB,OAAO,CA4CT;AAkFD,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,GAAG,OAAO,CAa7E;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,YAAY,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,EAC7C,SAAS,EAAE,SAAS,GACnB,SAAS,WAAW,EAAE,CAoBxB"}
1
+ {"version":3,"file":"replica.d.ts","sourceRoot":"","sources":["../src/replica.ts"],"names":[],"mappings":"AACA,OAAO,EAA0B,KAAK,WAAW,EAAqB,MAAM,aAAa,CAAC;AAC1F,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAA0C,KAAK,KAAK,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAE9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG;IACjC,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAE,GAAG,OAAO,CAAC;AAE7E,MAAM,MAAM,OAAO,GAAG;IACpB,SAAS,EAAE,cAAc,CAAC;IAC1B,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IAC9B,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;CAC/B,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,KAAK,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,WAAW,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,CAAC;AAEF,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAShE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM,CAWtF;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAMnF;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM,CAkBnF;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,cAAc,GACvB,MAAM,GAAG;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAM/B;AAED,wBAAgB,aAAa,CAC3B,SAAS,EAAE,cAAc,EACzB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC3C,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC3C,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,WAAW,EAAE,MAAM,GAClB,MAAM,CA+BR;AAwDD,wBAAgB,SAAS,CACvB,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,SAAS,EAAE,SAAS,EACpB,QAAQ,CAAC,EAAE,OAAO,GACjB,OAAO,CA4CT;AAkFD,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,GAAG,OAAO,CAa7E;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,YAAY,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,EAC7C,SAAS,EAAE,SAAS,GACnB,SAAS,WAAW,EAAE,CAoBxB"}
package/dist/replica.js CHANGED
@@ -64,6 +64,13 @@ export function applyReturned(confirmed, documents, revisions, removals, roomVer
64
64
  const nextChanges = {
65
65
  ...confirmed.record.changes
66
66
  };
67
+ const nextWritten = {
68
+ ...confirmed.record.written,
69
+ ...Object.fromEntries(Object.keys(documents).map((path)=>[
70
+ path,
71
+ roomVersion
72
+ ]))
73
+ };
67
74
  const binaryTargets = new Set(confirmed.record.binaryTargets);
68
75
  for (const [path, revision] of Object.entries(revisions)){
69
76
  if (confirmed.record.revisions[path] !== revision) delete nextChanges[path];
@@ -72,6 +79,7 @@ export function applyReturned(confirmed, documents, revisions, removals, roomVer
72
79
  delete nextDocuments[path];
73
80
  delete nextRevisions[path];
74
81
  delete nextChanges[path];
82
+ delete nextWritten[path];
75
83
  binaryTargets.delete(path);
76
84
  }
77
85
  return readStaged({
@@ -80,6 +88,7 @@ export function applyReturned(confirmed, documents, revisions, removals, roomVer
80
88
  documents: nextDocuments,
81
89
  revisions: nextRevisions,
82
90
  changes: nextChanges,
91
+ written: nextWritten,
83
92
  binaryTargets: [
84
93
  ...binaryTargets
85
94
  ].sort()
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime/src/replica.ts"],"sourcesContent":["import { parse, type Document } from '@agentshouse/mdmodel';\nimport { immutable, type Change, type ChangeBatch, type Precondition } from './change.js';\nimport {\n parseCollection,\n readCollection,\n validateCollection,\n type Collection,\n type Composition,\n} from './collection.js';\nimport { overlay, overlayChanged, sameLayerText, type Layer } from './overlay.js';\nimport { providerRewritten, type Rewriting } from './save.js';\nimport { equalValue } from './room-draft.js';\nimport type { ReplicaRecord } from './store.js';\nimport type { Refused } from './transfer.js';\n\nexport type ConfirmedLayer = {\n record: ReplicaRecord;\n collection: Collection;\n};\n\nexport type VisibleLayer = Layer & {\n collection: Collection;\n};\n\nexport type Staged = { kind: 'staged'; confirmed: ConfirmedLayer } | Refused;\n\nexport type Replica = {\n confirmed: ConfirmedLayer;\n queue: readonly ChangeBatch[];\n visible: VisibleLayer;\n replay: readonly ReplayStep[];\n};\n\ntype ReplayStep = {\n id: string;\n before: Layer;\n after: Layer;\n effective: ChangeBatch;\n collection?: Collection;\n};\n\nexport function compositionOf(record: ReplicaRecord): Composition {\n return {\n model: record.model,\n selection:\n record.typedSelection === null\n ? null\n : { roots: record.typedSelection.roots, model: record.selectionModel },\n untypedFolders: record.untypedFolders,\n };\n}\n\nexport function readConfirmed(record: ReplicaRecord, previous?: ConfirmedLayer): Staged {\n const read = readCollection(\n record.documents,\n compositionOf(record),\n previous === undefined\n ? undefined\n : { text: previous.record.documents, collection: previous.collection },\n );\n return read.kind === 'read'\n ? { kind: 'staged', confirmed: { record, collection: read.collection } }\n : read;\n}\n\nexport function sameMembership(record: ReplicaRecord, other: ReplicaRecord): boolean {\n return (\n JSON.stringify(record.untypedFolders) === JSON.stringify(other.untypedFolders) &&\n JSON.stringify(record.typedSelection?.roots ?? null) ===\n JSON.stringify(other.typedSelection?.roots ?? null)\n );\n}\n\nexport function readStaged(record: ReplicaRecord, previous?: ConfirmedLayer): Staged {\n if (\n (record.model.status === 'current' || record.selectionModel.status === 'current') &&\n (previous === undefined ||\n !sameLayerText(record, previous.record) ||\n record.model !== previous.record.model ||\n record.selectionModel !== previous.record.selectionModel)\n ) {\n const verdict = validateCollection(\n record.documents,\n record.binaryTargets,\n compositionOf(record),\n );\n if (verdict.verdict === 'refuse' && verdict.rule !== 'model-unavailable') {\n return { kind: 'refused', refusal: verdict };\n }\n }\n return readConfirmed(record, previous);\n}\n\nexport function readReclassified(\n record: ReplicaRecord,\n previous: ConfirmedLayer,\n): Staged | { kind: 'deferred' } {\n const verdict = validateCollection(record.documents, record.binaryTargets, compositionOf(record));\n if (verdict.verdict !== 'refuse') return readConfirmed(record, previous);\n return verdict.rule === 'model-unavailable'\n ? { kind: 'deferred' }\n : { kind: 'refused', refusal: verdict };\n}\n\nexport function applyReturned(\n confirmed: ConfirmedLayer,\n documents: Readonly<Record<string, string>>,\n revisions: Readonly<Record<string, string>>,\n removals: readonly string[],\n roomVersion: string,\n): Staged {\n const nextDocuments = { ...confirmed.record.documents, ...documents };\n const nextRevisions = { ...confirmed.record.revisions, ...revisions };\n const nextChanges = { ...confirmed.record.changes };\n const binaryTargets = new Set(confirmed.record.binaryTargets);\n for (const [path, revision] of Object.entries(revisions)) {\n if (confirmed.record.revisions[path] !== revision) delete nextChanges[path];\n }\n for (const path of removals) {\n delete nextDocuments[path];\n delete nextRevisions[path];\n delete nextChanges[path];\n binaryTargets.delete(path);\n }\n return readStaged(\n {\n ...confirmed.record,\n roomVersion,\n documents: nextDocuments,\n revisions: nextRevisions,\n changes: nextChanges,\n binaryTargets: [...binaryTargets].sort(),\n },\n confirmed,\n );\n}\n\nfunction predicted(\n confirmed: ConfirmedLayer,\n batches: readonly ChangeBatch[],\n previous?: Replica,\n): { layer: Layer; replay: readonly ReplayStep[] } {\n const composition = compositionOf(confirmed.record);\n let layer: Layer = confirmed.record;\n const replay: ReplayStep[] = [];\n const prior = new Map(previous?.replay.map((step) => [step.id, step]) ?? []);\n for (const batch of batches) {\n const before = layer;\n const old = prior.get(batch.id);\n const hasMove = batch.changes.some((change) => change.kind === 'move');\n const reuseRewrite =\n old?.collection !== undefined &&\n sameLayerText(before, old.before) &&\n JSON.stringify(old.collection.composition.untypedFolders) ===\n JSON.stringify(composition.untypedFolders) &&\n old.collection.composition.model === composition.model &&\n old.collection.composition.selection?.model === composition.selection?.model &&\n JSON.stringify(old.collection.composition.selection?.roots) ===\n JSON.stringify(composition.selection?.roots);\n const collection = hasMove\n ? reuseRewrite\n ? old.collection\n : parseCollection(\n before.documents,\n composition,\n old?.collection === undefined\n ? { text: confirmed.record.documents, collection: confirmed.collection }\n : { text: old.before.documents, collection: old.collection },\n )\n : undefined;\n const effective =\n collection === undefined\n ? batch\n : reuseRewrite\n ? old.effective\n : providerRewritten(batch, { ...before, collection });\n layer =\n old === undefined\n ? overlay(before, [effective])\n : overlayChanged(before, [effective], old.before, [old.effective], old.after);\n replay.push({\n id: batch.id,\n before,\n after: layer,\n effective,\n ...(collection === undefined ? {} : { collection }),\n });\n }\n return { layer, replay };\n}\n\nexport function replicaOf(\n confirmed: ConfirmedLayer,\n queue: readonly ChangeBatch[],\n rewriting: Rewriting,\n previous?: Replica,\n): Replica {\n const batches = Object.freeze(queue.map(immutable));\n if (batches.length === 0) {\n return {\n confirmed,\n queue: batches,\n visible: {\n documents: confirmed.record.documents,\n binaryTargets: confirmed.record.binaryTargets,\n revisions: confirmed.record.revisions,\n changes: confirmed.record.changes,\n collection: confirmed.collection,\n },\n replay: [],\n };\n }\n const predictedState = rewriting === 'provider' ? predicted(confirmed, batches, previous) : null;\n const layer =\n rewriting === 'provider'\n ? predictedState!.layer\n : previous === undefined\n ? overlay(confirmed.record, batches)\n : overlayChanged(\n confirmed.record,\n batches,\n previous.confirmed.record,\n previous.queue,\n previous.visible,\n );\n return {\n confirmed,\n queue: batches,\n replay: predictedState?.replay ?? [],\n visible: {\n ...layer,\n collection: parseCollection(\n layer.documents,\n compositionOf(confirmed.record),\n previous === undefined\n ? undefined\n : { text: previous.visible.documents, collection: previous.visible.collection },\n ),\n },\n };\n}\n\nfunction present(layer: Layer, path: string): boolean {\n return layer.documents[path] !== undefined || layer.binaryTargets.includes(path);\n}\n\nfunction holds(layer: Layer, preconditions: readonly Precondition[]): boolean {\n const parsed = new Map<string, Document | null>();\n const documentAt = (path: string) => {\n if (!parsed.has(path)) {\n const text = layer.documents[path];\n const opened = text === undefined ? null : parse(text, path);\n parsed.set(path, opened?.ok === true ? opened.document : null);\n }\n return parsed.get(path) ?? null;\n };\n return preconditions.every((precondition) => {\n const path = precondition.path;\n if (precondition.kind === 'absent') return !present(layer, path);\n if (precondition.kind === 'present') return present(layer, path);\n if (precondition.kind === 'revision') {\n return present(layer, path) && layer.revisions[path] === precondition.revision;\n }\n const document = documentAt(path);\n if (document === null) return false;\n if (precondition.kind === 'field') {\n const value = Object.hasOwn(document.fields, precondition.name)\n ? document.fields[precondition.name]\n : undefined;\n return equalValue(value, precondition.value);\n }\n if (precondition.kind === 'section') {\n return (\n Object.hasOwn(document.sections, precondition.name) &&\n document.sections[precondition.name] === precondition.value\n );\n }\n return document.preamble === precondition.value;\n });\n}\n\nfunction effects(change: Change): readonly Precondition[] {\n const path = change.path;\n if (change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble') {\n return [change];\n }\n if (change.kind === 'create' && !('content' in change)) {\n return [\n { kind: 'present', path },\n ...Object.entries(change.fields).map(([name, value]): Precondition => ({\n kind: 'field',\n path,\n name,\n value,\n })),\n ...Object.entries(change.sections).map(([name, value]): Precondition => ({\n kind: 'section',\n path,\n name,\n value,\n })),\n ];\n }\n if (change.kind === 'move') {\n return [\n { kind: 'absent', path },\n { kind: 'present', path: change.to },\n ];\n }\n return [{ kind: 'absent', path }];\n}\n\nfunction after(changes: readonly Change[], index: number, path: string): string | null {\n let at = path;\n for (const change of changes.slice(index + 1)) {\n if (change.path !== at) continue;\n if (change.kind === 'remove') return null;\n if (change.kind === 'move') at = change.to;\n }\n return at;\n}\n\nexport function landed(batch: ChangeBatch, confirmed: ConfirmedLayer): boolean {\n const layer = confirmed.record;\n return batch.changes.every((change, index) => {\n if (change.kind === 'replace' || (change.kind === 'create' && 'content' in change)) {\n const at = after(batch.changes, index, change.path);\n return at === null || layer.documents[at] === change.content;\n }\n return effects(change).every((effect) => {\n if (effect.kind === 'absent') return holds(layer, [effect]);\n const at = after(batch.changes, index, effect.path);\n return at === null || holds(layer, [{ ...effect, path: at }]);\n });\n });\n}\n\nexport function withdrawals(\n confirmed: ConfirmedLayer,\n queue: readonly ChangeBatch[],\n withdrawable: (batch: ChangeBatch) => boolean,\n rewriting: Rewriting,\n): readonly ChangeBatch[] {\n if (!queue.some(withdrawable)) return [];\n const composition = compositionOf(confirmed.record);\n let layer: Layer = confirmed.record;\n const withdrawn: ChangeBatch[] = [];\n for (const batch of queue) {\n if (withdrawable(batch) && !holds(layer, batch.preconditions)) {\n withdrawn.push(batch);\n continue;\n }\n const effective =\n rewriting === 'provider' && batch.changes.some((change) => change.kind === 'move')\n ? providerRewritten(batch, {\n ...layer,\n collection: parseCollection(layer.documents, composition),\n })\n : batch;\n layer = overlay(layer, [effective]);\n }\n return withdrawn;\n}\n"],"names":["parse","immutable","parseCollection","readCollection","validateCollection","overlay","overlayChanged","sameLayerText","providerRewritten","equalValue","compositionOf","record","model","selection","typedSelection","roots","selectionModel","untypedFolders","readConfirmed","previous","read","documents","undefined","text","collection","kind","confirmed","sameMembership","other","JSON","stringify","readStaged","status","verdict","binaryTargets","rule","refusal","readReclassified","applyReturned","revisions","removals","roomVersion","nextDocuments","nextRevisions","nextChanges","changes","Set","path","revision","Object","entries","delete","sort","predicted","batches","composition","layer","replay","prior","Map","map","step","id","batch","before","old","get","hasMove","some","change","reuseRewrite","effective","after","push","replicaOf","queue","rewriting","freeze","length","visible","predictedState","present","includes","holds","preconditions","parsed","documentAt","has","opened","set","ok","document","every","precondition","value","hasOwn","fields","name","sections","preamble","effects","to","index","at","slice","landed","content","effect","withdrawals","withdrawable","withdrawn"],"mappings":"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"}
1
+ {"version":3,"sources":["/workspace/packages/mdruntime/src/replica.ts"],"sourcesContent":["import { parse, type Document } from '@agentshouse/mdmodel';\nimport { immutable, type Change, type ChangeBatch, type Precondition } from './change.js';\nimport {\n parseCollection,\n readCollection,\n validateCollection,\n type Collection,\n type Composition,\n} from './collection.js';\nimport { overlay, overlayChanged, sameLayerText, type Layer } from './overlay.js';\nimport { providerRewritten, type Rewriting } from './save.js';\nimport { equalValue } from './room-draft.js';\nimport type { ReplicaRecord } from './store.js';\nimport type { Refused } from './transfer.js';\n\nexport type ConfirmedLayer = {\n record: ReplicaRecord;\n collection: Collection;\n};\n\nexport type VisibleLayer = Layer & {\n collection: Collection;\n};\n\nexport type Staged = { kind: 'staged'; confirmed: ConfirmedLayer } | Refused;\n\nexport type Replica = {\n confirmed: ConfirmedLayer;\n queue: readonly ChangeBatch[];\n visible: VisibleLayer;\n replay: readonly ReplayStep[];\n};\n\ntype ReplayStep = {\n id: string;\n before: Layer;\n after: Layer;\n effective: ChangeBatch;\n collection?: Collection;\n};\n\nexport function compositionOf(record: ReplicaRecord): Composition {\n return {\n model: record.model,\n selection:\n record.typedSelection === null\n ? null\n : { roots: record.typedSelection.roots, model: record.selectionModel },\n untypedFolders: record.untypedFolders,\n };\n}\n\nexport function readConfirmed(record: ReplicaRecord, previous?: ConfirmedLayer): Staged {\n const read = readCollection(\n record.documents,\n compositionOf(record),\n previous === undefined\n ? undefined\n : { text: previous.record.documents, collection: previous.collection },\n );\n return read.kind === 'read'\n ? { kind: 'staged', confirmed: { record, collection: read.collection } }\n : read;\n}\n\nexport function sameMembership(record: ReplicaRecord, other: ReplicaRecord): boolean {\n return (\n JSON.stringify(record.untypedFolders) === JSON.stringify(other.untypedFolders) &&\n JSON.stringify(record.typedSelection?.roots ?? null) ===\n JSON.stringify(other.typedSelection?.roots ?? null)\n );\n}\n\nexport function readStaged(record: ReplicaRecord, previous?: ConfirmedLayer): Staged {\n if (\n (record.model.status === 'current' || record.selectionModel.status === 'current') &&\n (previous === undefined ||\n !sameLayerText(record, previous.record) ||\n record.model !== previous.record.model ||\n record.selectionModel !== previous.record.selectionModel)\n ) {\n const verdict = validateCollection(\n record.documents,\n record.binaryTargets,\n compositionOf(record),\n );\n if (verdict.verdict === 'refuse' && verdict.rule !== 'model-unavailable') {\n return { kind: 'refused', refusal: verdict };\n }\n }\n return readConfirmed(record, previous);\n}\n\nexport function readReclassified(\n record: ReplicaRecord,\n previous: ConfirmedLayer,\n): Staged | { kind: 'deferred' } {\n const verdict = validateCollection(record.documents, record.binaryTargets, compositionOf(record));\n if (verdict.verdict !== 'refuse') return readConfirmed(record, previous);\n return verdict.rule === 'model-unavailable'\n ? { kind: 'deferred' }\n : { kind: 'refused', refusal: verdict };\n}\n\nexport function applyReturned(\n confirmed: ConfirmedLayer,\n documents: Readonly<Record<string, string>>,\n revisions: Readonly<Record<string, string>>,\n removals: readonly string[],\n roomVersion: string,\n): Staged {\n const nextDocuments = { ...confirmed.record.documents, ...documents };\n const nextRevisions = { ...confirmed.record.revisions, ...revisions };\n const nextChanges = { ...confirmed.record.changes };\n const nextWritten = {\n ...confirmed.record.written,\n ...Object.fromEntries(Object.keys(documents).map((path) => [path, roomVersion])),\n };\n const binaryTargets = new Set(confirmed.record.binaryTargets);\n for (const [path, revision] of Object.entries(revisions)) {\n if (confirmed.record.revisions[path] !== revision) delete nextChanges[path];\n }\n for (const path of removals) {\n delete nextDocuments[path];\n delete nextRevisions[path];\n delete nextChanges[path];\n delete nextWritten[path];\n binaryTargets.delete(path);\n }\n return readStaged(\n {\n ...confirmed.record,\n roomVersion,\n documents: nextDocuments,\n revisions: nextRevisions,\n changes: nextChanges,\n written: nextWritten,\n binaryTargets: [...binaryTargets].sort(),\n },\n confirmed,\n );\n}\n\nfunction predicted(\n confirmed: ConfirmedLayer,\n batches: readonly ChangeBatch[],\n previous?: Replica,\n): { layer: Layer; replay: readonly ReplayStep[] } {\n const composition = compositionOf(confirmed.record);\n let layer: Layer = confirmed.record;\n const replay: ReplayStep[] = [];\n const prior = new Map(previous?.replay.map((step) => [step.id, step]) ?? []);\n for (const batch of batches) {\n const before = layer;\n const old = prior.get(batch.id);\n const hasMove = batch.changes.some((change) => change.kind === 'move');\n const reuseRewrite =\n old?.collection !== undefined &&\n sameLayerText(before, old.before) &&\n JSON.stringify(old.collection.composition.untypedFolders) ===\n JSON.stringify(composition.untypedFolders) &&\n old.collection.composition.model === composition.model &&\n old.collection.composition.selection?.model === composition.selection?.model &&\n JSON.stringify(old.collection.composition.selection?.roots) ===\n JSON.stringify(composition.selection?.roots);\n const collection = hasMove\n ? reuseRewrite\n ? old.collection\n : parseCollection(\n before.documents,\n composition,\n old?.collection === undefined\n ? { text: confirmed.record.documents, collection: confirmed.collection }\n : { text: old.before.documents, collection: old.collection },\n )\n : undefined;\n const effective =\n collection === undefined\n ? batch\n : reuseRewrite\n ? old.effective\n : providerRewritten(batch, { ...before, collection });\n layer =\n old === undefined\n ? overlay(before, [effective])\n : overlayChanged(before, [effective], old.before, [old.effective], old.after);\n replay.push({\n id: batch.id,\n before,\n after: layer,\n effective,\n ...(collection === undefined ? {} : { collection }),\n });\n }\n return { layer, replay };\n}\n\nexport function replicaOf(\n confirmed: ConfirmedLayer,\n queue: readonly ChangeBatch[],\n rewriting: Rewriting,\n previous?: Replica,\n): Replica {\n const batches = Object.freeze(queue.map(immutable));\n if (batches.length === 0) {\n return {\n confirmed,\n queue: batches,\n visible: {\n documents: confirmed.record.documents,\n binaryTargets: confirmed.record.binaryTargets,\n revisions: confirmed.record.revisions,\n changes: confirmed.record.changes,\n collection: confirmed.collection,\n },\n replay: [],\n };\n }\n const predictedState = rewriting === 'provider' ? predicted(confirmed, batches, previous) : null;\n const layer =\n rewriting === 'provider'\n ? predictedState!.layer\n : previous === undefined\n ? overlay(confirmed.record, batches)\n : overlayChanged(\n confirmed.record,\n batches,\n previous.confirmed.record,\n previous.queue,\n previous.visible,\n );\n return {\n confirmed,\n queue: batches,\n replay: predictedState?.replay ?? [],\n visible: {\n ...layer,\n collection: parseCollection(\n layer.documents,\n compositionOf(confirmed.record),\n previous === undefined\n ? undefined\n : { text: previous.visible.documents, collection: previous.visible.collection },\n ),\n },\n };\n}\n\nfunction present(layer: Layer, path: string): boolean {\n return layer.documents[path] !== undefined || layer.binaryTargets.includes(path);\n}\n\nfunction holds(layer: Layer, preconditions: readonly Precondition[]): boolean {\n const parsed = new Map<string, Document | null>();\n const documentAt = (path: string) => {\n if (!parsed.has(path)) {\n const text = layer.documents[path];\n const opened = text === undefined ? null : parse(text, path);\n parsed.set(path, opened?.ok === true ? opened.document : null);\n }\n return parsed.get(path) ?? null;\n };\n return preconditions.every((precondition) => {\n const path = precondition.path;\n if (precondition.kind === 'absent') return !present(layer, path);\n if (precondition.kind === 'present') return present(layer, path);\n if (precondition.kind === 'revision') {\n return present(layer, path) && layer.revisions[path] === precondition.revision;\n }\n const document = documentAt(path);\n if (document === null) return false;\n if (precondition.kind === 'field') {\n const value = Object.hasOwn(document.fields, precondition.name)\n ? document.fields[precondition.name]\n : undefined;\n return equalValue(value, precondition.value);\n }\n if (precondition.kind === 'section') {\n return (\n Object.hasOwn(document.sections, precondition.name) &&\n document.sections[precondition.name] === precondition.value\n );\n }\n return document.preamble === precondition.value;\n });\n}\n\nfunction effects(change: Change): readonly Precondition[] {\n const path = change.path;\n if (change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble') {\n return [change];\n }\n if (change.kind === 'create' && !('content' in change)) {\n return [\n { kind: 'present', path },\n ...Object.entries(change.fields).map(([name, value]): Precondition => ({\n kind: 'field',\n path,\n name,\n value,\n })),\n ...Object.entries(change.sections).map(([name, value]): Precondition => ({\n kind: 'section',\n path,\n name,\n value,\n })),\n ];\n }\n if (change.kind === 'move') {\n return [\n { kind: 'absent', path },\n { kind: 'present', path: change.to },\n ];\n }\n return [{ kind: 'absent', path }];\n}\n\nfunction after(changes: readonly Change[], index: number, path: string): string | null {\n let at = path;\n for (const change of changes.slice(index + 1)) {\n if (change.path !== at) continue;\n if (change.kind === 'remove') return null;\n if (change.kind === 'move') at = change.to;\n }\n return at;\n}\n\nexport function landed(batch: ChangeBatch, confirmed: ConfirmedLayer): boolean {\n const layer = confirmed.record;\n return batch.changes.every((change, index) => {\n if (change.kind === 'replace' || (change.kind === 'create' && 'content' in change)) {\n const at = after(batch.changes, index, change.path);\n return at === null || layer.documents[at] === change.content;\n }\n return effects(change).every((effect) => {\n if (effect.kind === 'absent') return holds(layer, [effect]);\n const at = after(batch.changes, index, effect.path);\n return at === null || holds(layer, [{ ...effect, path: at }]);\n });\n });\n}\n\nexport function withdrawals(\n confirmed: ConfirmedLayer,\n queue: readonly ChangeBatch[],\n withdrawable: (batch: ChangeBatch) => boolean,\n rewriting: Rewriting,\n): readonly ChangeBatch[] {\n if (!queue.some(withdrawable)) return [];\n const composition = compositionOf(confirmed.record);\n let layer: Layer = confirmed.record;\n const withdrawn: ChangeBatch[] = [];\n for (const batch of queue) {\n if (withdrawable(batch) && !holds(layer, batch.preconditions)) {\n withdrawn.push(batch);\n continue;\n }\n const effective =\n rewriting === 'provider' && batch.changes.some((change) => change.kind === 'move')\n ? providerRewritten(batch, {\n ...layer,\n collection: parseCollection(layer.documents, composition),\n })\n : batch;\n layer = overlay(layer, [effective]);\n }\n return withdrawn;\n}\n"],"names":["parse","immutable","parseCollection","readCollection","validateCollection","overlay","overlayChanged","sameLayerText","providerRewritten","equalValue","compositionOf","record","model","selection","typedSelection","roots","selectionModel","untypedFolders","readConfirmed","previous","read","documents","undefined","text","collection","kind","confirmed","sameMembership","other","JSON","stringify","readStaged","status","verdict","binaryTargets","rule","refusal","readReclassified","applyReturned","revisions","removals","roomVersion","nextDocuments","nextRevisions","nextChanges","changes","nextWritten","written","Object","fromEntries","keys","map","path","Set","revision","entries","delete","sort","predicted","batches","composition","layer","replay","prior","Map","step","id","batch","before","old","get","hasMove","some","change","reuseRewrite","effective","after","push","replicaOf","queue","rewriting","freeze","length","visible","predictedState","present","includes","holds","preconditions","parsed","documentAt","has","opened","set","ok","document","every","precondition","value","hasOwn","fields","name","sections","preamble","effects","to","index","at","slice","landed","content","effect","withdrawals","withdrawable","withdrawn"],"mappings":"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"}
package/dist/store.d.ts CHANGED
@@ -21,6 +21,7 @@ export type ReplicaRecord = {
21
21
  binaryTargets: readonly string[];
22
22
  revisions: Readonly<Record<string, string>>;
23
23
  changes: Readonly<Record<string, HeadChange>>;
24
+ written: Readonly<Record<string, string>>;
24
25
  attachments: readonly RoomAttachment[];
25
26
  };
26
27
  export type PendingState = {
@@ -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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"}
package/dist/store.js CHANGED
@@ -13,7 +13,7 @@ const CONVERSATIONS = 'conversations';
13
13
  const MESSAGES = 'messages';
14
14
  const CHAT_DRAFTS = 'chatDrafts';
15
15
  const CURRENT = 'current';
16
- const SCHEMA = 18;
16
+ const SCHEMA = 19;
17
17
  function settled(request) {
18
18
  return new Promise((resolve, reject)=>{
19
19
  request.onsuccess = ()=>resolve(request.result);
@@ -64,7 +64,7 @@ function amendPending(database, locator, id, amendment) {
64
64
  return completed(transaction);
65
65
  }
66
66
  function roomRecord(record, queue) {
67
- const { documents, binaryTargets, revisions, changes, attachments, ...room } = record;
67
+ const { documents, binaryTargets, revisions, changes, written, attachments, ...room } = record;
68
68
  return {
69
69
  ...room,
70
70
  order: queue.map((batch)=>batch.id)
@@ -169,6 +169,7 @@ export async function openRuntimeStore() {
169
169
  documents: {},
170
170
  revisions: {},
171
171
  changes: {},
172
+ written: {},
172
173
  binaryTargets: [],
173
174
  attachments: []
174
175
  });
@@ -185,6 +186,9 @@ export async function openRuntimeStore() {
185
186
  const room = byRoom.get(document.locator);
186
187
  if (room === undefined) continue;
187
188
  room.documents[document.path] = document.content;
189
+ if (document.written !== null) {
190
+ room.written[document.path] = document.written;
191
+ }
188
192
  head(room, document);
189
193
  }
190
194
  for (const target of targets){
@@ -221,13 +225,14 @@ export async function openRuntimeStore() {
221
225
  ]);
222
226
  }
223
227
  for (const [path, content] of Object.entries(next.documents)){
224
- if (previous?.documents[path] === content && previous.revisions[path] === next.revisions[path] && sameChange(previous.changes[path], next.changes[path])) continue;
228
+ if (previous?.documents[path] === content && previous.revisions[path] === next.revisions[path] && previous.written[path] === next.written[path] && sameChange(previous.changes[path], next.changes[path])) continue;
225
229
  documents.put({
226
230
  locator: next.locator,
227
231
  path,
228
232
  content,
229
233
  revision: next.revisions[path] ?? null,
230
- change: next.changes[path] ?? null
234
+ change: next.changes[path] ?? null,
235
+ written: next.written[path] ?? null
231
236
  });
232
237
  }
233
238
  const targets = transaction.objectStore(BINARY_TARGETS);