@agentshouse/mdruntime 0.1.0-alpha.42 → 0.1.0-alpha.43
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 +12 -5
- package/dist/adapter.d.ts +15 -0
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js.map +1 -1
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +6 -1
- package/dist/bootstrap.js.map +1 -1
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +3 -2
- package/dist/change-set.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/memory.d.ts +2 -1
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +17 -5
- package/dist/memory.js.map +1 -1
- package/dist/overlay.d.ts +7 -2
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +48 -15
- package/dist/overlay.js.map +1 -1
- package/dist/query.d.ts +4 -0
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +4 -1
- package/dist/query.js.map +1 -1
- package/dist/read-side.d.ts.map +1 -1
- package/dist/read-side.js +6 -0
- package/dist/read-side.js.map +1 -1
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +12 -2
- package/dist/refresh.js.map +1 -1
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +9 -0
- package/dist/replica.js.map +1 -1
- package/dist/rows.d.ts +3 -1
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +5 -3
- package/dist/rows.js.map +1 -1
- package/dist/store.d.ts +2 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +20 -12
- package/dist/store.js.map +1 -1
- package/package.json +1 -1
package/dist/read-side.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/workspace/packages/mdruntime/src/read-side.ts"],"sourcesContent":["import {\n and,\n BasicIndex,\n configureIndexDevMode,\n count,\n createCollection,\n createLiveQueryCollection,\n deepEquals,\n eq,\n gt,\n gte,\n inArray,\n isNull,\n isUndefined,\n lt,\n lte,\n not,\n or,\n toArray,\n type Collection,\n type Context,\n type InitialQueryBuilder,\n type QueryBuilder,\n type Ref,\n type SyncConfig,\n} from '@tanstack/db';\nimport type { ChangeSet } from './change-set.js';\nimport { rowsOf, type KeyedResult, type QueryChange, type RowKey } from './observation.js';\nimport type {\n Condition,\n Direction,\n DocumentShape,\n GroupShape,\n KeyPlan,\n OrderOptions,\n Plan,\n QueryDocument,\n QueryGroup,\n QueryResult,\n Scope,\n Test,\n Value,\n} from './query.js';\nimport { documentKey, type Row } from './rows.js';\nimport type { SearchedDocument } from './search.js';\n\ntype Stored = {\n key: string;\n kind: string;\n room: string;\n path: string;\n type: string | null;\n body: string;\n source: string;\n target: string;\n field: string;\n fields: Readonly<Record<string, unknown>>;\n values: Readonly<Record<string, unknown>>;\n sizes: Readonly<Record<string, number>>;\n directories: readonly string[];\n preamble: string;\n sections: Readonly<Record<string, string>>;\n markdown: string;\n} & Readonly<Record<string, unknown>>;\n\ntype Reference = Ref<Stored>;\n\ntype Field = Reference['values'][string];\n\ntype Size = Reference['sizes'][string];\n\ntype Refs = Readonly<Record<string, Reference>>;\n\ntype Expression = ReturnType<typeof eq>;\n\ntype Builder = {\n where(callback: (refs: Refs) => Expression): Builder;\n innerJoin(source: Readonly<Record<string, unknown>>, on: (refs: Refs) => Expression): Builder;\n groupBy(callback: (refs: Refs) => unknown): Builder;\n orderBy(callback: (refs: Refs) => unknown, options: Direction | OrderOptions): Builder;\n limit(count: number): Builder;\n select(callback: (refs: Refs) => object): object;\n};\n\ntype Live = Collection<Stored, string | number>;\n\ntype Built = { live: Live; dispose(): void };\n\ntype Shared = {\n plan: Plan;\n built: Built;\n result: KeyedResult | undefined;\n listeners: Set<(message: KeyedResult | QueryChange) => void>;\n subscription: { unsubscribe(): void } | null;\n};\n\nexport type ReadSide = {\n apply(set: ChangeSet): void;\n query(plan: Plan): Promise<QueryResult>;\n watch(\n plan: Plan,\n identity: string,\n deliver: (message: KeyedResult | QueryChange) => void,\n ): () => void;\n documents(): readonly SearchedDocument[];\n document(room: string, path: string): SearchedDocument | null;\n close(): void;\n};\n\nfunction every(expressions: readonly Expression[]): Expression {\n const [first, second, ...rest] = expressions;\n return second === undefined ? first : and(first, second, ...rest);\n}\n\nfunction some(expressions: readonly Expression[]): Expression {\n const [first, second, ...rest] = expressions;\n return second === undefined ? first : or(first, second, ...rest);\n}\n\nfunction equal(field: Field, value: Exclude<Value, null>): Expression {\n return or(eq(field, value), inArray(value, field));\n}\n\nfunction tested(test: Test, field: Field, size: Size, written: Field): Expression {\n if (test.op === 'eq') return test.value === null ? isNull(field) : equal(field, test.value);\n if (test.op === 'ne') {\n return test.value === null\n ? not(isNull(field))\n : or(isUndefined(field), isNull(field), not(equal(field, test.value)));\n }\n if (test.op === 'in' || test.op === 'nin') {\n const matches =\n test.values.length === 0\n ? inArray(field, [])\n : some(test.values.map((value) => (value === null ? isNull(field) : equal(field, value))));\n if (test.op === 'in') return matches;\n return some([\n isUndefined(field),\n ...(test.values.includes(null) ? [] : [isNull(field)]),\n not(matches),\n ]);\n }\n if (test.op === 'range') {\n const compare = { gt, gte, lt, lte };\n return every(test.bounds.map(([operator, bound]) => compare[operator](field, bound)));\n }\n if (test.op === 'all') {\n return every([not(isUndefined(size)), ...test.values.map((value) => inArray(value, field))]);\n }\n if (test.op === 'size') return eq(size, test.size);\n return test.exists ? not(isUndefined(written)) : isUndefined(written);\n}\n\nfunction conditioned(condition: Condition, row: Reference): Expression {\n if ('every' in condition) return every(condition.every.map((item) => conditioned(item, row)));\n if ('some' in condition) return some(condition.some.map((item) => conditioned(item, row)));\n return tested(\n condition.test,\n row.values[condition.field],\n row.sizes[condition.field],\n row.fields[condition.field],\n );\n}\n\nfunction scoped(scope: Scope, row: Reference, rooms: readonly string[] | null): Expression {\n return every([\n eq(row.kind, 'document'),\n ...(rooms === null ? [] : [inArray(row.room, [...rooms])]),\n ...(scope.types === null ? [] : [inArray(row.type as Reference['room'], [...scope.types])]),\n ...(scope.pathPrefix === null ? [] : [inArray(scope.pathPrefix, row.directories)]),\n ...(scope.where === null ? [] : [conditioned(scope.where, row)]),\n ]);\n}\n\nfunction keyed(key: KeyPlan, row: Reference): Field | Reference['room'] | null {\n return key.of === 'field' ? row.values[key.field] : row[key.of];\n}\n\nfunction live(query: (q: InitialQueryBuilder) => object): Live {\n return createLiveQueryCollection({\n query: query as (q: InitialQueryBuilder) => QueryBuilder<Context>,\n startSync: true,\n }) as unknown as Live;\n}\n\nfunction related(\n q: InitialQueryBuilder,\n rows: Collection<Stored, string>,\n scope: Scope,\n field: string | null,\n kept: 'source' | 'target',\n): object {\n const matched = kept === 'source' ? 'target' : 'source';\n const from: Builder = q.from({ r: rows });\n return from\n .where(({ r }) =>\n every([eq(r.kind, 'reference'), ...(field === null ? [] : [eq(r.field, field)])]),\n )\n .innerJoin({ m: rows }, ({ r, m }) => eq(r[matched], m.key))\n .where(({ m }) => scoped(scope, m, null))\n .groupBy(({ r }) => r[kept])\n .select(({ r }) => ({ key: r[kept] }));\n}\n\nfunction filtered(q: InitialQueryBuilder, rows: Collection<Stored, string>, plan: Plan): Builder {\n const from: Builder = q.from({ d: rows });\n let query = from.where(({ d }) => scoped(plan.root, d, plan.rooms));\n if (plan.hop !== null) {\n const hop = related(q, rows, plan.hop, plan.hop.field, 'source');\n query = query.innerJoin({ h: hop }, ({ d, h }) => eq(d.key, h.key));\n }\n if (plan.backlinks !== null) {\n const backlinks = related(q, rows, plan.backlinks, plan.backlinks.field, 'target');\n query = query.innerJoin({ k: backlinks }, ({ d, k }) => eq(d.key, k.key));\n }\n return query;\n}\n\nfunction named<T>(prefix: string, names: readonly string[], source: Readonly<Record<string, T>>) {\n return Object.fromEntries(names.map((name, index) => [`${prefix}${index}`, source[name]]));\n}\n\nfunction documents(\n q: InitialQueryBuilder,\n rows: Collection<Stored, string>,\n plan: Plan,\n shape: DocumentShape,\n): object {\n let query = filtered(q, rows, plan);\n if (shape.sections !== null || shape.preamble || shape.markdown) {\n query = (\n query as Builder & {\n leftJoin(\n source: Readonly<Record<string, unknown>>,\n on: (refs: Refs) => Expression,\n ): Builder;\n }\n ).leftJoin({ b: rows }, ({ d, b }) => eq(d.body, b.key));\n }\n for (const { key, options } of shape.orderBy) {\n query = query.orderBy(({ d }) => keyed(key, d), options);\n }\n if (shape.orderBy.length === 0 && plan.limit !== null) {\n query = query.orderBy(({ d }) => d.key, { stringSort: 'lexical' });\n }\n if (plan.limit !== null) query = query.limit(plan.limit);\n return query.select(({ d, b }) => ({\n room: d.room,\n path: d.path,\n type: d.type,\n ...(shape.fields === 'all' ? { fields: d.fields } : {}),\n ...(Array.isArray(shape.fields) ? named('field', shape.fields, d.fields) : {}),\n ...(shape.sections === 'all' ? { sections: b.sections } : {}),\n ...(Array.isArray(shape.sections) ? named('section', shape.sections, b.sections) : {}),\n ...(shape.preamble ? { preamble: b.preamble } : {}),\n ...(shape.markdown ? { markdown: b.markdown } : {}),\n ...(shape.backlinks ? { backlinks: toArray(backlinked(q, rows, d)) } : {}),\n }));\n}\n\nfunction backlinked(q: InitialQueryBuilder, rows: Collection<Stored, string>, document: Reference) {\n const from: Builder = q.from({ r: rows });\n return from\n .where(({ r }) => eq(r.target, document.key))\n .orderBy(({ r }) => r.path, { stringSort: 'lexical' })\n .orderBy(({ r }) => r.field, { stringSort: 'lexical' })\n .select(({ r }) => ({ path: r.path, type: r.type, field: r.field })) as QueryBuilder<Context>;\n}\n\nfunction groups(q: InitialQueryBuilder, stage: Live, shape: GroupShape, limit: number | null) {\n const keys = shape.groupBy.map((_, index) => `key${index}`);\n const from: Builder = q.from({ m: stage });\n let query = from.groupBy(({ m }) => keys.map((key) => m[key]));\n for (const { by, direction } of shape.orderBy) {\n query = query.orderBy(({ m }) => (by === 'count' ? count(m.key) : m[keys[by]]), direction);\n }\n if (limit !== null && shape.orderBy.length > 0) query = query.limit(limit);\n return query.select(({ m }) => ({\n ...Object.fromEntries(keys.map((key) => [key, m[key]])),\n count: count(m.key),\n }));\n}\n\nfunction built(rows: Collection<Stored, string>, plan: Plan): Built {\n const shape = plan.shape;\n if (shape.kind === 'documents') {\n const collection = live((q) => documents(q, rows, plan, shape));\n return { live: collection, dispose: () => void collection.cleanup() };\n }\n const stage = live((q) =>\n filtered(q, rows, plan).select(({ d }) => ({\n key: d.key,\n ...Object.fromEntries(shape.groupBy.map((key, index) => [`key${index}`, keyed(key, d)])),\n })),\n );\n const collection = live((q) => groups(q, stage, shape, plan.limit));\n return {\n live: collection,\n dispose: () => {\n void collection.cleanup();\n void stage.cleanup();\n },\n };\n}\n\nfunction present(entries: readonly (readonly [string, unknown])[]) {\n return Object.fromEntries(entries.filter(([, value]) => value !== undefined));\n}\n\nfunction part(\n row: Readonly<Record<string, unknown>>,\n prefix: string,\n names: 'all' | readonly string[],\n whole: unknown,\n) {\n if (names === 'all') return whole;\n return present(names.map((name, index) => [name, row[`${prefix}${index}`]] as const));\n}\n\nfunction documentOf(row: Readonly<Record<string, unknown>>, shape: DocumentShape): QueryDocument {\n if (row.type === null) return { room: row.room as string, path: row.path as string };\n return {\n room: row.room as string,\n path: row.path as string,\n type: row.type as string,\n ...(shape.fields === null\n ? {}\n : { fields: part(row, 'field', shape.fields, row.fields) as QueryDocument['fields'] }),\n ...(shape.sections === null\n ? {}\n : {\n sections: part(row, 'section', shape.sections, row.sections) as QueryDocument['sections'],\n }),\n ...(shape.preamble ? { preamble: row.preamble as string } : {}),\n ...(shape.markdown ? { markdown: row.markdown as string } : {}),\n ...(shape.backlinks\n ? {\n backlinks: (row.backlinks as readonly Readonly<Record<string, string>>[]).map(\n ({ path, type, field }) => ({ path, type, field }),\n ),\n }\n : {}),\n };\n}\n\nfunction keyedOf(\n plan: Plan,\n entries: readonly (readonly [RowKey, Readonly<Record<string, unknown>>])[],\n): KeyedResult {\n const shape = plan.shape;\n if (shape.kind === 'documents') {\n return {\n result: structuredClone({ documents: entries.map(([, row]) => documentOf(row, shape)) }),\n keys: entries.map(([key]) => key),\n };\n }\n const bounded =\n shape.orderBy.length === 0 && plan.limit !== null ? entries.slice(0, plan.limit) : entries;\n return {\n result: structuredClone({\n groups: bounded.map(([, row]) => ({\n key: shape.groupBy.map((_, index) => row[`key${index}`]),\n count: row.count as number,\n })),\n }),\n keys: bounded.map(([key]) => key),\n };\n}\n\nfunction reconciled(\n previous: KeyedResult,\n next: KeyedResult,\n): { keyed: KeyedResult; change: QueryChange } | null {\n const before = rowsOf(previous.result);\n const held = new Map(previous.keys.map((key, index) => [key, before[index]]));\n const changed: (readonly [RowKey, QueryDocument | QueryGroup])[] = [];\n const rows = rowsOf(next.result).map((row, index) => {\n const key = next.keys[index];\n const kept = held.get(key);\n if (kept !== undefined && deepEquals(kept, row)) return kept;\n changed.push([key, row]);\n return row;\n });\n const present = new Set(next.keys);\n const survivors = previous.keys.filter((key) => present.has(key));\n const removed = previous.keys.filter((key) => !present.has(key));\n const moved =\n survivors.length !== next.keys.length ||\n survivors.some((key, index) => key !== next.keys[index]);\n if (changed.length === 0 && removed.length === 0 && !moved) return null;\n return {\n keyed: {\n result:\n 'groups' in next.result\n ? { groups: rows as readonly QueryGroup[] }\n : { documents: rows as readonly QueryDocument[] },\n keys: next.keys,\n },\n change: { changed, removed, order: moved ? next.keys : null },\n };\n}\n\nexport function createReadSide(): ReadSide {\n configureIndexDevMode({ enabled: false });\n let sync!: Parameters<SyncConfig<Stored, string>['sync']>[0];\n const rows = createCollection<Stored, string>({\n getKey: (row) => row.key,\n gcTime: 0,\n startSync: true,\n autoIndex: 'eager',\n defaultIndexType: BasicIndex,\n sync: {\n rowUpdateMode: 'full',\n sync: (params) => {\n sync = params;\n params.markReady();\n },\n },\n });\n const shared = new Map<string, Shared>();\n\n function searched(row: Stored): SearchedDocument {\n const body = rows.get(row.body) as Stored;\n return {\n room: row.room,\n path: row.path,\n type: row.type as string,\n fields: row.fields,\n preamble: body.preamble,\n sections: body.sections,\n };\n }\n\n function publish(entry: Shared) {\n const next = reconciled(\n entry.result as KeyedResult,\n keyedOf(entry.plan, [...entry.built.live.entries()]),\n );\n if (next === null) return;\n entry.result = next.keyed;\n for (const listener of entry.listeners) listener(next.change);\n }\n\n return {\n apply(set) {\n const next = new Map<string, Row | null>();\n for (const change of set.documents) {\n for (const row of change.before) next.set(row.key, null);\n for (const row of change.after) next.set(row.key, row);\n }\n if (next.size === 0) return;\n sync.begin();\n for (const [key, row] of next) {\n if (row === null) {\n if (rows.has(key)) sync.write({ type: 'delete', key });\n continue;\n }\n sync.write({ type: rows.has(key) ? 'update' : 'insert', value: row as Stored });\n }\n sync.commit();\n },\n async query(plan) {\n const { live: collection, dispose } = built(rows, plan);\n try {\n await collection.toArrayWhenReady();\n return keyedOf(plan, [...collection.entries()]).result;\n } finally {\n dispose();\n }\n },\n watch(plan, identity, deliver) {\n let entry = shared.get(identity);\n if (entry === undefined) {\n const created: Shared = {\n plan,\n built: built(rows, plan),\n result: undefined,\n listeners: new Set(),\n subscription: null,\n };\n created.built.live.on('status:change', ({ status }) => {\n if (status === 'cleaned-up' && created.listeners.size === 0) shared.delete(identity);\n });\n shared.set(identity, created);\n entry = created;\n }\n const observed = entry;\n observed.listeners.add(deliver);\n observed.built.live.onFirstReady(() => {\n if (!observed.listeners.has(deliver)) return;\n if (observed.subscription === null) {\n observed.result = keyedOf(observed.plan, [...observed.built.live.entries()]);\n observed.subscription = observed.built.live.subscribeChanges(\n () => {\n publish(observed);\n },\n { includeInitialState: false },\n );\n }\n deliver(observed.result as KeyedResult);\n });\n return () => {\n if (!observed.listeners.delete(deliver) || observed.listeners.size > 0) return;\n observed.subscription?.unsubscribe();\n observed.subscription = null;\n };\n },\n documents() {\n return rows.toArray\n .filter((row) => row.kind === 'document' && row.type !== null)\n .map(searched);\n },\n document(room, path) {\n const row = rows.get(documentKey(room, path));\n return row === undefined || row.type === null ? null : searched(row);\n },\n close() {\n for (const entry of shared.values()) {\n entry.listeners.clear();\n entry.subscription?.unsubscribe();\n entry.built.dispose();\n }\n shared.clear();\n void rows.cleanup();\n },\n };\n}\n"],"names":["and","BasicIndex","configureIndexDevMode","count","createCollection","createLiveQueryCollection","deepEquals","eq","gt","gte","inArray","isNull","isUndefined","lt","lte","not","or","toArray","rowsOf","documentKey","every","expressions","first","second","rest","undefined","some","equal","field","value","tested","test","size","written","op","matches","values","length","map","includes","compare","bounds","operator","bound","exists","conditioned","condition","row","item","sizes","fields","scoped","scope","rooms","kind","room","types","type","pathPrefix","directories","where","keyed","key","of","live","query","startSync","related","q","rows","kept","matched","from","r","innerJoin","m","groupBy","select","filtered","plan","d","root","hop","h","backlinks","k","named","prefix","names","source","Object","fromEntries","name","index","documents","shape","sections","preamble","markdown","leftJoin","b","body","options","orderBy","limit","stringSort","path","Array","isArray","backlinked","document","target","groups","stage","keys","_","by","direction","built","collection","dispose","cleanup","present","entries","filter","part","whole","documentOf","keyedOf","result","structuredClone","bounded","slice","reconciled","previous","next","before","held","Map","changed","get","push","Set","survivors","has","removed","moved","change","order","createReadSide","enabled","sync","getKey","gcTime","autoIndex","defaultIndexType","rowUpdateMode","params","markReady","shared","searched","publish","entry","listener","listeners","apply","set","after","begin","write","commit","toArrayWhenReady","watch","identity","deliver","created","subscription","on","status","delete","observed","add","onFirstReady","subscribeChanges","includeInitialState","unsubscribe","close","clear"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/workspace/packages/mdruntime/src/read-side.ts"],"sourcesContent":["import {\n and,\n BasicIndex,\n configureIndexDevMode,\n count,\n createCollection,\n createLiveQueryCollection,\n deepEquals,\n eq,\n gt,\n gte,\n inArray,\n isNull,\n isUndefined,\n lt,\n lte,\n not,\n or,\n toArray,\n type Collection,\n type Context,\n type InitialQueryBuilder,\n type QueryBuilder,\n type Ref,\n type SyncConfig,\n} from '@tanstack/db';\nimport type { HeadChange } from './adapter.js';\nimport type { ChangeSet } from './change-set.js';\nimport { rowsOf, type KeyedResult, type QueryChange, type RowKey } from './observation.js';\nimport type {\n Condition,\n Direction,\n DocumentShape,\n GroupShape,\n KeyPlan,\n OrderOptions,\n Plan,\n QueryDocument,\n QueryGroup,\n QueryResult,\n Scope,\n Test,\n Value,\n} from './query.js';\nimport { documentKey, type Row } from './rows.js';\nimport type { SearchedDocument } from './search.js';\n\ntype Stored = {\n key: string;\n kind: string;\n room: string;\n path: string;\n type: string | null;\n body: string;\n source: string;\n target: string;\n field: string;\n fields: Readonly<Record<string, unknown>>;\n values: Readonly<Record<string, unknown>>;\n sizes: Readonly<Record<string, number>>;\n directories: readonly string[];\n preamble: string;\n sections: Readonly<Record<string, string>>;\n markdown: string;\n change: HeadChange | null;\n} & Readonly<Record<string, unknown>>;\n\ntype Reference = Ref<Stored>;\n\ntype Field = Reference['values'][string];\n\ntype Size = Reference['sizes'][string];\n\ntype Refs = Readonly<Record<string, Reference>>;\n\ntype Expression = ReturnType<typeof eq>;\n\ntype Builder = {\n where(callback: (refs: Refs) => Expression): Builder;\n innerJoin(source: Readonly<Record<string, unknown>>, on: (refs: Refs) => Expression): Builder;\n groupBy(callback: (refs: Refs) => unknown): Builder;\n orderBy(callback: (refs: Refs) => unknown, options: Direction | OrderOptions): Builder;\n limit(count: number): Builder;\n select(callback: (refs: Refs) => object): object;\n};\n\ntype Live = Collection<Stored, string | number>;\n\ntype Built = { live: Live; dispose(): void };\n\ntype Shared = {\n plan: Plan;\n built: Built;\n result: KeyedResult | undefined;\n listeners: Set<(message: KeyedResult | QueryChange) => void>;\n subscription: { unsubscribe(): void } | null;\n};\n\nexport type ReadSide = {\n apply(set: ChangeSet): void;\n query(plan: Plan): Promise<QueryResult>;\n watch(\n plan: Plan,\n identity: string,\n deliver: (message: KeyedResult | QueryChange) => void,\n ): () => void;\n documents(): readonly SearchedDocument[];\n document(room: string, path: string): SearchedDocument | null;\n close(): void;\n};\n\nfunction every(expressions: readonly Expression[]): Expression {\n const [first, second, ...rest] = expressions;\n return second === undefined ? first : and(first, second, ...rest);\n}\n\nfunction some(expressions: readonly Expression[]): Expression {\n const [first, second, ...rest] = expressions;\n return second === undefined ? first : or(first, second, ...rest);\n}\n\nfunction equal(field: Field, value: Exclude<Value, null>): Expression {\n return or(eq(field, value), inArray(value, field));\n}\n\nfunction tested(test: Test, field: Field, size: Size, written: Field): Expression {\n if (test.op === 'eq') return test.value === null ? isNull(field) : equal(field, test.value);\n if (test.op === 'ne') {\n return test.value === null\n ? not(isNull(field))\n : or(isUndefined(field), isNull(field), not(equal(field, test.value)));\n }\n if (test.op === 'in' || test.op === 'nin') {\n const matches =\n test.values.length === 0\n ? inArray(field, [])\n : some(test.values.map((value) => (value === null ? isNull(field) : equal(field, value))));\n if (test.op === 'in') return matches;\n return some([\n isUndefined(field),\n ...(test.values.includes(null) ? [] : [isNull(field)]),\n not(matches),\n ]);\n }\n if (test.op === 'range') {\n const compare = { gt, gte, lt, lte };\n return every(test.bounds.map(([operator, bound]) => compare[operator](field, bound)));\n }\n if (test.op === 'all') {\n return every([not(isUndefined(size)), ...test.values.map((value) => inArray(value, field))]);\n }\n if (test.op === 'size') return eq(size, test.size);\n return test.exists ? not(isUndefined(written)) : isUndefined(written);\n}\n\nfunction conditioned(condition: Condition, row: Reference): Expression {\n if ('every' in condition) return every(condition.every.map((item) => conditioned(item, row)));\n if ('some' in condition) return some(condition.some.map((item) => conditioned(item, row)));\n return tested(\n condition.test,\n row.values[condition.field],\n row.sizes[condition.field],\n row.fields[condition.field],\n );\n}\n\nfunction scoped(scope: Scope, row: Reference, rooms: readonly string[] | null): Expression {\n return every([\n eq(row.kind, 'document'),\n ...(rooms === null ? [] : [inArray(row.room, [...rooms])]),\n ...(scope.types === null ? [] : [inArray(row.type as Reference['room'], [...scope.types])]),\n ...(scope.pathPrefix === null ? [] : [inArray(scope.pathPrefix, row.directories)]),\n ...(scope.where === null ? [] : [conditioned(scope.where, row)]),\n ]);\n}\n\nfunction keyed(key: KeyPlan, row: Reference): Field | Reference['room'] | null {\n return key.of === 'field' ? row.values[key.field] : row[key.of];\n}\n\nfunction live(query: (q: InitialQueryBuilder) => object): Live {\n return createLiveQueryCollection({\n query: query as (q: InitialQueryBuilder) => QueryBuilder<Context>,\n startSync: true,\n }) as unknown as Live;\n}\n\nfunction related(\n q: InitialQueryBuilder,\n rows: Collection<Stored, string>,\n scope: Scope,\n field: string | null,\n kept: 'source' | 'target',\n): object {\n const matched = kept === 'source' ? 'target' : 'source';\n const from: Builder = q.from({ r: rows });\n return from\n .where(({ r }) =>\n every([eq(r.kind, 'reference'), ...(field === null ? [] : [eq(r.field, field)])]),\n )\n .innerJoin({ m: rows }, ({ r, m }) => eq(r[matched], m.key))\n .where(({ m }) => scoped(scope, m, null))\n .groupBy(({ r }) => r[kept])\n .select(({ r }) => ({ key: r[kept] }));\n}\n\nfunction filtered(q: InitialQueryBuilder, rows: Collection<Stored, string>, plan: Plan): Builder {\n const from: Builder = q.from({ d: rows });\n let query = from.where(({ d }) => scoped(plan.root, d, plan.rooms));\n if (plan.hop !== null) {\n const hop = related(q, rows, plan.hop, plan.hop.field, 'source');\n query = query.innerJoin({ h: hop }, ({ d, h }) => eq(d.key, h.key));\n }\n if (plan.backlinks !== null) {\n const backlinks = related(q, rows, plan.backlinks, plan.backlinks.field, 'target');\n query = query.innerJoin({ k: backlinks }, ({ d, k }) => eq(d.key, k.key));\n }\n return query;\n}\n\nfunction named<T>(prefix: string, names: readonly string[], source: Readonly<Record<string, T>>) {\n return Object.fromEntries(names.map((name, index) => [`${prefix}${index}`, source[name]]));\n}\n\nfunction documents(\n q: InitialQueryBuilder,\n rows: Collection<Stored, string>,\n plan: Plan,\n shape: DocumentShape,\n): object {\n let query = filtered(q, rows, plan);\n if (shape.sections !== null || shape.preamble || shape.markdown) {\n query = (\n query as Builder & {\n leftJoin(\n source: Readonly<Record<string, unknown>>,\n on: (refs: Refs) => Expression,\n ): Builder;\n }\n ).leftJoin({ b: rows }, ({ d, b }) => eq(d.body, b.key));\n }\n for (const { key, options } of shape.orderBy) {\n query = query.orderBy(({ d }) => keyed(key, d), options);\n }\n if (shape.orderBy.length === 0 && plan.limit !== null) {\n query = query.orderBy(({ d }) => d.key, { stringSort: 'lexical' });\n }\n if (plan.limit !== null) query = query.limit(plan.limit);\n return query.select(({ d, b }) => ({\n room: d.room,\n path: d.path,\n type: d.type,\n ...(shape.fields === 'all' ? { fields: d.fields } : {}),\n ...(Array.isArray(shape.fields) ? named('field', shape.fields, d.fields) : {}),\n ...(shape.sections === 'all' ? { sections: b.sections } : {}),\n ...(Array.isArray(shape.sections) ? named('section', shape.sections, b.sections) : {}),\n ...(shape.preamble ? { preamble: b.preamble } : {}),\n ...(shape.markdown ? { markdown: b.markdown } : {}),\n ...(shape.backlinks ? { backlinks: toArray(backlinked(q, rows, d)) } : {}),\n ...(shape.change ? { change: d.change } : {}),\n }));\n}\n\nfunction backlinked(q: InitialQueryBuilder, rows: Collection<Stored, string>, document: Reference) {\n const from: Builder = q.from({ r: rows });\n return from\n .where(({ r }) => eq(r.target, document.key))\n .orderBy(({ r }) => r.path, { stringSort: 'lexical' })\n .orderBy(({ r }) => r.field, { stringSort: 'lexical' })\n .select(({ r }) => ({ path: r.path, type: r.type, field: r.field })) as QueryBuilder<Context>;\n}\n\nfunction groups(q: InitialQueryBuilder, stage: Live, shape: GroupShape, limit: number | null) {\n const keys = shape.groupBy.map((_, index) => `key${index}`);\n const from: Builder = q.from({ m: stage });\n let query = from.groupBy(({ m }) => keys.map((key) => m[key]));\n for (const { by, direction } of shape.orderBy) {\n query = query.orderBy(({ m }) => (by === 'count' ? count(m.key) : m[keys[by]]), direction);\n }\n if (limit !== null && shape.orderBy.length > 0) query = query.limit(limit);\n return query.select(({ m }) => ({\n ...Object.fromEntries(keys.map((key) => [key, m[key]])),\n count: count(m.key),\n }));\n}\n\nfunction built(rows: Collection<Stored, string>, plan: Plan): Built {\n const shape = plan.shape;\n if (shape.kind === 'documents') {\n const collection = live((q) => documents(q, rows, plan, shape));\n return { live: collection, dispose: () => void collection.cleanup() };\n }\n const stage = live((q) =>\n filtered(q, rows, plan).select(({ d }) => ({\n key: d.key,\n ...Object.fromEntries(shape.groupBy.map((key, index) => [`key${index}`, keyed(key, d)])),\n })),\n );\n const collection = live((q) => groups(q, stage, shape, plan.limit));\n return {\n live: collection,\n dispose: () => {\n void collection.cleanup();\n void stage.cleanup();\n },\n };\n}\n\nfunction present(entries: readonly (readonly [string, unknown])[]) {\n return Object.fromEntries(entries.filter(([, value]) => value !== undefined));\n}\n\nfunction part(\n row: Readonly<Record<string, unknown>>,\n prefix: string,\n names: 'all' | readonly string[],\n whole: unknown,\n) {\n if (names === 'all') return whole;\n return present(names.map((name, index) => [name, row[`${prefix}${index}`]] as const));\n}\n\nfunction documentOf(row: Readonly<Record<string, unknown>>, shape: DocumentShape): QueryDocument {\n if (row.type === null) return { room: row.room as string, path: row.path as string };\n return {\n room: row.room as string,\n path: row.path as string,\n type: row.type as string,\n ...(shape.fields === null\n ? {}\n : { fields: part(row, 'field', shape.fields, row.fields) as QueryDocument['fields'] }),\n ...(shape.sections === null\n ? {}\n : {\n sections: part(row, 'section', shape.sections, row.sections) as QueryDocument['sections'],\n }),\n ...(shape.preamble ? { preamble: row.preamble as string } : {}),\n ...(shape.markdown ? { markdown: row.markdown as string } : {}),\n ...(shape.backlinks\n ? {\n backlinks: (row.backlinks as readonly Readonly<Record<string, string>>[]).map(\n ({ path, type, field }) => ({ path, type, field }),\n ),\n }\n : {}),\n ...(shape.change ? { change: row.change as HeadChange | null } : {}),\n };\n}\n\nfunction keyedOf(\n plan: Plan,\n entries: readonly (readonly [RowKey, Readonly<Record<string, unknown>>])[],\n): KeyedResult {\n const shape = plan.shape;\n if (shape.kind === 'documents') {\n return {\n result: structuredClone({ documents: entries.map(([, row]) => documentOf(row, shape)) }),\n keys: entries.map(([key]) => key),\n };\n }\n const bounded =\n shape.orderBy.length === 0 && plan.limit !== null ? entries.slice(0, plan.limit) : entries;\n return {\n result: structuredClone({\n groups: bounded.map(([, row]) => ({\n key: shape.groupBy.map((_, index) => row[`key${index}`]),\n count: row.count as number,\n })),\n }),\n keys: bounded.map(([key]) => key),\n };\n}\n\nfunction reconciled(\n previous: KeyedResult,\n next: KeyedResult,\n): { keyed: KeyedResult; change: QueryChange } | null {\n const before = rowsOf(previous.result);\n const held = new Map(previous.keys.map((key, index) => [key, before[index]]));\n const changed: (readonly [RowKey, QueryDocument | QueryGroup])[] = [];\n const rows = rowsOf(next.result).map((row, index) => {\n const key = next.keys[index];\n const kept = held.get(key);\n if (kept !== undefined && deepEquals(kept, row)) return kept;\n changed.push([key, row]);\n return row;\n });\n const present = new Set(next.keys);\n const survivors = previous.keys.filter((key) => present.has(key));\n const removed = previous.keys.filter((key) => !present.has(key));\n const moved =\n survivors.length !== next.keys.length ||\n survivors.some((key, index) => key !== next.keys[index]);\n if (changed.length === 0 && removed.length === 0 && !moved) return null;\n return {\n keyed: {\n result:\n 'groups' in next.result\n ? { groups: rows as readonly QueryGroup[] }\n : { documents: rows as readonly QueryDocument[] },\n keys: next.keys,\n },\n change: { changed, removed, order: moved ? next.keys : null },\n };\n}\n\nexport function createReadSide(): ReadSide {\n configureIndexDevMode({ enabled: false });\n let sync!: Parameters<SyncConfig<Stored, string>['sync']>[0];\n const rows = createCollection<Stored, string>({\n getKey: (row) => row.key,\n gcTime: 0,\n startSync: true,\n autoIndex: 'eager',\n defaultIndexType: BasicIndex,\n sync: {\n rowUpdateMode: 'full',\n sync: (params) => {\n sync = params;\n params.markReady();\n },\n },\n });\n const shared = new Map<string, Shared>();\n\n function searched(row: Stored): SearchedDocument {\n const body = rows.get(row.body) as Stored;\n return {\n room: row.room,\n path: row.path,\n type: row.type as string,\n fields: row.fields,\n preamble: body.preamble,\n sections: body.sections,\n };\n }\n\n function publish(entry: Shared) {\n const next = reconciled(\n entry.result as KeyedResult,\n keyedOf(entry.plan, [...entry.built.live.entries()]),\n );\n if (next === null) return;\n entry.result = next.keyed;\n for (const listener of entry.listeners) listener(next.change);\n }\n\n return {\n apply(set) {\n const next = new Map<string, Row | null>();\n for (const change of set.documents) {\n for (const row of change.before) next.set(row.key, null);\n for (const row of change.after) next.set(row.key, row);\n }\n if (next.size === 0) return;\n sync.begin();\n for (const [key, row] of next) {\n if (row === null) {\n if (rows.has(key)) sync.write({ type: 'delete', key });\n continue;\n }\n sync.write({ type: rows.has(key) ? 'update' : 'insert', value: row as Stored });\n }\n sync.commit();\n },\n async query(plan) {\n const { live: collection, dispose } = built(rows, plan);\n try {\n await collection.toArrayWhenReady();\n return keyedOf(plan, [...collection.entries()]).result;\n } finally {\n dispose();\n }\n },\n watch(plan, identity, deliver) {\n let entry = shared.get(identity);\n if (entry === undefined) {\n const created: Shared = {\n plan,\n built: built(rows, plan),\n result: undefined,\n listeners: new Set(),\n subscription: null,\n };\n created.built.live.on('status:change', ({ status }) => {\n if (status === 'cleaned-up' && created.listeners.size === 0) shared.delete(identity);\n });\n shared.set(identity, created);\n entry = created;\n }\n const observed = entry;\n observed.listeners.add(deliver);\n observed.built.live.onFirstReady(() => {\n if (!observed.listeners.has(deliver)) return;\n if (observed.subscription === null) {\n observed.result = keyedOf(observed.plan, [...observed.built.live.entries()]);\n observed.subscription = observed.built.live.subscribeChanges(\n () => {\n publish(observed);\n },\n { includeInitialState: false },\n );\n }\n deliver(observed.result as KeyedResult);\n });\n return () => {\n if (!observed.listeners.delete(deliver) || observed.listeners.size > 0) return;\n observed.subscription?.unsubscribe();\n observed.subscription = null;\n };\n },\n documents() {\n return rows.toArray\n .filter((row) => row.kind === 'document' && row.type !== null)\n .map(searched);\n },\n document(room, path) {\n const row = rows.get(documentKey(room, path));\n return row === undefined || row.type === null ? null : searched(row);\n },\n close() {\n for (const entry of shared.values()) {\n entry.listeners.clear();\n entry.subscription?.unsubscribe();\n entry.built.dispose();\n }\n shared.clear();\n void rows.cleanup();\n },\n };\n}\n"],"names":["and","BasicIndex","configureIndexDevMode","count","createCollection","createLiveQueryCollection","deepEquals","eq","gt","gte","inArray","isNull","isUndefined","lt","lte","not","or","toArray","rowsOf","documentKey","every","expressions","first","second","rest","undefined","some","equal","field","value","tested","test","size","written","op","matches","values","length","map","includes","compare","bounds","operator","bound","exists","conditioned","condition","row","item","sizes","fields","scoped","scope","rooms","kind","room","types","type","pathPrefix","directories","where","keyed","key","of","live","query","startSync","related","q","rows","kept","matched","from","r","innerJoin","m","groupBy","select","filtered","plan","d","root","hop","h","backlinks","k","named","prefix","names","source","Object","fromEntries","name","index","documents","shape","sections","preamble","markdown","leftJoin","b","body","options","orderBy","limit","stringSort","path","Array","isArray","backlinked","change","document","target","groups","stage","keys","_","by","direction","built","collection","dispose","cleanup","present","entries","filter","part","whole","documentOf","keyedOf","result","structuredClone","bounded","slice","reconciled","previous","next","before","held","Map","changed","get","push","Set","survivors","has","removed","moved","order","createReadSide","enabled","sync","getKey","gcTime","autoIndex","defaultIndexType","rowUpdateMode","params","markReady","shared","searched","publish","entry","listener","listeners","apply","set","after","begin","write","commit","toArrayWhenReady","watch","identity","deliver","created","subscription","on","status","delete","observed","add","onFirstReady","subscribeChanges","includeInitialState","unsubscribe","close","clear"],"mappings":"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"}
|
package/dist/refresh.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,EAA2B,MAAM,cAAc,CAAC;AACpG,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,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,GACxB,OAAO,CAAC,cAAc,CAAC,CA+DzB"}
|
package/dist/refresh.js
CHANGED
|
@@ -16,19 +16,28 @@ export async function refreshRoom(adapter, authorization, confirmed, continuing)
|
|
|
16
16
|
const revisions = {
|
|
17
17
|
...confirmed.record.revisions
|
|
18
18
|
};
|
|
19
|
+
const changes = {
|
|
20
|
+
...confirmed.record.changes
|
|
21
|
+
};
|
|
19
22
|
const binaryTargets = new Set(confirmed.record.binaryTargets);
|
|
20
23
|
const stage = (page)=>{
|
|
21
24
|
Object.assign(documents, page.documents);
|
|
22
25
|
Object.assign(revisions, page.revisions);
|
|
23
|
-
for (const path of Object.keys(page.documents))
|
|
26
|
+
for (const path of Object.keys(page.documents)){
|
|
27
|
+
binaryTargets.delete(path);
|
|
28
|
+
delete changes[path];
|
|
29
|
+
}
|
|
24
30
|
for (const target of page.binaryTargets){
|
|
25
31
|
delete documents[target];
|
|
26
32
|
delete revisions[target];
|
|
33
|
+
delete changes[target];
|
|
27
34
|
binaryTargets.add(target);
|
|
28
35
|
}
|
|
36
|
+
Object.assign(changes, page.changes);
|
|
29
37
|
for (const path of page.removals){
|
|
30
38
|
delete documents[path];
|
|
31
39
|
delete revisions[path];
|
|
40
|
+
delete changes[path];
|
|
32
41
|
binaryTargets.delete(path);
|
|
33
42
|
}
|
|
34
43
|
};
|
|
@@ -55,7 +64,8 @@ export async function refreshRoom(adapter, authorization, confirmed, continuing)
|
|
|
55
64
|
binaryTargets: [
|
|
56
65
|
...binaryTargets
|
|
57
66
|
].sort(),
|
|
58
|
-
revisions
|
|
67
|
+
revisions,
|
|
68
|
+
changes
|
|
59
69
|
}, confirmed);
|
|
60
70
|
return staged.kind === 'staged' ? {
|
|
61
71
|
kind: 'advanced',
|
package/dist/refresh.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/workspace/packages/mdruntime/src/refresh.ts"],"sourcesContent":["import type { Adapter, AdapterFailure, Authorization, RefreshPage } from './adapter.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 | Unconfirmed\n | Refused\n | AdapterFailure;\n\nexport async function refreshRoom(\n adapter: Adapter,\n authorization: Authorization,\n confirmed: ConfirmedLayer,\n continuing: () => boolean,\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 });\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 binaryTargets = new Set(confirmed.record.binaryTargets);\n const stage = (page: RefreshPage) => {\n Object.assign(documents, page.documents);\n Object.assign(revisions, page.revisions);\n for (const path of Object.keys(page.documents)) binaryTargets.delete(path);\n for (const target of page.binaryTargets) {\n delete documents[target];\n delete revisions[target];\n binaryTargets.add(target);\n }\n for (const path of page.removals) {\n delete documents[path];\n delete revisions[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 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 },\n confirmed,\n );\n return staged.kind === 'staged' ? { kind: 'advanced', confirmed: staged.confirmed } : staged;\n}\n"],"names":["readStaged","unconfirmed","refreshRoom","adapter","authorization","confirmed","continuing","locator","record","fromRoomVersion","roomVersion","first","refresh","selection","replica","kind","documents","revisions","binaryTargets","Set","stage","page","Object","assign","path","keys","delete","target","add","removals","pageToken","undefined","staged","sort"],"mappings":"AACA,SAASA,UAAU,QAA6B,eAAe;AAC/D,SAASC,WAAW,QAAwC,gBAAgB;AAU5E,OAAO,eAAeC,YACpBC,OAAgB,EAChBC,aAA4B,EAC5BC,SAAyB,EACzBC,UAAyB;IAEzB,MAAMC,UAAUF,UAAUG,MAAM,CAACD,OAAO;IACxC,MAAME,kBAAkBJ,UAAUG,MAAM,CAACE,WAAW;IACpD,MAAMC,QAAQ,MAAMR,QAAQS,OAAO,CAACR,eAAe;QACjDG;QACAM,WAAWR,UAAUG,MAAM,CAACM,OAAO,CAACD,SAAS;QAC7CJ;IACF;IACA,IAAIE,MAAMI,IAAI,KAAK,mBAAmB,OAAOJ;IAC7C,MAAMD,cAAcC,MAAMD,WAAW;IACrC,MAAMM,YAAoC;QAAE,GAAGX,UAAUG,MAAM,CAACQ,SAAS;IAAC;IAC1E,MAAMC,YAAoC;QAAE,GAAGZ,UAAUG,MAAM,CAACS,SAAS;IAAC;IAC1E,MAAMC,gBAAgB,IAAIC,
|
|
1
|
+
{"version":3,"sources":["/workspace/packages/mdruntime/src/refresh.ts"],"sourcesContent":["import type { Adapter, AdapterFailure, Authorization, HeadChange, RefreshPage } from './adapter.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 | Unconfirmed\n | Refused\n | AdapterFailure;\n\nexport async function refreshRoom(\n adapter: Adapter,\n authorization: Authorization,\n confirmed: ConfirmedLayer,\n continuing: () => boolean,\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 });\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 stage = (page: RefreshPage) => {\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 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 },\n confirmed,\n );\n return staged.kind === 'staged' ? { kind: 'advanced', confirmed: staged.confirmed } : staged;\n}\n"],"names":["readStaged","unconfirmed","refreshRoom","adapter","authorization","confirmed","continuing","locator","record","fromRoomVersion","roomVersion","first","refresh","selection","replica","kind","documents","revisions","changes","binaryTargets","Set","stage","page","Object","assign","path","keys","delete","target","add","removals","pageToken","undefined","staged","sort"],"mappings":"AACA,SAASA,UAAU,QAA6B,eAAe;AAC/D,SAASC,WAAW,QAAwC,gBAAgB;AAU5E,OAAO,eAAeC,YACpBC,OAAgB,EAChBC,aAA4B,EAC5BC,SAAyB,EACzBC,UAAyB;IAEzB,MAAMC,UAAUF,UAAUG,MAAM,CAACD,OAAO;IACxC,MAAME,kBAAkBJ,UAAUG,MAAM,CAACE,WAAW;IACpD,MAAMC,QAAQ,MAAMR,QAAQS,OAAO,CAACR,eAAe;QACjDG;QACAM,WAAWR,UAAUG,MAAM,CAACM,OAAO,CAACD,SAAS;QAC7CJ;IACF;IACA,IAAIE,MAAMI,IAAI,KAAK,mBAAmB,OAAOJ;IAC7C,MAAMD,cAAcC,MAAMD,WAAW;IACrC,MAAMM,YAAoC;QAAE,GAAGX,UAAUG,MAAM,CAACQ,SAAS;IAAC;IAC1E,MAAMC,YAAoC;QAAE,GAAGZ,UAAUG,MAAM,CAACS,SAAS;IAAC;IAC1E,MAAMC,UAAsC;QAAE,GAAGb,UAAUG,MAAM,CAACU,OAAO;IAAC;IAC1E,MAAMC,gBAAgB,IAAIC,IAAIf,UAAUG,MAAM,CAACW,aAAa;IAC5D,MAAME,QAAQ,CAACC;QACbC,OAAOC,MAAM,CAACR,WAAWM,KAAKN,SAAS;QACvCO,OAAOC,MAAM,CAACP,WAAWK,KAAKL,SAAS;QACvC,KAAK,MAAMQ,QAAQF,OAAOG,IAAI,CAACJ,KAAKN,SAAS,EAAG;YAC9CG,cAAcQ,MAAM,CAACF;YACrB,OAAOP,OAAO,CAACO,KAAK;QACtB;QACA,KAAK,MAAMG,UAAUN,KAAKH,aAAa,CAAE;YACvC,OAAOH,SAAS,CAACY,OAAO;YACxB,OAAOX,SAAS,CAACW,OAAO;YACxB,OAAOV,OAAO,CAACU,OAAO;YACtBT,cAAcU,GAAG,CAACD;QACpB;QACAL,OAAOC,MAAM,CAACN,SAASI,KAAKJ,OAAO;QACnC,KAAK,MAAMO,QAAQH,KAAKQ,QAAQ,CAAE;YAChC,OAAOd,SAAS,CAACS,KAAK;YACtB,OAAOR,SAAS,CAACQ,KAAK;YACtB,OAAOP,OAAO,CAACO,KAAK;YACpBN,cAAcQ,MAAM,CAACF;QACvB;IACF;IACAJ,MAAMV;IACN,IAAIoB,YAAYpB,MAAMoB,SAAS;IAC/B,MAAOA,cAAcC,UAAW;QAC9B,IAAI,CAAC1B,cAAc,OAAOL;QAC1B,MAAMqB,OAAO,MAAMnB,QAAQS,OAAO,CAACR,eAAe;YAChDG;YACAM,WAAWR,UAAUG,MAAM,CAACM,OAAO,CAACD,SAAS;YAC7CJ;YACAsB;QACF;QACA,IAAIT,KAAKP,IAAI,KAAK,mBAAmBO,KAAKP,IAAI,KAAK,kBAAkB,OAAOd;QAC5E,IAAIqB,KAAKP,IAAI,KAAK,mBAAmB,OAAOO;QAC5C,IAAIA,KAAKZ,WAAW,KAAKA,aAAa,OAAOT;QAC7CoB,MAAMC;QACNS,YAAYT,KAAKS,SAAS;IAC5B;IACA,MAAME,SAASjC,WACb;QACE,GAAGK,UAAUG,MAAM;QACnBE;QACAM;QACAG,eAAe;eAAIA;SAAc,CAACe,IAAI;QACtCjB;QACAC;IACF,GACAb;IAEF,OAAO4B,OAAOlB,IAAI,KAAK,WAAW;QAAEA,MAAM;QAAYV,WAAW4B,OAAO5B,SAAS;IAAC,IAAI4B;AACxF"}
|
package/dist/replica.d.ts.map
CHANGED
|
@@ -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,WAAW,EAAE,MAAM,eAAe,CAAC;AAE1D,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,GAAG,WAAW,CAAC;AAE3F,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,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM,CAkBnF;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,
|
|
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,WAAW,EAAE,MAAM,eAAe,CAAC;AAE1D,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,GAAG,WAAW,CAAC;AAE3F,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,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM,CAkBnF;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;AAuDD,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
|
@@ -48,10 +48,17 @@ export function applyReturned(confirmed, documents, revisions, removals, roomVer
|
|
|
48
48
|
...confirmed.record.revisions,
|
|
49
49
|
...revisions
|
|
50
50
|
};
|
|
51
|
+
const nextChanges = {
|
|
52
|
+
...confirmed.record.changes
|
|
53
|
+
};
|
|
51
54
|
const binaryTargets = new Set(confirmed.record.binaryTargets);
|
|
55
|
+
for (const [path, revision] of Object.entries(revisions)){
|
|
56
|
+
if (confirmed.record.revisions[path] !== revision) delete nextChanges[path];
|
|
57
|
+
}
|
|
52
58
|
for (const path of removals){
|
|
53
59
|
delete nextDocuments[path];
|
|
54
60
|
delete nextRevisions[path];
|
|
61
|
+
delete nextChanges[path];
|
|
55
62
|
binaryTargets.delete(path);
|
|
56
63
|
}
|
|
57
64
|
return readStaged({
|
|
@@ -59,6 +66,7 @@ export function applyReturned(confirmed, documents, revisions, removals, roomVer
|
|
|
59
66
|
roomVersion,
|
|
60
67
|
documents: nextDocuments,
|
|
61
68
|
revisions: nextRevisions,
|
|
69
|
+
changes: nextChanges,
|
|
62
70
|
binaryTargets: [
|
|
63
71
|
...binaryTargets
|
|
64
72
|
].sort()
|
|
@@ -120,6 +128,7 @@ export function replicaOf(confirmed, queue, rewriting, previous) {
|
|
|
120
128
|
documents: confirmed.record.documents,
|
|
121
129
|
binaryTargets: confirmed.record.binaryTargets,
|
|
122
130
|
revisions: confirmed.record.revisions,
|
|
131
|
+
changes: confirmed.record.changes,
|
|
123
132
|
collection: confirmed.collection
|
|
124
133
|
},
|
|
125
134
|
replay: []
|
package/dist/replica.js.map
CHANGED
|
@@ -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, Unconfirmed } 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 | Unconfirmed;\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 collectionRoot: record.collectionRoot,\n model: record.model,\n selection:\n record.typedSelection === null\n ? null\n : { roots: record.typedSelection.roots, model: record.selectionModel },\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 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 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 binaryTargets = new Set(confirmed.record.binaryTargets);\n for (const path of removals) {\n delete nextDocuments[path];\n delete nextRevisions[path];\n binaryTargets.delete(path);\n }\n return readStaged(\n {\n ...confirmed.record,\n roomVersion,\n documents: nextDocuments,\n revisions: nextRevisions,\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 old.collection.composition.collectionRoot === composition.collectionRoot &&\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 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","collectionRoot","model","selection","typedSelection","roots","selectionModel","readConfirmed","previous","read","documents","undefined","text","collection","kind","confirmed","readStaged","status","verdict","binaryTargets","rule","refusal","applyReturned","revisions","removals","roomVersion","nextDocuments","nextRevisions","Set","path","delete","sort","predicted","batches","composition","layer","replay","prior","Map","map","step","id","batch","before","old","get","hasMove","changes","some","change","reuseRewrite","JSON","stringify","effective","after","push","replicaOf","queue","rewriting","Object","freeze","length","visible","predictedState","present","includes","holds","preconditions","parsed","documentAt","has","opened","set","ok","document","every","precondition","revision","value","hasOwn","fields","name","sections","preamble","effects","entries","to","index","at","slice","landed","content","effect","withdrawals","withdrawable","withdrawn"],"mappings":"AAAA,SAASA,KAAK,QAAuB,uBAAuB;AAC5D,SAASC,SAAS,QAA0D,cAAc;AAC1F,SACEC,eAAe,EACfC,cAAc,EACdC,kBAAkB,QAGb,kBAAkB;AACzB,SAASC,OAAO,EAAEC,cAAc,EAAEC,aAAa,QAAoB,eAAe;AAClF,SAASC,iBAAiB,QAAwB,YAAY;AAC9D,SAASC,UAAU,QAAQ,kBAAkB;AA8B7C,OAAO,SAASC,cAAcC,MAAqB;IACjD,OAAO;QACLC,gBAAgBD,OAAOC,cAAc;QACrCC,OAAOF,OAAOE,KAAK;QACnBC,WACEH,OAAOI,cAAc,KAAK,OACtB,OACA;YAAEC,OAAOL,OAAOI,cAAc,CAACC,KAAK;YAAEH,OAAOF,OAAOM,cAAc;QAAC;IAC3E;AACF;AAEA,OAAO,SAASC,cAAcP,MAAqB,EAAEQ,QAAyB;IAC5E,MAAMC,OAAOjB,eACXQ,OAAOU,SAAS,EAChBX,cAAcC,SACdQ,aAAaG,YACTA,YACA;QAAEC,MAAMJ,SAASR,MAAM,CAACU,SAAS;QAAEG,YAAYL,SAASK,UAAU;IAAC;IAEzE,OAAOJ,KAAKK,IAAI,KAAK,SACjB;QAAEA,MAAM;QAAUC,WAAW;YAAEf;YAAQa,YAAYJ,KAAKI,UAAU;QAAC;IAAE,IACrEJ;AACN;AAEA,OAAO,SAASO,WAAWhB,MAAqB,EAAEQ,QAAyB;IACzE,IACE,AAACR,CAAAA,OAAOE,KAAK,CAACe,MAAM,KAAK,aAAajB,OAAOM,cAAc,CAACW,MAAM,KAAK,SAAQ,KAC9ET,CAAAA,aAAaG,aACZ,CAACf,cAAcI,QAAQQ,SAASR,MAAM,KACtCA,OAAOE,KAAK,KAAKM,SAASR,MAAM,CAACE,KAAK,IACtCF,OAAOM,cAAc,KAAKE,SAASR,MAAM,CAACM,cAAc,AAAD,GACzD;QACA,MAAMY,UAAUzB,mBACdO,OAAOU,SAAS,EAChBV,OAAOmB,aAAa,EACpBpB,cAAcC;QAEhB,IAAIkB,QAAQA,OAAO,KAAK,YAAYA,QAAQE,IAAI,KAAK,qBAAqB;YACxE,OAAO;gBAAEN,MAAM;gBAAWO,SAASH;YAAQ;QAC7C;IACF;IACA,OAAOX,cAAcP,QAAQQ;AAC/B;AAEA,OAAO,SAASc,cACdP,SAAyB,EACzBL,SAA2C,EAC3Ca,SAA2C,EAC3CC,QAA2B,EAC3BC,WAAmB;IAEnB,MAAMC,gBAAgB;QAAE,GAAGX,UAAUf,MAAM,CAACU,SAAS;QAAE,GAAGA,SAAS;IAAC;IACpE,MAAMiB,gBAAgB;QAAE,GAAGZ,UAAUf,MAAM,CAACuB,SAAS;QAAE,GAAGA,SAAS;IAAC;IACpE,MAAMJ,gBAAgB,IAAIS,IAAIb,UAAUf,MAAM,CAACmB,aAAa;IAC5D,KAAK,MAAMU,QAAQL,SAAU;QAC3B,OAAOE,aAAa,CAACG,KAAK;QAC1B,OAAOF,aAAa,CAACE,KAAK;QAC1BV,cAAcW,MAAM,CAACD;IACvB;IACA,OAAOb,WACL;QACE,GAAGD,UAAUf,MAAM;QACnByB;QACAf,WAAWgB;QACXH,WAAWI;QACXR,eAAe;eAAIA;SAAc,CAACY,IAAI;IACxC,GACAhB;AAEJ;AAEA,SAASiB,UACPjB,SAAyB,EACzBkB,OAA+B,EAC/BzB,QAAkB;IAElB,MAAM0B,cAAcnC,cAAcgB,UAAUf,MAAM;IAClD,IAAImC,QAAepB,UAAUf,MAAM;IACnC,MAAMoC,SAAuB,EAAE;IAC/B,MAAMC,QAAQ,IAAIC,IAAI9B,UAAU4B,OAAOG,IAAI,CAACC,OAAS;YAACA,KAAKC,EAAE;YAAED;SAAK,KAAK,EAAE;IAC3E,KAAK,MAAME,SAAST,QAAS;QAC3B,MAAMU,SAASR;QACf,MAAMS,MAAMP,MAAMQ,GAAG,CAACH,MAAMD,EAAE;QAC9B,MAAMK,UAAUJ,MAAMK,OAAO,CAACC,IAAI,CAAC,CAACC,SAAWA,OAAOnC,IAAI,KAAK;QAC/D,MAAMoC,eACJN,KAAK/B,eAAeF,aACpBf,cAAc+C,QAAQC,IAAID,MAAM,KAChCC,IAAI/B,UAAU,CAACqB,WAAW,CAACjC,cAAc,KAAKiC,YAAYjC,cAAc,IACxE2C,IAAI/B,UAAU,CAACqB,WAAW,CAAChC,KAAK,KAAKgC,YAAYhC,KAAK,IACtD0C,IAAI/B,UAAU,CAACqB,WAAW,CAAC/B,SAAS,EAAED,UAAUgC,YAAY/B,SAAS,EAAED,SACvEiD,KAAKC,SAAS,CAACR,IAAI/B,UAAU,CAACqB,WAAW,CAAC/B,SAAS,EAAEE,WACnD8C,KAAKC,SAAS,CAAClB,YAAY/B,SAAS,EAAEE;QAC1C,MAAMQ,aAAaiC,UACfI,eACEN,IAAI/B,UAAU,GACdtB,gBACEoD,OAAOjC,SAAS,EAChBwB,aACAU,KAAK/B,eAAeF,YAChB;YAAEC,MAAMG,UAAUf,MAAM,CAACU,SAAS;YAAEG,YAAYE,UAAUF,UAAU;QAAC,IACrE;YAAED,MAAMgC,IAAID,MAAM,CAACjC,SAAS;YAAEG,YAAY+B,IAAI/B,UAAU;QAAC,KAEjEF;QACJ,MAAM0C,YACJxC,eAAeF,YACX+B,QACAQ,eACEN,IAAIS,SAAS,GACbxD,kBAAkB6C,OAAO;YAAE,GAAGC,MAAM;YAAE9B;QAAW;QACzDsB,QACES,QAAQjC,YACJjB,QAAQiD,QAAQ;YAACU;SAAU,IAC3B1D,eAAegD,QAAQ;YAACU;SAAU,EAAET,IAAID,MAAM,EAAE;YAACC,IAAIS,SAAS;SAAC,EAAET,IAAIU,KAAK;QAChFlB,OAAOmB,IAAI,CAAC;YACVd,IAAIC,MAAMD,EAAE;YACZE;YACAW,OAAOnB;YACPkB;YACA,GAAIxC,eAAeF,YAAY,CAAC,IAAI;gBAAEE;YAAW,CAAC;QACpD;IACF;IACA,OAAO;QAAEsB;QAAOC;IAAO;AACzB;AAEA,OAAO,SAASoB,UACdzC,SAAyB,EACzB0C,KAA6B,EAC7BC,SAAoB,EACpBlD,QAAkB;IAElB,MAAMyB,UAAU0B,OAAOC,MAAM,CAACH,MAAMlB,GAAG,CAACjD;IACxC,IAAI2C,QAAQ4B,MAAM,KAAK,GAAG;QACxB,OAAO;YACL9C;YACA0C,OAAOxB;YACP6B,SAAS;gBACPpD,WAAWK,UAAUf,MAAM,CAACU,SAAS;gBACrCS,eAAeJ,UAAUf,MAAM,CAACmB,aAAa;gBAC7CI,WAAWR,UAAUf,MAAM,CAACuB,SAAS;gBACrCV,YAAYE,UAAUF,UAAU;YAClC;YACAuB,QAAQ,EAAE;QACZ;IACF;IACA,MAAM2B,iBAAiBL,cAAc,aAAa1B,UAAUjB,WAAWkB,SAASzB,YAAY;IAC5F,MAAM2B,QACJuB,cAAc,aACVK,eAAgB5B,KAAK,GACrB3B,aAAaG,YACXjB,QAAQqB,UAAUf,MAAM,EAAEiC,WAC1BtC,eACEoB,UAAUf,MAAM,EAChBiC,SACAzB,SAASO,SAAS,CAACf,MAAM,EACzBQ,SAASiD,KAAK,EACdjD,SAASsD,OAAO;IAE1B,OAAO;QACL/C;QACA0C,OAAOxB;QACPG,QAAQ2B,gBAAgB3B,UAAU,EAAE;QACpC0B,SAAS;YACP,GAAG3B,KAAK;YACRtB,YAAYtB,gBACV4C,MAAMzB,SAAS,EACfX,cAAcgB,UAAUf,MAAM,GAC9BQ,aAAaG,YACTA,YACA;gBAAEC,MAAMJ,SAASsD,OAAO,CAACpD,SAAS;gBAAEG,YAAYL,SAASsD,OAAO,CAACjD,UAAU;YAAC;QAEpF;IACF;AACF;AAEA,SAASmD,QAAQ7B,KAAY,EAAEN,IAAY;IACzC,OAAOM,MAAMzB,SAAS,CAACmB,KAAK,KAAKlB,aAAawB,MAAMhB,aAAa,CAAC8C,QAAQ,CAACpC;AAC7E;AAEA,SAASqC,MAAM/B,KAAY,EAAEgC,aAAsC;IACjE,MAAMC,SAAS,IAAI9B;IACnB,MAAM+B,aAAa,CAACxC;QAClB,IAAI,CAACuC,OAAOE,GAAG,CAACzC,OAAO;YACrB,MAAMjB,OAAOuB,MAAMzB,SAAS,CAACmB,KAAK;YAClC,MAAM0C,SAAS3D,SAASD,YAAY,OAAOtB,MAAMuB,MAAMiB;YACvDuC,OAAOI,GAAG,CAAC3C,MAAM0C,QAAQE,OAAO,OAAOF,OAAOG,QAAQ,GAAG;QAC3D;QACA,OAAON,OAAOvB,GAAG,CAAChB,SAAS;IAC7B;IACA,OAAOsC,cAAcQ,KAAK,CAAC,CAACC;QAC1B,MAAM/C,OAAO+C,aAAa/C,IAAI;QAC9B,IAAI+C,aAAa9D,IAAI,KAAK,UAAU,OAAO,CAACkD,QAAQ7B,OAAON;QAC3D,IAAI+C,aAAa9D,IAAI,KAAK,WAAW,OAAOkD,QAAQ7B,OAAON;QAC3D,IAAI+C,aAAa9D,IAAI,KAAK,YAAY;YACpC,OAAOkD,QAAQ7B,OAAON,SAASM,MAAMZ,SAAS,CAACM,KAAK,KAAK+C,aAAaC,QAAQ;QAChF;QACA,MAAMH,WAAWL,WAAWxC;QAC5B,IAAI6C,aAAa,MAAM,OAAO;QAC9B,IAAIE,aAAa9D,IAAI,KAAK,SAAS;YACjC,MAAMgE,QAAQnB,OAAOoB,MAAM,CAACL,SAASM,MAAM,EAAEJ,aAAaK,IAAI,IAC1DP,SAASM,MAAM,CAACJ,aAAaK,IAAI,CAAC,GAClCtE;YACJ,OAAOb,WAAWgF,OAAOF,aAAaE,KAAK;QAC7C;QACA,IAAIF,aAAa9D,IAAI,KAAK,WAAW;YACnC,OACE6C,OAAOoB,MAAM,CAACL,SAASQ,QAAQ,EAAEN,aAAaK,IAAI,KAClDP,SAASQ,QAAQ,CAACN,aAAaK,IAAI,CAAC,KAAKL,aAAaE,KAAK;QAE/D;QACA,OAAOJ,SAASS,QAAQ,KAAKP,aAAaE,KAAK;IACjD;AACF;AAEA,SAASM,QAAQnC,MAAc;IAC7B,MAAMpB,OAAOoB,OAAOpB,IAAI;IACxB,IAAIoB,OAAOnC,IAAI,KAAK,WAAWmC,OAAOnC,IAAI,KAAK,aAAamC,OAAOnC,IAAI,KAAK,YAAY;QACtF,OAAO;YAACmC;SAAO;IACjB;IACA,IAAIA,OAAOnC,IAAI,KAAK,YAAY,CAAE,CAAA,aAAamC,MAAK,GAAI;QACtD,OAAO;YACL;gBAAEnC,MAAM;gBAAWe;YAAK;eACrB8B,OAAO0B,OAAO,CAACpC,OAAO+B,MAAM,EAAEzC,GAAG,CAAC,CAAC,CAAC0C,MAAMH,MAAM,GAAoB,CAAA;oBACrEhE,MAAM;oBACNe;oBACAoD;oBACAH;gBACF,CAAA;eACGnB,OAAO0B,OAAO,CAACpC,OAAOiC,QAAQ,EAAE3C,GAAG,CAAC,CAAC,CAAC0C,MAAMH,MAAM,GAAoB,CAAA;oBACvEhE,MAAM;oBACNe;oBACAoD;oBACAH;gBACF,CAAA;SACD;IACH;IACA,IAAI7B,OAAOnC,IAAI,KAAK,QAAQ;QAC1B,OAAO;YACL;gBAAEA,MAAM;gBAAUe;YAAK;YACvB;gBAAEf,MAAM;gBAAWe,MAAMoB,OAAOqC,EAAE;YAAC;SACpC;IACH;IACA,OAAO;QAAC;YAAExE,MAAM;YAAUe;QAAK;KAAE;AACnC;AAEA,SAASyB,MAAMP,OAA0B,EAAEwC,KAAa,EAAE1D,IAAY;IACpE,IAAI2D,KAAK3D;IACT,KAAK,MAAMoB,UAAUF,QAAQ0C,KAAK,CAACF,QAAQ,GAAI;QAC7C,IAAItC,OAAOpB,IAAI,KAAK2D,IAAI;QACxB,IAAIvC,OAAOnC,IAAI,KAAK,UAAU,OAAO;QACrC,IAAImC,OAAOnC,IAAI,KAAK,QAAQ0E,KAAKvC,OAAOqC,EAAE;IAC5C;IACA,OAAOE;AACT;AAEA,OAAO,SAASE,OAAOhD,KAAkB,EAAE3B,SAAyB;IAClE,MAAMoB,QAAQpB,UAAUf,MAAM;IAC9B,OAAO0C,MAAMK,OAAO,CAAC4B,KAAK,CAAC,CAAC1B,QAAQsC;QAClC,IAAItC,OAAOnC,IAAI,KAAK,aAAcmC,OAAOnC,IAAI,KAAK,YAAY,aAAamC,QAAS;YAClF,MAAMuC,KAAKlC,MAAMZ,MAAMK,OAAO,EAAEwC,OAAOtC,OAAOpB,IAAI;YAClD,OAAO2D,OAAO,QAAQrD,MAAMzB,SAAS,CAAC8E,GAAG,KAAKvC,OAAO0C,OAAO;QAC9D;QACA,OAAOP,QAAQnC,QAAQ0B,KAAK,CAAC,CAACiB;YAC5B,IAAIA,OAAO9E,IAAI,KAAK,UAAU,OAAOoD,MAAM/B,OAAO;gBAACyD;aAAO;YAC1D,MAAMJ,KAAKlC,MAAMZ,MAAMK,OAAO,EAAEwC,OAAOK,OAAO/D,IAAI;YAClD,OAAO2D,OAAO,QAAQtB,MAAM/B,OAAO;gBAAC;oBAAE,GAAGyD,MAAM;oBAAE/D,MAAM2D;gBAAG;aAAE;QAC9D;IACF;AACF;AAEA,OAAO,SAASK,YACd9E,SAAyB,EACzB0C,KAA6B,EAC7BqC,YAA6C,EAC7CpC,SAAoB;IAEpB,IAAI,CAACD,MAAMT,IAAI,CAAC8C,eAAe,OAAO,EAAE;IACxC,MAAM5D,cAAcnC,cAAcgB,UAAUf,MAAM;IAClD,IAAImC,QAAepB,UAAUf,MAAM;IACnC,MAAM+F,YAA2B,EAAE;IACnC,KAAK,MAAMrD,SAASe,MAAO;QACzB,IAAIqC,aAAapD,UAAU,CAACwB,MAAM/B,OAAOO,MAAMyB,aAAa,GAAG;YAC7D4B,UAAUxC,IAAI,CAACb;YACf;QACF;QACA,MAAMW,YACJK,cAAc,cAAchB,MAAMK,OAAO,CAACC,IAAI,CAAC,CAACC,SAAWA,OAAOnC,IAAI,KAAK,UACvEjB,kBAAkB6C,OAAO;YACvB,GAAGP,KAAK;YACRtB,YAAYtB,gBAAgB4C,MAAMzB,SAAS,EAAEwB;QAC/C,KACAQ;QACNP,QAAQzC,QAAQyC,OAAO;YAACkB;SAAU;IACpC;IACA,OAAO0C;AACT"}
|
|
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, Unconfirmed } 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 | Unconfirmed;\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 collectionRoot: record.collectionRoot,\n model: record.model,\n selection:\n record.typedSelection === null\n ? null\n : { roots: record.typedSelection.roots, model: record.selectionModel },\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 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 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 old.collection.composition.collectionRoot === composition.collectionRoot &&\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","collectionRoot","model","selection","typedSelection","roots","selectionModel","readConfirmed","previous","read","documents","undefined","text","collection","kind","confirmed","readStaged","status","verdict","binaryTargets","rule","refusal","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","JSON","stringify","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/rows.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type Document } from '@agentshouse/mdmodel';
|
|
2
|
+
import type { HeadChange } from './adapter.js';
|
|
2
3
|
import { type Composition } from './collection.js';
|
|
3
4
|
type Fields = Readonly<Record<string, unknown>>;
|
|
4
5
|
export type DocumentRow = {
|
|
@@ -12,6 +13,7 @@ export type DocumentRow = {
|
|
|
12
13
|
sizes: Readonly<Record<string, number>>;
|
|
13
14
|
directories: readonly string[];
|
|
14
15
|
body: string;
|
|
16
|
+
change: HeadChange | null;
|
|
15
17
|
};
|
|
16
18
|
export type BodyRow = {
|
|
17
19
|
key: string;
|
|
@@ -34,6 +36,6 @@ export type ReferenceRow = {
|
|
|
34
36
|
};
|
|
35
37
|
export type Row = DocumentRow | BodyRow | ReferenceRow;
|
|
36
38
|
export declare function documentKey(room: string, path: string): string;
|
|
37
|
-
export declare function rowsOf(room: string, path: string, document: Document | null, composition: Composition): readonly Row[];
|
|
39
|
+
export declare function rowsOf(room: string, path: string, document: Document | null, composition: Composition, change: HeadChange | null): readonly Row[];
|
|
38
40
|
export {};
|
|
39
41
|
//# sourceMappingURL=rows.d.ts.map
|
package/dist/rows.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rows.d.ts","sourceRoot":"","sources":["../src/rows.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,QAAQ,EAAkB,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9D,KAAK,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEhD,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACxC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"rows.d.ts","sourceRoot":"","sources":["../src/rows.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,QAAQ,EAAkB,MAAM,sBAAsB,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9D,KAAK,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEhD,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACxC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,GAAG,GAAG,WAAW,GAAG,OAAO,GAAG,YAAY,CAAC;AAMvD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9D;AAqBD,wBAAgB,MAAM,CACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,QAAQ,GAAG,IAAI,EACzB,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,UAAU,GAAG,IAAI,GACxB,SAAS,GAAG,EAAE,CAsEhB"}
|
package/dist/rows.js
CHANGED
|
@@ -25,7 +25,7 @@ function directoriesOf(path) {
|
|
|
25
25
|
...parts.map((_, index)=>parts.slice(0, index + 1).join('/'))
|
|
26
26
|
];
|
|
27
27
|
}
|
|
28
|
-
export function rowsOf(room, path, document, composition) {
|
|
28
|
+
export function rowsOf(room, path, document, composition, change) {
|
|
29
29
|
const key = documentKey(room, path);
|
|
30
30
|
const body = keyOf('b', room, path);
|
|
31
31
|
if (document === null || !path.endsWith('.md')) {
|
|
@@ -40,7 +40,8 @@ export function rowsOf(room, path, document, composition) {
|
|
|
40
40
|
values: {},
|
|
41
41
|
sizes: {},
|
|
42
42
|
directories: directoriesOf(path),
|
|
43
|
-
body
|
|
43
|
+
body,
|
|
44
|
+
change
|
|
44
45
|
}
|
|
45
46
|
];
|
|
46
47
|
}
|
|
@@ -82,7 +83,8 @@ export function rowsOf(room, path, document, composition) {
|
|
|
82
83
|
values,
|
|
83
84
|
sizes,
|
|
84
85
|
directories: directoriesOf(path),
|
|
85
|
-
body
|
|
86
|
+
body,
|
|
87
|
+
change
|
|
86
88
|
},
|
|
87
89
|
{
|
|
88
90
|
key: body,
|
package/dist/rows.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/workspace/packages/mdruntime/src/rows.ts"],"sourcesContent":["import { target, type Document, type FieldSpec } from '@agentshouse/mdmodel';\nimport { governing, type Composition } from './collection.js';\nimport { definitionOf } from './model.js';\n\ntype Fields = Readonly<Record<string, unknown>>;\n\nexport type DocumentRow = {\n key: string;\n kind: 'document';\n room: string;\n path: string;\n type: string | null;\n fields: Fields;\n values: Fields;\n sizes: Readonly<Record<string, number>>;\n directories: readonly string[];\n body: string;\n};\n\nexport type BodyRow = {\n key: string;\n kind: 'body';\n room: string;\n path: string;\n preamble: string;\n sections: Readonly<Record<string, string>>;\n markdown: string;\n};\n\nexport type ReferenceRow = {\n key: string;\n kind: 'reference';\n room: string;\n source: string;\n target: string;\n field: string;\n path: string;\n type: string;\n};\n\nexport type Row = DocumentRow | BodyRow | ReferenceRow;\n\nfunction keyOf(...parts: readonly string[]): string {\n return `${parts.join('\\u0000')}\\u0000`;\n}\n\nexport function documentKey(room: string, path: string): string {\n return keyOf('d', room, path);\n}\n\nfunction referenceField(spec: FieldSpec | undefined): boolean {\n return spec?.kind === 'reference' || (spec?.kind === 'list' && spec.of.kind === 'reference');\n}\n\nfunction targetOf(path: string, value: unknown): string | null {\n return typeof value === 'string' ? target(path, value) : null;\n}\n\nfunction resolved(path: string, value: unknown): unknown {\n if (value === null) return null;\n if (!Array.isArray(value)) return targetOf(path, value) ?? undefined;\n return value.map((item) => targetOf(path, item)).filter((item) => item !== null);\n}\n\nfunction directoriesOf(path: string): readonly string[] {\n const parts = path.split('/').slice(0, -1);\n return ['', ...parts.map((_, index) => parts.slice(0, index + 1).join('/'))];\n}\n\nexport function rowsOf(\n room: string,\n path: string,\n document: Document | null,\n composition: Composition,\n): readonly Row[] {\n const key = documentKey(room, path);\n const body = keyOf('b', room, path);\n if (document === null || !path.endsWith('.md')) {\n return [\n {\n key,\n kind: 'document',\n room,\n path,\n type: null,\n fields: {},\n values: {},\n sizes: {},\n directories: directoriesOf(path),\n body,\n },\n ];\n }\n const type = document.type ?? 'any';\n const definition = definitionOf(governing(composition, path), document.type);\n const values: Record<string, unknown> = {};\n const sizes: Record<string, number> = {};\n const references: ReferenceRow[] = [];\n for (const [name, value] of Object.entries(document.fields)) {\n const reference = referenceField(definition?.fields[name]);\n const compared = reference ? resolved(path, value) : value;\n if (compared !== undefined) values[name] = compared;\n if (Array.isArray(value)) sizes[name] = value.length;\n if (!reference) continue;\n const targets = [compared].flat().filter((found) => typeof found === 'string');\n for (const found of new Set(targets)) {\n references.push({\n key: keyOf('r', room, path, name, found),\n kind: 'reference',\n room,\n source: key,\n target: documentKey(room, found),\n field: name,\n path,\n type,\n });\n }\n }\n return [\n {\n key,\n kind: 'document',\n room,\n path,\n type,\n fields: document.fields,\n values,\n sizes,\n directories: directoriesOf(path),\n body,\n },\n {\n key: body,\n kind: 'body',\n room,\n path,\n preamble: document.preamble,\n sections: document.sections,\n markdown: document.content,\n },\n ...references,\n ];\n}\n"],"names":["target","governing","definitionOf","keyOf","parts","join","documentKey","room","path","referenceField","spec","kind","of","targetOf","value","resolved","Array","isArray","undefined","map","item","filter","directoriesOf","split","slice","_","index","rowsOf","document","composition","key","body","endsWith","type","fields","values","sizes","directories","definition","references","name","Object","entries","reference","compared","length","targets","flat","found","Set","push","source","field","preamble","sections","markdown","content"],"mappings":"AAAA,SAASA,MAAM,QAAuC,uBAAuB;
|
|
1
|
+
{"version":3,"sources":["/workspace/packages/mdruntime/src/rows.ts"],"sourcesContent":["import { target, type Document, type FieldSpec } from '@agentshouse/mdmodel';\nimport type { HeadChange } from './adapter.js';\nimport { governing, type Composition } from './collection.js';\nimport { definitionOf } from './model.js';\n\ntype Fields = Readonly<Record<string, unknown>>;\n\nexport type DocumentRow = {\n key: string;\n kind: 'document';\n room: string;\n path: string;\n type: string | null;\n fields: Fields;\n values: Fields;\n sizes: Readonly<Record<string, number>>;\n directories: readonly string[];\n body: string;\n change: HeadChange | null;\n};\n\nexport type BodyRow = {\n key: string;\n kind: 'body';\n room: string;\n path: string;\n preamble: string;\n sections: Readonly<Record<string, string>>;\n markdown: string;\n};\n\nexport type ReferenceRow = {\n key: string;\n kind: 'reference';\n room: string;\n source: string;\n target: string;\n field: string;\n path: string;\n type: string;\n};\n\nexport type Row = DocumentRow | BodyRow | ReferenceRow;\n\nfunction keyOf(...parts: readonly string[]): string {\n return `${parts.join('\\u0000')}\\u0000`;\n}\n\nexport function documentKey(room: string, path: string): string {\n return keyOf('d', room, path);\n}\n\nfunction referenceField(spec: FieldSpec | undefined): boolean {\n return spec?.kind === 'reference' || (spec?.kind === 'list' && spec.of.kind === 'reference');\n}\n\nfunction targetOf(path: string, value: unknown): string | null {\n return typeof value === 'string' ? target(path, value) : null;\n}\n\nfunction resolved(path: string, value: unknown): unknown {\n if (value === null) return null;\n if (!Array.isArray(value)) return targetOf(path, value) ?? undefined;\n return value.map((item) => targetOf(path, item)).filter((item) => item !== null);\n}\n\nfunction directoriesOf(path: string): readonly string[] {\n const parts = path.split('/').slice(0, -1);\n return ['', ...parts.map((_, index) => parts.slice(0, index + 1).join('/'))];\n}\n\nexport function rowsOf(\n room: string,\n path: string,\n document: Document | null,\n composition: Composition,\n change: HeadChange | null,\n): readonly Row[] {\n const key = documentKey(room, path);\n const body = keyOf('b', room, path);\n if (document === null || !path.endsWith('.md')) {\n return [\n {\n key,\n kind: 'document',\n room,\n path,\n type: null,\n fields: {},\n values: {},\n sizes: {},\n directories: directoriesOf(path),\n body,\n change,\n },\n ];\n }\n const type = document.type ?? 'any';\n const definition = definitionOf(governing(composition, path), document.type);\n const values: Record<string, unknown> = {};\n const sizes: Record<string, number> = {};\n const references: ReferenceRow[] = [];\n for (const [name, value] of Object.entries(document.fields)) {\n const reference = referenceField(definition?.fields[name]);\n const compared = reference ? resolved(path, value) : value;\n if (compared !== undefined) values[name] = compared;\n if (Array.isArray(value)) sizes[name] = value.length;\n if (!reference) continue;\n const targets = [compared].flat().filter((found) => typeof found === 'string');\n for (const found of new Set(targets)) {\n references.push({\n key: keyOf('r', room, path, name, found),\n kind: 'reference',\n room,\n source: key,\n target: documentKey(room, found),\n field: name,\n path,\n type,\n });\n }\n }\n return [\n {\n key,\n kind: 'document',\n room,\n path,\n type,\n fields: document.fields,\n values,\n sizes,\n directories: directoriesOf(path),\n body,\n change,\n },\n {\n key: body,\n kind: 'body',\n room,\n path,\n preamble: document.preamble,\n sections: document.sections,\n markdown: document.content,\n },\n ...references,\n ];\n}\n"],"names":["target","governing","definitionOf","keyOf","parts","join","documentKey","room","path","referenceField","spec","kind","of","targetOf","value","resolved","Array","isArray","undefined","map","item","filter","directoriesOf","split","slice","_","index","rowsOf","document","composition","change","key","body","endsWith","type","fields","values","sizes","directories","definition","references","name","Object","entries","reference","compared","length","targets","flat","found","Set","push","source","field","preamble","sections","markdown","content"],"mappings":"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"}
|
package/dist/store.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ModelState } from './model.js';
|
|
2
|
-
import type { Capability, Discovery, OperationScopes, ProviderLimit, ReplicaAdmission, TypedSelection } from './adapter.js';
|
|
2
|
+
import type { Capability, Discovery, HeadChange, OperationScopes, ProviderLimit, ReplicaAdmission, TypedSelection } from './adapter.js';
|
|
3
3
|
import type { AcceptedMessage } from './adapter.js';
|
|
4
4
|
import type { ChangeBatch } from './change.js';
|
|
5
5
|
import type { ChatDraftFile } from './file.js';
|
|
@@ -20,6 +20,7 @@ export type ReplicaRecord = {
|
|
|
20
20
|
documents: Readonly<Record<string, string>>;
|
|
21
21
|
binaryTargets: readonly string[];
|
|
22
22
|
revisions: Readonly<Record<string, string>>;
|
|
23
|
+
changes: Readonly<Record<string, HeadChange>>;
|
|
23
24
|
};
|
|
24
25
|
export type PendingState = {
|
|
25
26
|
readonly drafts: readonly SavedDraft[];
|
package/dist/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EACV,UAAU,EACV,SAAS,EACT,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,cAAc,EACf,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|