@agentshouse/mdruntime 0.1.0-alpha.27 → 0.1.0-alpha.29
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 +4 -3
- package/dist/paths.d.ts +0 -2
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +0 -12
- package/dist/paths.js.map +1 -1
- package/dist/read-side.d.ts.map +1 -1
- package/dist/read-side.js +2 -0
- package/dist/read-side.js.map +1 -1
- package/dist/room-draft.d.ts +4 -4
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +5 -2
- package/dist/room-draft.js.map +1 -1
- package/dist/rows.d.ts +1 -1
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +1 -1
- package/dist/rows.js.map +1 -1
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +12 -12
- package/dist/save.js.map +1 -1
- package/package.json +2 -2
package/AGENTS.md
CHANGED
|
@@ -111,7 +111,8 @@ the revision you read, or `null` when there was none, and every part it should
|
|
|
111
111
|
now change: fields, sections and the preamble, or the whole Markdown, a
|
|
112
112
|
creation, a move, or a removal. A part new to the Room Draft names its base,
|
|
113
113
|
the value you showed when it was opened; the MD Runtime keeps a part's first
|
|
114
|
-
base. A
|
|
114
|
+
base. A binary link target has a Room Draft too, for a move or a removal, with
|
|
115
|
+
`null` as its base. A write or a discard from an older revision is refused as `stale` with
|
|
115
116
|
the current Room Draft; read it and write again.
|
|
116
117
|
|
|
117
118
|
Save takes one Room and the Room Drafts of it to save, each with its revision,
|
|
@@ -119,8 +120,8 @@ validates locally, and on success appends one Change Batch to that Room's
|
|
|
119
120
|
queue and removes those Room Drafts. It is refused as `stale`, as
|
|
120
121
|
`changed-underneath` naming each part whose base no longer matches the visible
|
|
121
122
|
state, or by a local validation rule, and then creates nothing and leaves every
|
|
122
|
-
Room Draft in place. A directory move is a move part on
|
|
123
|
-
it, saved together.
|
|
123
|
+
Room Draft in place. A directory move or removal is a move or removal part on
|
|
124
|
+
each Document and binary link target beneath it, saved together.
|
|
124
125
|
|
|
125
126
|
Outcomes follow the Provider's answer. Accepted advances the confirmed
|
|
126
127
|
layer. Conflicted and Rejected, an expired outcome record, and a change that no
|
package/dist/paths.d.ts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
export declare function normalize(path: string): string | null;
|
|
2
|
-
export declare function resolve(from: string, reference: string): string | null;
|
|
3
|
-
export declare function target(from: string, href: string): string | null;
|
|
4
2
|
export declare function relative(from: string, target: string): string;
|
|
5
3
|
export declare function beneath(prefix: string, path: string): boolean;
|
|
6
4
|
export declare function covered(prefixes: readonly string[], path: string): boolean;
|
package/dist/paths.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAKA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYrD;AAED,wBAAgB,
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAKA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYrD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAW7D;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAK1E"}
|
package/dist/paths.js
CHANGED
|
@@ -15,18 +15,6 @@ export function normalize(path) {
|
|
|
15
15
|
}
|
|
16
16
|
return parts.join('/');
|
|
17
17
|
}
|
|
18
|
-
export function resolve(from, reference) {
|
|
19
|
-
const base = dirname(from);
|
|
20
|
-
return normalize(base === '' ? reference : `${base}/${reference}`);
|
|
21
|
-
}
|
|
22
|
-
export function target(from, href) {
|
|
23
|
-
const trimmed = href.trim();
|
|
24
|
-
if (trimmed.startsWith('/') || /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(trimmed)) return null;
|
|
25
|
-
const bare = trimmed.replace(/[?#].*$/, '');
|
|
26
|
-
if (bare === '') return null;
|
|
27
|
-
const resolved = resolve(from, bare);
|
|
28
|
-
return resolved === '' ? null : resolved;
|
|
29
|
-
}
|
|
30
18
|
export function relative(from, target) {
|
|
31
19
|
const base = dirname(from).split('/').filter((part)=>part !== '');
|
|
32
20
|
const parts = target.split('/');
|
package/dist/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/workspace/packages/mdruntime/src/paths.ts"],"sourcesContent":["function dirname(path: string): string {\n const index = path.lastIndexOf('/');\n return index === -1 ? '' : path.slice(0, index);\n}\n\nexport function normalize(path: string): string | null {\n const parts: string[] = [];\n for (const part of path.split('/')) {\n if (part === '' || part === '.') continue;\n if (part === '..') {\n if (parts.length === 0) return null;\n parts.pop();\n continue;\n }\n parts.push(part);\n }\n return parts.join('/');\n}\n\nexport function
|
|
1
|
+
{"version":3,"sources":["/workspace/packages/mdruntime/src/paths.ts"],"sourcesContent":["function dirname(path: string): string {\n const index = path.lastIndexOf('/');\n return index === -1 ? '' : path.slice(0, index);\n}\n\nexport function normalize(path: string): string | null {\n const parts: string[] = [];\n for (const part of path.split('/')) {\n if (part === '' || part === '.') continue;\n if (part === '..') {\n if (parts.length === 0) return null;\n parts.pop();\n continue;\n }\n parts.push(part);\n }\n return parts.join('/');\n}\n\nexport function relative(from: string, target: string): string {\n const base = dirname(from)\n .split('/')\n .filter((part) => part !== '');\n const parts = target.split('/');\n let shared = 0;\n while (shared < base.length && shared + 1 < parts.length && base[shared] === parts[shared]) {\n shared += 1;\n }\n const up = Array.from({ length: base.length - shared }, () => '..');\n return [...up, ...parts.slice(shared)].join('/');\n}\n\nexport function beneath(prefix: string, path: string): boolean {\n return path === prefix || path.startsWith(`${prefix}/`);\n}\n\nexport function covered(prefixes: readonly string[], path: string): boolean {\n return prefixes.some((prefix) => {\n const normalized = normalize(prefix);\n return normalized !== null && (normalized === '' || beneath(normalized, path));\n });\n}\n"],"names":["dirname","path","index","lastIndexOf","slice","normalize","parts","part","split","length","pop","push","join","relative","from","target","base","filter","shared","up","Array","beneath","prefix","startsWith","covered","prefixes","some","normalized"],"mappings":"AAAA,SAASA,QAAQC,IAAY;IAC3B,MAAMC,QAAQD,KAAKE,WAAW,CAAC;IAC/B,OAAOD,UAAU,CAAC,IAAI,KAAKD,KAAKG,KAAK,CAAC,GAAGF;AAC3C;AAEA,OAAO,SAASG,UAAUJ,IAAY;IACpC,MAAMK,QAAkB,EAAE;IAC1B,KAAK,MAAMC,QAAQN,KAAKO,KAAK,CAAC,KAAM;QAClC,IAAID,SAAS,MAAMA,SAAS,KAAK;QACjC,IAAIA,SAAS,MAAM;YACjB,IAAID,MAAMG,MAAM,KAAK,GAAG,OAAO;YAC/BH,MAAMI,GAAG;YACT;QACF;QACAJ,MAAMK,IAAI,CAACJ;IACb;IACA,OAAOD,MAAMM,IAAI,CAAC;AACpB;AAEA,OAAO,SAASC,SAASC,IAAY,EAAEC,MAAc;IACnD,MAAMC,OAAOhB,QAAQc,MAClBN,KAAK,CAAC,KACNS,MAAM,CAAC,CAACV,OAASA,SAAS;IAC7B,MAAMD,QAAQS,OAAOP,KAAK,CAAC;IAC3B,IAAIU,SAAS;IACb,MAAOA,SAASF,KAAKP,MAAM,IAAIS,SAAS,IAAIZ,MAAMG,MAAM,IAAIO,IAAI,CAACE,OAAO,KAAKZ,KAAK,CAACY,OAAO,CAAE;QAC1FA,UAAU;IACZ;IACA,MAAMC,KAAKC,MAAMN,IAAI,CAAC;QAAEL,QAAQO,KAAKP,MAAM,GAAGS;IAAO,GAAG,IAAM;IAC9D,OAAO;WAAIC;WAAOb,MAAMF,KAAK,CAACc;KAAQ,CAACN,IAAI,CAAC;AAC9C;AAEA,OAAO,SAASS,QAAQC,MAAc,EAAErB,IAAY;IAClD,OAAOA,SAASqB,UAAUrB,KAAKsB,UAAU,CAAC,GAAGD,OAAO,CAAC,CAAC;AACxD;AAEA,OAAO,SAASE,QAAQC,QAA2B,EAAExB,IAAY;IAC/D,OAAOwB,SAASC,IAAI,CAAC,CAACJ;QACpB,MAAMK,aAAatB,UAAUiB;QAC7B,OAAOK,eAAe,QAASA,CAAAA,eAAe,MAAMN,QAAQM,YAAY1B,KAAI;IAC9E;AACF"}
|
package/dist/read-side.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-side.d.ts","sourceRoot":"","sources":["../src/read-side.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAU,KAAK,WAAW,EAAE,KAAK,WAAW,EAAe,MAAM,kBAAkB,CAAC;AAC3F,OAAO,KAAK,EAOV,IAAI,EAGJ,WAAW,EAIZ,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAoDpD,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACxC,KAAK,CACH,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,KAAK,IAAI,GACpD,MAAM,IAAI,CAAC;IACd,SAAS,IAAI,SAAS,gBAAgB,EAAE,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAAC;IAC9D,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AA+RF,wBAAgB,cAAc,IAAI,QAAQ,
|
|
1
|
+
{"version":3,"file":"read-side.d.ts","sourceRoot":"","sources":["../src/read-side.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAU,KAAK,WAAW,EAAE,KAAK,WAAW,EAAe,MAAM,kBAAkB,CAAC;AAC3F,OAAO,KAAK,EAOV,IAAI,EAGJ,WAAW,EAIZ,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAoDpD,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACxC,KAAK,CACH,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,KAAK,IAAI,GACpD,MAAM,IAAI,CAAC;IACd,SAAS,IAAI,SAAS,gBAAgB,EAAE,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAAC;IAC9D,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AA+RF,wBAAgB,cAAc,IAAI,QAAQ,CA0HzC"}
|
package/dist/read-side.js
CHANGED
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;\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, [...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'] {\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 = query.innerJoin({ 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 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,\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 publish(observed);\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.filter((row) => row.kind === 'document').map(searched);\n },\n document(room, path) {\n const row = rows.get(documentKey(room, path));\n return row === undefined ? 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","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","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 { 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;\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, [...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'] {\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 = query.innerJoin({ 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 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,\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.filter((row) => row.kind === 'document').map(searched);\n },\n document(room, path) {\n const row = rows.get(documentKey(room, path));\n return row === undefined ? 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","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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"}
|
package/dist/room-draft.d.ts
CHANGED
|
@@ -31,10 +31,10 @@ export type RoomDraftParts = {
|
|
|
31
31
|
readonly creation?: RoomDraftCreation;
|
|
32
32
|
readonly move?: {
|
|
33
33
|
readonly to: string;
|
|
34
|
-
readonly base?: string;
|
|
34
|
+
readonly base?: string | null;
|
|
35
35
|
};
|
|
36
36
|
readonly removal?: {
|
|
37
|
-
readonly base?: string;
|
|
37
|
+
readonly base?: string | null;
|
|
38
38
|
};
|
|
39
39
|
};
|
|
40
40
|
type HeldParts = {
|
|
@@ -57,10 +57,10 @@ type HeldParts = {
|
|
|
57
57
|
readonly creation?: RoomDraftCreation;
|
|
58
58
|
readonly move?: {
|
|
59
59
|
readonly to: string;
|
|
60
|
-
readonly base: string;
|
|
60
|
+
readonly base: string | null;
|
|
61
61
|
};
|
|
62
62
|
readonly removal?: {
|
|
63
|
-
readonly base: string;
|
|
63
|
+
readonly base: string | null;
|
|
64
64
|
};
|
|
65
65
|
};
|
|
66
66
|
type ChangedUnderneath = {
|
package/dist/room-draft.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"room-draft.d.ts","sourceRoot":"","sources":["../src/room-draft.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAAC;AAE5D,MAAM,MAAM,iBAAiB,GACzB;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACrD,GACD;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CACxB,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAA;KAAE,CAAC,CACxE,CAAC;IACF,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IACjG,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACvE,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACvE,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"room-draft.d.ts","sourceRoot":"","sources":["../src/room-draft.ts"],"names":[],"mappings":"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"}
|
package/dist/room-draft.js
CHANGED
|
@@ -16,6 +16,9 @@ function text(value) {
|
|
|
16
16
|
function optionalText(value) {
|
|
17
17
|
return value === undefined ? undefined : text(value);
|
|
18
18
|
}
|
|
19
|
+
function markdownBase(value) {
|
|
20
|
+
return value === null ? null : optionalText(value);
|
|
21
|
+
}
|
|
19
22
|
function entries(value, each) {
|
|
20
23
|
if (!plain(value)) malformed();
|
|
21
24
|
const read = {};
|
|
@@ -84,7 +87,7 @@ export function readParts(value) {
|
|
|
84
87
|
if (value.creation !== undefined) parts.creation = creationOf(value.creation);
|
|
85
88
|
if (value.move !== undefined) {
|
|
86
89
|
if (!plain(value.move)) malformed();
|
|
87
|
-
const base =
|
|
90
|
+
const base = markdownBase(value.move.base);
|
|
88
91
|
parts.move = {
|
|
89
92
|
to: text(value.move.to),
|
|
90
93
|
...base === undefined ? {} : {
|
|
@@ -94,7 +97,7 @@ export function readParts(value) {
|
|
|
94
97
|
}
|
|
95
98
|
if (value.removal !== undefined) {
|
|
96
99
|
if (!plain(value.removal)) malformed();
|
|
97
|
-
const base =
|
|
100
|
+
const base = markdownBase(value.removal.base);
|
|
98
101
|
parts.removal = base === undefined ? {} : {
|
|
99
102
|
base
|
|
100
103
|
};
|
package/dist/room-draft.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/workspace/packages/mdruntime/src/room-draft.ts"],"sourcesContent":["import { apply, parse, serialize } from '@agentshouse/mdmodel';\nimport type { ProviderRefusal } from './adapter.js';\nimport type { Change, Precondition } from './change.js';\nimport { normalize } from './paths.js';\nimport type { VisibleLayer } from './replica.js';\n\nexport type FieldValue = { readonly value: unknown } | null;\n\nexport type RoomDraftCreation =\n | {\n readonly type: string;\n readonly fields: Readonly<Record<string, unknown>>;\n readonly sections: Readonly<Record<string, string>>;\n }\n | { readonly markdown: string };\n\nexport type RoomDraftParts = {\n readonly fields?: Readonly<\n Record<string, { readonly value: unknown; readonly base?: FieldValue }>\n >;\n readonly sections?: Readonly<Record<string, { readonly value: string; readonly base?: string }>>;\n readonly preamble?: { readonly value: string; readonly base?: string };\n readonly markdown?: { readonly value: string; readonly base?: string };\n readonly creation?: RoomDraftCreation;\n readonly move?: { readonly to: string; readonly base?: string };\n readonly removal?: { readonly base?: string };\n};\n\ntype HeldParts = {\n readonly fields?: Readonly<\n Record<string, { readonly value: unknown; readonly base: FieldValue }>\n >;\n readonly sections?: Readonly<Record<string, { readonly value: string; readonly base: string }>>;\n readonly preamble?: { readonly value: string; readonly base: string };\n readonly markdown?: { readonly value: string; readonly base: string };\n readonly creation?: RoomDraftCreation;\n readonly move?: { readonly to: string; readonly base: string };\n readonly removal?: { readonly base: string };\n};\n\ntype ChangedUnderneath = {\n readonly fields?: Readonly<Record<string, FieldValue>>;\n readonly sections?: Readonly<Record<string, string | null>>;\n readonly preamble?: string | null;\n readonly markdown?: string | null;\n readonly creation?: string;\n readonly move?: string | null;\n readonly removal?: string | null;\n};\n\nexport type ReturnReason =\n | (ProviderRefusal & { readonly kind: 'conflicted' | 'rejected' })\n | { readonly kind: 'expired' }\n | { readonly kind: 'withdrawn' };\n\nexport type RoomDraft = {\n readonly room: string;\n readonly path: string;\n readonly revision: string;\n readonly parts: HeldParts;\n readonly changedUnderneath: ChangedUnderneath;\n readonly returned: ReturnReason | null;\n};\n\nexport type RoomDraftWrite =\n | { readonly outcome: 'written'; readonly roomDraft: RoomDraft | null }\n | { readonly outcome: 'stale'; readonly current: RoomDraft | null };\n\nexport type ChangedPart = {\n readonly path: string;\n readonly part: 'field' | 'section' | 'preamble' | 'markdown' | 'creation' | 'move' | 'removal';\n readonly name?: string;\n};\n\nexport type RoomDraftRecord = {\n readonly locator: string;\n readonly path: string;\n readonly revision: string;\n readonly parts: HeldParts;\n readonly returned: ReturnReason | null;\n};\n\nexport type SavedDraft = { readonly path: string; readonly parts: HeldParts };\n\nfunction malformed(): never {\n throw new Error('room-draft-malformed');\n}\n\nfunction plain(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction frontmatterValue(value: unknown): boolean {\n if (Array.isArray(value)) return value.every(frontmatterValue);\n return (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'boolean' ||\n (typeof value === 'number' && Number.isFinite(value))\n );\n}\n\nfunction text(value: unknown): string {\n return typeof value === 'string' ? value : malformed();\n}\n\nfunction optionalText(value: unknown): string | undefined {\n return value === undefined ? undefined : text(value);\n}\n\nfunction entries<T>(value: unknown, each: (item: unknown) => T): Readonly<Record<string, T>> {\n if (!plain(value)) malformed();\n const read: Record<string, T> = {};\n for (const [name, item] of Object.entries(value)) read[name] = each(item);\n return read;\n}\n\nfunction fieldValue(value: unknown): FieldValue {\n if (value === null) return null;\n if (!plain(value) || !Object.hasOwn(value, 'value') || !frontmatterValue(value.value)) {\n malformed();\n }\n return { value: value.value };\n}\n\nfunction textPart(value: unknown): { value: string; base?: string } {\n if (!plain(value)) malformed();\n const base = optionalText(value.base);\n return { value: text(value.value), ...(base === undefined ? {} : { base }) };\n}\n\nfunction creationOf(value: unknown): RoomDraftCreation {\n if (!plain(value)) malformed();\n if (Object.hasOwn(value, 'markdown')) return { markdown: text(value.markdown) };\n const fields = entries(value.fields, (item) => (frontmatterValue(item) ? item : malformed()));\n return { type: text(value.type), fields, sections: entries(value.sections, text) };\n}\n\nconst PART_NAMES = new Set([\n 'fields',\n 'sections',\n 'preamble',\n 'markdown',\n 'creation',\n 'move',\n 'removal',\n]);\n\nexport function readParts(value: unknown): RoomDraftParts {\n if (!plain(value) || Object.keys(value).some((name) => !PART_NAMES.has(name))) malformed();\n const parts: { -readonly [Name in keyof RoomDraftParts]: RoomDraftParts[Name] } = {};\n if (value.fields !== undefined) {\n parts.fields = entries(value.fields, (item) => {\n if (!plain(item) || !Object.hasOwn(item, 'value') || !frontmatterValue(item.value)) {\n malformed();\n }\n return item.base === undefined\n ? { value: item.value }\n : { value: item.value, base: fieldValue(item.base) };\n });\n }\n if (value.sections !== undefined) parts.sections = entries(value.sections, textPart);\n if (value.preamble !== undefined) parts.preamble = textPart(value.preamble);\n if (value.markdown !== undefined) parts.markdown = textPart(value.markdown);\n if (value.creation !== undefined) parts.creation = creationOf(value.creation);\n if (value.move !== undefined) {\n if (!plain(value.move)) malformed();\n const base = optionalText(value.move.base);\n parts.move = { to: text(value.move.to), ...(base === undefined ? {} : { base }) };\n }\n if (value.removal !== undefined) {\n if (!plain(value.removal)) malformed();\n const base = optionalText(value.removal.base);\n parts.removal = base === undefined ? {} : { base };\n }\n return parts;\n}\n\nfunction named<T>(record: Readonly<Record<string, T>> | undefined): readonly [string, T][] {\n return Object.entries(record ?? {});\n}\n\nfunction own<T>(record: Readonly<Record<string, T>> | undefined, name: string): T | undefined {\n return record !== undefined && Object.hasOwn(record, name) ? record[name] : undefined;\n}\n\nfunction kept<T>(prior: { readonly base: T } | undefined, base: T | undefined): T {\n if (prior !== undefined) return prior.base;\n if (base === undefined) throw new Error('room-draft-base-missing');\n return base;\n}\n\nfunction editsText(parts: RoomDraftParts): boolean {\n return (\n parts.preamble !== undefined ||\n named(parts.fields).length > 0 ||\n named(parts.sections).length > 0\n );\n}\n\nexport function held(current: HeldParts | undefined, parts: RoomDraftParts): HeldParts {\n if (parts.markdown !== undefined && editsText(parts)) {\n throw new Error('room-draft-markdown-exclusive');\n }\n const next: { -readonly [Name in keyof HeldParts]: HeldParts[Name] } = {};\n const fields = named(parts.fields);\n if (fields.length > 0) {\n next.fields = Object.fromEntries(\n fields.map(([name, part]) => [\n name,\n { value: part.value, base: kept(own(current?.fields, name), part.base) },\n ]),\n );\n }\n const sections = named(parts.sections);\n if (sections.length > 0) {\n next.sections = Object.fromEntries(\n sections.map(([name, part]) => [\n name,\n { value: part.value, base: kept(own(current?.sections, name), part.base) },\n ]),\n );\n }\n if (parts.preamble !== undefined) {\n next.preamble = {\n value: parts.preamble.value,\n base: kept(current?.preamble, parts.preamble.base),\n };\n }\n if (parts.markdown !== undefined) {\n next.markdown = {\n value: parts.markdown.value,\n base: kept(current?.markdown, parts.markdown.base),\n };\n }\n if (parts.creation !== undefined) next.creation = parts.creation;\n if (parts.move !== undefined) {\n next.move = { to: parts.move.to, base: kept(current?.move, parts.move.base) };\n }\n if (parts.removal !== undefined) {\n next.removal = { base: kept(current?.removal, parts.removal.base) };\n }\n if (Object.keys(next).length === 0) throw new Error('room-draft-empty');\n return next;\n}\n\nexport function equalValue(left: unknown, right: unknown): boolean {\n if (left === right) return true;\n return (\n Array.isArray(left) &&\n Array.isArray(right) &&\n left.length === right.length &&\n left.every((item, index) => equalValue(item, right[index]))\n );\n}\n\nfunction sameField(left: FieldValue, right: FieldValue): boolean {\n if (left === null || right === null) return left === right;\n return equalValue(left.value, right.value);\n}\n\nexport function underneath(\n parts: HeldParts,\n path: string,\n visible: VisibleLayer | undefined,\n): ChangedUnderneath {\n const markdown = visible?.documents[path] ?? null;\n const document = visible?.collection.documents[path];\n const report: { -readonly [Name in keyof ChangedUnderneath]: ChangedUnderneath[Name] } = {};\n const fields: Record<string, FieldValue> = {};\n for (const [name, part] of named(parts.fields)) {\n const current =\n document !== undefined && Object.hasOwn(document.fields, name)\n ? { value: document.fields[name] }\n : null;\n if (!sameField(part.base, current)) fields[name] = current;\n }\n if (Object.keys(fields).length > 0) report.fields = fields;\n const sections: Record<string, string | null> = {};\n for (const [name, part] of named(parts.sections)) {\n const current =\n document !== undefined && Object.hasOwn(document.sections, name)\n ? document.sections[name]\n : null;\n if (current !== part.base) sections[name] = current;\n }\n if (Object.keys(sections).length > 0) report.sections = sections;\n const preamble = document?.preamble ?? null;\n if (parts.preamble !== undefined && preamble !== parts.preamble.base) report.preamble = preamble;\n if (parts.markdown !== undefined && markdown !== parts.markdown.base) report.markdown = markdown;\n if (parts.creation !== undefined && markdown !== null) report.creation = markdown;\n if (parts.move !== undefined && markdown !== parts.move.base) report.move = markdown;\n if (parts.removal !== undefined && markdown !== parts.removal.base) report.removal = markdown;\n return report;\n}\n\nexport function changedParts(path: string, report: ChangedUnderneath): readonly ChangedPart[] {\n return [\n ...(report.creation === undefined ? [] : [{ path, part: 'creation' as const }]),\n ...named(report.fields).map(([name]) => ({ path, part: 'field' as const, name })),\n ...named(report.sections).map(([name]) => ({ path, part: 'section' as const, name })),\n ...(report.preamble === undefined ? [] : [{ path, part: 'preamble' as const }]),\n ...(report.markdown === undefined ? [] : [{ path, part: 'markdown' as const }]),\n ...(report.move === undefined ? [] : [{ path, part: 'move' as const }]),\n ...(report.removal === undefined ? [] : [{ path, part: 'removal' as const }]),\n ];\n}\n\nfunction joined<T>(\n existing: Readonly<Record<string, T>> | undefined,\n returned: Readonly<Record<string, T>> | undefined,\n): Readonly<Record<string, T>> | undefined {\n const merged = { ...existing };\n for (const [name, part] of named(returned)) if (!Object.hasOwn(merged, name)) merged[name] = part;\n return Object.keys(merged).length === 0 ? undefined : merged;\n}\n\nfunction ended(text: string): string {\n return text === '' || text.endsWith('\\n') ? text : `${text}\\n`;\n}\n\nfunction frontmatterOf(fields: readonly [string, { readonly value: unknown }][]): string {\n const opened = parse('---\\n---\\n');\n if (!opened.ok) return malformed();\n let document = opened.document;\n for (const [name, part] of fields) {\n const next = apply(document, { kind: 'field', name, value: part.value, prior: undefined });\n if (next.outcome !== 'applied') return malformed();\n document = next.document;\n }\n return serialize(document);\n}\n\nfunction concatenated(markdown: string, parts: HeldParts): string {\n const fields = named(parts.fields);\n const pieces = [\n ...(fields.length === 0 ? [] : [frontmatterOf(fields)]),\n ...(parts.preamble === undefined ? [] : [parts.preamble.value]),\n ...named(parts.sections).map(([name, part]) => `## ${name}\\n${part.value}`),\n ];\n if (pieces.length === 0) return markdown;\n return `${ended(markdown)}\\n${pieces.map(ended).join('')}`;\n}\n\nexport function returnedInto(existing: HeldParts | undefined, returned: HeldParts): HeldParts {\n if (existing === undefined) return returned;\n const next: { -readonly [Name in keyof HeldParts]: HeldParts[Name] } = { ...existing };\n const whole = existing.markdown ?? returned.markdown;\n if (whole === undefined) {\n const fields = joined(existing.fields, returned.fields);\n const sections = joined(existing.sections, returned.sections);\n if (fields !== undefined) next.fields = fields;\n if (sections !== undefined) next.sections = sections;\n const preamble = existing.preamble ?? returned.preamble;\n if (preamble !== undefined) next.preamble = preamble;\n } else {\n delete next.fields;\n delete next.sections;\n delete next.preamble;\n const value = concatenated(whole.value, existing.markdown === undefined ? existing : returned);\n next.markdown = { value, base: whole.base };\n }\n const creation = existing.creation ?? returned.creation;\n const move = existing.move ?? returned.move;\n const removal = existing.removal ?? returned.removal;\n if (creation !== undefined) next.creation = creation;\n if (move !== undefined) next.move = move;\n if (removal !== undefined) next.removal = removal;\n return next;\n}\n\nexport function changesOf(\n path: string,\n parts: HeldParts,\n): { changes: readonly Change[]; bases: readonly Precondition[] } {\n const changes: Change[] = [];\n const bases: Precondition[] = [];\n const creation = parts.creation;\n if (creation !== undefined) {\n changes.push(\n 'markdown' in creation\n ? { kind: 'create', path, content: creation.markdown }\n : {\n kind: 'create',\n path,\n fields: { type: creation.type, ...creation.fields },\n sections: creation.sections,\n },\n );\n }\n for (const [name, part] of named(parts.fields)) {\n changes.push({ kind: 'field', path, name, value: part.value });\n bases.push({ kind: 'field', path, name, value: part.base?.value });\n }\n for (const [name, part] of named(parts.sections)) {\n changes.push({ kind: 'section', path, name, value: part.value });\n bases.push({ kind: 'section', path, name, value: part.base });\n }\n if (parts.preamble !== undefined) {\n changes.push({ kind: 'preamble', path, value: parts.preamble.value });\n bases.push({ kind: 'preamble', path, value: parts.preamble.base });\n }\n if (parts.markdown !== undefined) {\n changes.push({ kind: 'replace', path, content: parts.markdown.value });\n }\n if (parts.move !== undefined) {\n const to = normalize(parts.move.to);\n changes.push({ kind: 'move', path, to: to === null || to === '' ? parts.move.to : to });\n }\n if (parts.removal !== undefined) changes.push({ kind: 'remove', path });\n return { changes, bases };\n}\n"],"names":["apply","parse","serialize","normalize","malformed","Error","plain","value","Array","isArray","frontmatterValue","every","Number","isFinite","text","optionalText","undefined","entries","each","read","name","item","Object","fieldValue","hasOwn","textPart","base","creationOf","markdown","fields","type","sections","PART_NAMES","Set","readParts","keys","some","has","parts","preamble","creation","move","to","removal","named","record","own","kept","prior","editsText","length","held","current","next","fromEntries","map","part","equalValue","left","right","index","sameField","underneath","path","visible","documents","document","collection","report","changedParts","joined","existing","returned","merged","ended","endsWith","frontmatterOf","opened","ok","kind","outcome","concatenated","pieces","join","returnedInto","whole","changesOf","changes","bases","push","content"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/workspace/packages/mdruntime/src/room-draft.ts"],"sourcesContent":["import { apply, parse, serialize } from '@agentshouse/mdmodel';\nimport type { ProviderRefusal } from './adapter.js';\nimport type { Change, Precondition } from './change.js';\nimport { normalize } from './paths.js';\nimport type { VisibleLayer } from './replica.js';\n\nexport type FieldValue = { readonly value: unknown } | null;\n\nexport type RoomDraftCreation =\n | {\n readonly type: string;\n readonly fields: Readonly<Record<string, unknown>>;\n readonly sections: Readonly<Record<string, string>>;\n }\n | { readonly markdown: string };\n\nexport type RoomDraftParts = {\n readonly fields?: Readonly<\n Record<string, { readonly value: unknown; readonly base?: FieldValue }>\n >;\n readonly sections?: Readonly<Record<string, { readonly value: string; readonly base?: string }>>;\n readonly preamble?: { readonly value: string; readonly base?: string };\n readonly markdown?: { readonly value: string; readonly base?: string };\n readonly creation?: RoomDraftCreation;\n readonly move?: { readonly to: string; readonly base?: string | null };\n readonly removal?: { readonly base?: string | null };\n};\n\ntype HeldParts = {\n readonly fields?: Readonly<\n Record<string, { readonly value: unknown; readonly base: FieldValue }>\n >;\n readonly sections?: Readonly<Record<string, { readonly value: string; readonly base: string }>>;\n readonly preamble?: { readonly value: string; readonly base: string };\n readonly markdown?: { readonly value: string; readonly base: string };\n readonly creation?: RoomDraftCreation;\n readonly move?: { readonly to: string; readonly base: string | null };\n readonly removal?: { readonly base: string | null };\n};\n\ntype ChangedUnderneath = {\n readonly fields?: Readonly<Record<string, FieldValue>>;\n readonly sections?: Readonly<Record<string, string | null>>;\n readonly preamble?: string | null;\n readonly markdown?: string | null;\n readonly creation?: string;\n readonly move?: string | null;\n readonly removal?: string | null;\n};\n\nexport type ReturnReason =\n | (ProviderRefusal & { readonly kind: 'conflicted' | 'rejected' })\n | { readonly kind: 'expired' }\n | { readonly kind: 'withdrawn' };\n\nexport type RoomDraft = {\n readonly room: string;\n readonly path: string;\n readonly revision: string;\n readonly parts: HeldParts;\n readonly changedUnderneath: ChangedUnderneath;\n readonly returned: ReturnReason | null;\n};\n\nexport type RoomDraftWrite =\n | { readonly outcome: 'written'; readonly roomDraft: RoomDraft | null }\n | { readonly outcome: 'stale'; readonly current: RoomDraft | null };\n\nexport type ChangedPart = {\n readonly path: string;\n readonly part: 'field' | 'section' | 'preamble' | 'markdown' | 'creation' | 'move' | 'removal';\n readonly name?: string;\n};\n\nexport type RoomDraftRecord = {\n readonly locator: string;\n readonly path: string;\n readonly revision: string;\n readonly parts: HeldParts;\n readonly returned: ReturnReason | null;\n};\n\nexport type SavedDraft = { readonly path: string; readonly parts: HeldParts };\n\nfunction malformed(): never {\n throw new Error('room-draft-malformed');\n}\n\nfunction plain(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction frontmatterValue(value: unknown): boolean {\n if (Array.isArray(value)) return value.every(frontmatterValue);\n return (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'boolean' ||\n (typeof value === 'number' && Number.isFinite(value))\n );\n}\n\nfunction text(value: unknown): string {\n return typeof value === 'string' ? value : malformed();\n}\n\nfunction optionalText(value: unknown): string | undefined {\n return value === undefined ? undefined : text(value);\n}\n\nfunction markdownBase(value: unknown): string | null | undefined {\n return value === null ? null : optionalText(value);\n}\n\nfunction entries<T>(value: unknown, each: (item: unknown) => T): Readonly<Record<string, T>> {\n if (!plain(value)) malformed();\n const read: Record<string, T> = {};\n for (const [name, item] of Object.entries(value)) read[name] = each(item);\n return read;\n}\n\nfunction fieldValue(value: unknown): FieldValue {\n if (value === null) return null;\n if (!plain(value) || !Object.hasOwn(value, 'value') || !frontmatterValue(value.value)) {\n malformed();\n }\n return { value: value.value };\n}\n\nfunction textPart(value: unknown): { value: string; base?: string } {\n if (!plain(value)) malformed();\n const base = optionalText(value.base);\n return { value: text(value.value), ...(base === undefined ? {} : { base }) };\n}\n\nfunction creationOf(value: unknown): RoomDraftCreation {\n if (!plain(value)) malformed();\n if (Object.hasOwn(value, 'markdown')) return { markdown: text(value.markdown) };\n const fields = entries(value.fields, (item) => (frontmatterValue(item) ? item : malformed()));\n return { type: text(value.type), fields, sections: entries(value.sections, text) };\n}\n\nconst PART_NAMES = new Set([\n 'fields',\n 'sections',\n 'preamble',\n 'markdown',\n 'creation',\n 'move',\n 'removal',\n]);\n\nexport function readParts(value: unknown): RoomDraftParts {\n if (!plain(value) || Object.keys(value).some((name) => !PART_NAMES.has(name))) malformed();\n const parts: { -readonly [Name in keyof RoomDraftParts]: RoomDraftParts[Name] } = {};\n if (value.fields !== undefined) {\n parts.fields = entries(value.fields, (item) => {\n if (!plain(item) || !Object.hasOwn(item, 'value') || !frontmatterValue(item.value)) {\n malformed();\n }\n return item.base === undefined\n ? { value: item.value }\n : { value: item.value, base: fieldValue(item.base) };\n });\n }\n if (value.sections !== undefined) parts.sections = entries(value.sections, textPart);\n if (value.preamble !== undefined) parts.preamble = textPart(value.preamble);\n if (value.markdown !== undefined) parts.markdown = textPart(value.markdown);\n if (value.creation !== undefined) parts.creation = creationOf(value.creation);\n if (value.move !== undefined) {\n if (!plain(value.move)) malformed();\n const base = markdownBase(value.move.base);\n parts.move = { to: text(value.move.to), ...(base === undefined ? {} : { base }) };\n }\n if (value.removal !== undefined) {\n if (!plain(value.removal)) malformed();\n const base = markdownBase(value.removal.base);\n parts.removal = base === undefined ? {} : { base };\n }\n return parts;\n}\n\nfunction named<T>(record: Readonly<Record<string, T>> | undefined): readonly [string, T][] {\n return Object.entries(record ?? {});\n}\n\nfunction own<T>(record: Readonly<Record<string, T>> | undefined, name: string): T | undefined {\n return record !== undefined && Object.hasOwn(record, name) ? record[name] : undefined;\n}\n\nfunction kept<T>(prior: { readonly base: T } | undefined, base: T | undefined): T {\n if (prior !== undefined) return prior.base;\n if (base === undefined) throw new Error('room-draft-base-missing');\n return base;\n}\n\nfunction editsText(parts: RoomDraftParts): boolean {\n return (\n parts.preamble !== undefined ||\n named(parts.fields).length > 0 ||\n named(parts.sections).length > 0\n );\n}\n\nexport function held(current: HeldParts | undefined, parts: RoomDraftParts): HeldParts {\n if (parts.markdown !== undefined && editsText(parts)) {\n throw new Error('room-draft-markdown-exclusive');\n }\n const next: { -readonly [Name in keyof HeldParts]: HeldParts[Name] } = {};\n const fields = named(parts.fields);\n if (fields.length > 0) {\n next.fields = Object.fromEntries(\n fields.map(([name, part]) => [\n name,\n { value: part.value, base: kept(own(current?.fields, name), part.base) },\n ]),\n );\n }\n const sections = named(parts.sections);\n if (sections.length > 0) {\n next.sections = Object.fromEntries(\n sections.map(([name, part]) => [\n name,\n { value: part.value, base: kept(own(current?.sections, name), part.base) },\n ]),\n );\n }\n if (parts.preamble !== undefined) {\n next.preamble = {\n value: parts.preamble.value,\n base: kept(current?.preamble, parts.preamble.base),\n };\n }\n if (parts.markdown !== undefined) {\n next.markdown = {\n value: parts.markdown.value,\n base: kept(current?.markdown, parts.markdown.base),\n };\n }\n if (parts.creation !== undefined) next.creation = parts.creation;\n if (parts.move !== undefined) {\n next.move = { to: parts.move.to, base: kept(current?.move, parts.move.base) };\n }\n if (parts.removal !== undefined) {\n next.removal = { base: kept(current?.removal, parts.removal.base) };\n }\n if (Object.keys(next).length === 0) throw new Error('room-draft-empty');\n return next;\n}\n\nexport function equalValue(left: unknown, right: unknown): boolean {\n if (left === right) return true;\n return (\n Array.isArray(left) &&\n Array.isArray(right) &&\n left.length === right.length &&\n left.every((item, index) => equalValue(item, right[index]))\n );\n}\n\nfunction sameField(left: FieldValue, right: FieldValue): boolean {\n if (left === null || right === null) return left === right;\n return equalValue(left.value, right.value);\n}\n\nexport function underneath(\n parts: HeldParts,\n path: string,\n visible: VisibleLayer | undefined,\n): ChangedUnderneath {\n const markdown = visible?.documents[path] ?? null;\n const document = visible?.collection.documents[path];\n const report: { -readonly [Name in keyof ChangedUnderneath]: ChangedUnderneath[Name] } = {};\n const fields: Record<string, FieldValue> = {};\n for (const [name, part] of named(parts.fields)) {\n const current =\n document !== undefined && Object.hasOwn(document.fields, name)\n ? { value: document.fields[name] }\n : null;\n if (!sameField(part.base, current)) fields[name] = current;\n }\n if (Object.keys(fields).length > 0) report.fields = fields;\n const sections: Record<string, string | null> = {};\n for (const [name, part] of named(parts.sections)) {\n const current =\n document !== undefined && Object.hasOwn(document.sections, name)\n ? document.sections[name]\n : null;\n if (current !== part.base) sections[name] = current;\n }\n if (Object.keys(sections).length > 0) report.sections = sections;\n const preamble = document?.preamble ?? null;\n if (parts.preamble !== undefined && preamble !== parts.preamble.base) report.preamble = preamble;\n if (parts.markdown !== undefined && markdown !== parts.markdown.base) report.markdown = markdown;\n if (parts.creation !== undefined && markdown !== null) report.creation = markdown;\n if (parts.move !== undefined && markdown !== parts.move.base) report.move = markdown;\n if (parts.removal !== undefined && markdown !== parts.removal.base) report.removal = markdown;\n return report;\n}\n\nexport function changedParts(path: string, report: ChangedUnderneath): readonly ChangedPart[] {\n return [\n ...(report.creation === undefined ? [] : [{ path, part: 'creation' as const }]),\n ...named(report.fields).map(([name]) => ({ path, part: 'field' as const, name })),\n ...named(report.sections).map(([name]) => ({ path, part: 'section' as const, name })),\n ...(report.preamble === undefined ? [] : [{ path, part: 'preamble' as const }]),\n ...(report.markdown === undefined ? [] : [{ path, part: 'markdown' as const }]),\n ...(report.move === undefined ? [] : [{ path, part: 'move' as const }]),\n ...(report.removal === undefined ? [] : [{ path, part: 'removal' as const }]),\n ];\n}\n\nfunction joined<T>(\n existing: Readonly<Record<string, T>> | undefined,\n returned: Readonly<Record<string, T>> | undefined,\n): Readonly<Record<string, T>> | undefined {\n const merged = { ...existing };\n for (const [name, part] of named(returned)) if (!Object.hasOwn(merged, name)) merged[name] = part;\n return Object.keys(merged).length === 0 ? undefined : merged;\n}\n\nfunction ended(text: string): string {\n return text === '' || text.endsWith('\\n') ? text : `${text}\\n`;\n}\n\nfunction frontmatterOf(fields: readonly [string, { readonly value: unknown }][]): string {\n const opened = parse('---\\n---\\n');\n if (!opened.ok) return malformed();\n let document = opened.document;\n for (const [name, part] of fields) {\n const next = apply(document, { kind: 'field', name, value: part.value, prior: undefined });\n if (next.outcome !== 'applied') return malformed();\n document = next.document;\n }\n return serialize(document);\n}\n\nfunction concatenated(markdown: string, parts: HeldParts): string {\n const fields = named(parts.fields);\n const pieces = [\n ...(fields.length === 0 ? [] : [frontmatterOf(fields)]),\n ...(parts.preamble === undefined ? [] : [parts.preamble.value]),\n ...named(parts.sections).map(([name, part]) => `## ${name}\\n${part.value}`),\n ];\n if (pieces.length === 0) return markdown;\n return `${ended(markdown)}\\n${pieces.map(ended).join('')}`;\n}\n\nexport function returnedInto(existing: HeldParts | undefined, returned: HeldParts): HeldParts {\n if (existing === undefined) return returned;\n const next: { -readonly [Name in keyof HeldParts]: HeldParts[Name] } = { ...existing };\n const whole = existing.markdown ?? returned.markdown;\n if (whole === undefined) {\n const fields = joined(existing.fields, returned.fields);\n const sections = joined(existing.sections, returned.sections);\n if (fields !== undefined) next.fields = fields;\n if (sections !== undefined) next.sections = sections;\n const preamble = existing.preamble ?? returned.preamble;\n if (preamble !== undefined) next.preamble = preamble;\n } else {\n delete next.fields;\n delete next.sections;\n delete next.preamble;\n const value = concatenated(whole.value, existing.markdown === undefined ? existing : returned);\n next.markdown = { value, base: whole.base };\n }\n const creation = existing.creation ?? returned.creation;\n const move = existing.move ?? returned.move;\n const removal = existing.removal ?? returned.removal;\n if (creation !== undefined) next.creation = creation;\n if (move !== undefined) next.move = move;\n if (removal !== undefined) next.removal = removal;\n return next;\n}\n\nexport function changesOf(\n path: string,\n parts: HeldParts,\n): { changes: readonly Change[]; bases: readonly Precondition[] } {\n const changes: Change[] = [];\n const bases: Precondition[] = [];\n const creation = parts.creation;\n if (creation !== undefined) {\n changes.push(\n 'markdown' in creation\n ? { kind: 'create', path, content: creation.markdown }\n : {\n kind: 'create',\n path,\n fields: { type: creation.type, ...creation.fields },\n sections: creation.sections,\n },\n );\n }\n for (const [name, part] of named(parts.fields)) {\n changes.push({ kind: 'field', path, name, value: part.value });\n bases.push({ kind: 'field', path, name, value: part.base?.value });\n }\n for (const [name, part] of named(parts.sections)) {\n changes.push({ kind: 'section', path, name, value: part.value });\n bases.push({ kind: 'section', path, name, value: part.base });\n }\n if (parts.preamble !== undefined) {\n changes.push({ kind: 'preamble', path, value: parts.preamble.value });\n bases.push({ kind: 'preamble', path, value: parts.preamble.base });\n }\n if (parts.markdown !== undefined) {\n changes.push({ kind: 'replace', path, content: parts.markdown.value });\n }\n if (parts.move !== undefined) {\n const to = normalize(parts.move.to);\n changes.push({ kind: 'move', path, to: to === null || to === '' ? parts.move.to : to });\n }\n if (parts.removal !== undefined) changes.push({ kind: 'remove', path });\n return { changes, bases };\n}\n"],"names":["apply","parse","serialize","normalize","malformed","Error","plain","value","Array","isArray","frontmatterValue","every","Number","isFinite","text","optionalText","undefined","markdownBase","entries","each","read","name","item","Object","fieldValue","hasOwn","textPart","base","creationOf","markdown","fields","type","sections","PART_NAMES","Set","readParts","keys","some","has","parts","preamble","creation","move","to","removal","named","record","own","kept","prior","editsText","length","held","current","next","fromEntries","map","part","equalValue","left","right","index","sameField","underneath","path","visible","documents","document","collection","report","changedParts","joined","existing","returned","merged","ended","endsWith","frontmatterOf","opened","ok","kind","outcome","concatenated","pieces","join","returnedInto","whole","changesOf","changes","bases","push","content"],"mappings":"AAAA,SAASA,KAAK,EAAEC,KAAK,EAAEC,SAAS,QAAQ,uBAAuB;AAG/D,SAASC,SAAS,QAAQ,aAAa;AAiFvC,SAASC;IACP,MAAM,IAAIC,MAAM;AAClB;AAEA,SAASC,MAAMC,KAAc;IAC3B,OAAO,OAAOA,UAAU,YAAYA,UAAU,QAAQ,CAACC,MAAMC,OAAO,CAACF;AACvE;AAEA,SAASG,iBAAiBH,KAAc;IACtC,IAAIC,MAAMC,OAAO,CAACF,QAAQ,OAAOA,MAAMI,KAAK,CAACD;IAC7C,OACEH,UAAU,QACV,OAAOA,UAAU,YACjB,OAAOA,UAAU,aAChB,OAAOA,UAAU,YAAYK,OAAOC,QAAQ,CAACN;AAElD;AAEA,SAASO,KAAKP,KAAc;IAC1B,OAAO,OAAOA,UAAU,WAAWA,QAAQH;AAC7C;AAEA,SAASW,aAAaR,KAAc;IAClC,OAAOA,UAAUS,YAAYA,YAAYF,KAAKP;AAChD;AAEA,SAASU,aAAaV,KAAc;IAClC,OAAOA,UAAU,OAAO,OAAOQ,aAAaR;AAC9C;AAEA,SAASW,QAAWX,KAAc,EAAEY,IAA0B;IAC5D,IAAI,CAACb,MAAMC,QAAQH;IACnB,MAAMgB,OAA0B,CAAC;IACjC,KAAK,MAAM,CAACC,MAAMC,KAAK,IAAIC,OAAOL,OAAO,CAACX,OAAQa,IAAI,CAACC,KAAK,GAAGF,KAAKG;IACpE,OAAOF;AACT;AAEA,SAASI,WAAWjB,KAAc;IAChC,IAAIA,UAAU,MAAM,OAAO;IAC3B,IAAI,CAACD,MAAMC,UAAU,CAACgB,OAAOE,MAAM,CAAClB,OAAO,YAAY,CAACG,iBAAiBH,MAAMA,KAAK,GAAG;QACrFH;IACF;IACA,OAAO;QAAEG,OAAOA,MAAMA,KAAK;IAAC;AAC9B;AAEA,SAASmB,SAASnB,KAAc;IAC9B,IAAI,CAACD,MAAMC,QAAQH;IACnB,MAAMuB,OAAOZ,aAAaR,MAAMoB,IAAI;IACpC,OAAO;QAAEpB,OAAOO,KAAKP,MAAMA,KAAK;QAAG,GAAIoB,SAASX,YAAY,CAAC,IAAI;YAAEW;QAAK,CAAC;IAAE;AAC7E;AAEA,SAASC,WAAWrB,KAAc;IAChC,IAAI,CAACD,MAAMC,QAAQH;IACnB,IAAImB,OAAOE,MAAM,CAAClB,OAAO,aAAa,OAAO;QAAEsB,UAAUf,KAAKP,MAAMsB,QAAQ;IAAE;IAC9E,MAAMC,SAASZ,QAAQX,MAAMuB,MAAM,EAAE,CAACR,OAAUZ,iBAAiBY,QAAQA,OAAOlB;IAChF,OAAO;QAAE2B,MAAMjB,KAAKP,MAAMwB,IAAI;QAAGD;QAAQE,UAAUd,QAAQX,MAAMyB,QAAQ,EAAElB;IAAM;AACnF;AAEA,MAAMmB,aAAa,IAAIC,IAAI;IACzB;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAED,OAAO,SAASC,UAAU5B,KAAc;IACtC,IAAI,CAACD,MAAMC,UAAUgB,OAAOa,IAAI,CAAC7B,OAAO8B,IAAI,CAAC,CAAChB,OAAS,CAACY,WAAWK,GAAG,CAACjB,QAAQjB;IAC/E,MAAMmC,QAA4E,CAAC;IACnF,IAAIhC,MAAMuB,MAAM,KAAKd,WAAW;QAC9BuB,MAAMT,MAAM,GAAGZ,QAAQX,MAAMuB,MAAM,EAAE,CAACR;YACpC,IAAI,CAAChB,MAAMgB,SAAS,CAACC,OAAOE,MAAM,CAACH,MAAM,YAAY,CAACZ,iBAAiBY,KAAKf,KAAK,GAAG;gBAClFH;YACF;YACA,OAAOkB,KAAKK,IAAI,KAAKX,YACjB;gBAAET,OAAOe,KAAKf,KAAK;YAAC,IACpB;gBAAEA,OAAOe,KAAKf,KAAK;gBAAEoB,MAAMH,WAAWF,KAAKK,IAAI;YAAE;QACvD;IACF;IACA,IAAIpB,MAAMyB,QAAQ,KAAKhB,WAAWuB,MAAMP,QAAQ,GAAGd,QAAQX,MAAMyB,QAAQ,EAAEN;IAC3E,IAAInB,MAAMiC,QAAQ,KAAKxB,WAAWuB,MAAMC,QAAQ,GAAGd,SAASnB,MAAMiC,QAAQ;IAC1E,IAAIjC,MAAMsB,QAAQ,KAAKb,WAAWuB,MAAMV,QAAQ,GAAGH,SAASnB,MAAMsB,QAAQ;IAC1E,IAAItB,MAAMkC,QAAQ,KAAKzB,WAAWuB,MAAME,QAAQ,GAAGb,WAAWrB,MAAMkC,QAAQ;IAC5E,IAAIlC,MAAMmC,IAAI,KAAK1B,WAAW;QAC5B,IAAI,CAACV,MAAMC,MAAMmC,IAAI,GAAGtC;QACxB,MAAMuB,OAAOV,aAAaV,MAAMmC,IAAI,CAACf,IAAI;QACzCY,MAAMG,IAAI,GAAG;YAAEC,IAAI7B,KAAKP,MAAMmC,IAAI,CAACC,EAAE;YAAG,GAAIhB,SAASX,YAAY,CAAC,IAAI;gBAAEW;YAAK,CAAC;QAAE;IAClF;IACA,IAAIpB,MAAMqC,OAAO,KAAK5B,WAAW;QAC/B,IAAI,CAACV,MAAMC,MAAMqC,OAAO,GAAGxC;QAC3B,MAAMuB,OAAOV,aAAaV,MAAMqC,OAAO,CAACjB,IAAI;QAC5CY,MAAMK,OAAO,GAAGjB,SAASX,YAAY,CAAC,IAAI;YAAEW;QAAK;IACnD;IACA,OAAOY;AACT;AAEA,SAASM,MAASC,MAA+C;IAC/D,OAAOvB,OAAOL,OAAO,CAAC4B,UAAU,CAAC;AACnC;AAEA,SAASC,IAAOD,MAA+C,EAAEzB,IAAY;IAC3E,OAAOyB,WAAW9B,aAAaO,OAAOE,MAAM,CAACqB,QAAQzB,QAAQyB,MAAM,CAACzB,KAAK,GAAGL;AAC9E;AAEA,SAASgC,KAAQC,KAAuC,EAAEtB,IAAmB;IAC3E,IAAIsB,UAAUjC,WAAW,OAAOiC,MAAMtB,IAAI;IAC1C,IAAIA,SAASX,WAAW,MAAM,IAAIX,MAAM;IACxC,OAAOsB;AACT;AAEA,SAASuB,UAAUX,KAAqB;IACtC,OACEA,MAAMC,QAAQ,KAAKxB,aACnB6B,MAAMN,MAAMT,MAAM,EAAEqB,MAAM,GAAG,KAC7BN,MAAMN,MAAMP,QAAQ,EAAEmB,MAAM,GAAG;AAEnC;AAEA,OAAO,SAASC,KAAKC,OAA8B,EAAEd,KAAqB;IACxE,IAAIA,MAAMV,QAAQ,KAAKb,aAAakC,UAAUX,QAAQ;QACpD,MAAM,IAAIlC,MAAM;IAClB;IACA,MAAMiD,OAAiE,CAAC;IACxE,MAAMxB,SAASe,MAAMN,MAAMT,MAAM;IACjC,IAAIA,OAAOqB,MAAM,GAAG,GAAG;QACrBG,KAAKxB,MAAM,GAAGP,OAAOgC,WAAW,CAC9BzB,OAAO0B,GAAG,CAAC,CAAC,CAACnC,MAAMoC,KAAK,GAAK;gBAC3BpC;gBACA;oBAAEd,OAAOkD,KAAKlD,KAAK;oBAAEoB,MAAMqB,KAAKD,IAAIM,SAASvB,QAAQT,OAAOoC,KAAK9B,IAAI;gBAAE;aACxE;IAEL;IACA,MAAMK,WAAWa,MAAMN,MAAMP,QAAQ;IACrC,IAAIA,SAASmB,MAAM,GAAG,GAAG;QACvBG,KAAKtB,QAAQ,GAAGT,OAAOgC,WAAW,CAChCvB,SAASwB,GAAG,CAAC,CAAC,CAACnC,MAAMoC,KAAK,GAAK;gBAC7BpC;gBACA;oBAAEd,OAAOkD,KAAKlD,KAAK;oBAAEoB,MAAMqB,KAAKD,IAAIM,SAASrB,UAAUX,OAAOoC,KAAK9B,IAAI;gBAAE;aAC1E;IAEL;IACA,IAAIY,MAAMC,QAAQ,KAAKxB,WAAW;QAChCsC,KAAKd,QAAQ,GAAG;YACdjC,OAAOgC,MAAMC,QAAQ,CAACjC,KAAK;YAC3BoB,MAAMqB,KAAKK,SAASb,UAAUD,MAAMC,QAAQ,CAACb,IAAI;QACnD;IACF;IACA,IAAIY,MAAMV,QAAQ,KAAKb,WAAW;QAChCsC,KAAKzB,QAAQ,GAAG;YACdtB,OAAOgC,MAAMV,QAAQ,CAACtB,KAAK;YAC3BoB,MAAMqB,KAAKK,SAASxB,UAAUU,MAAMV,QAAQ,CAACF,IAAI;QACnD;IACF;IACA,IAAIY,MAAME,QAAQ,KAAKzB,WAAWsC,KAAKb,QAAQ,GAAGF,MAAME,QAAQ;IAChE,IAAIF,MAAMG,IAAI,KAAK1B,WAAW;QAC5BsC,KAAKZ,IAAI,GAAG;YAAEC,IAAIJ,MAAMG,IAAI,CAACC,EAAE;YAAEhB,MAAMqB,KAAKK,SAASX,MAAMH,MAAMG,IAAI,CAACf,IAAI;QAAE;IAC9E;IACA,IAAIY,MAAMK,OAAO,KAAK5B,WAAW;QAC/BsC,KAAKV,OAAO,GAAG;YAAEjB,MAAMqB,KAAKK,SAAST,SAASL,MAAMK,OAAO,CAACjB,IAAI;QAAE;IACpE;IACA,IAAIJ,OAAOa,IAAI,CAACkB,MAAMH,MAAM,KAAK,GAAG,MAAM,IAAI9C,MAAM;IACpD,OAAOiD;AACT;AAEA,OAAO,SAASI,WAAWC,IAAa,EAAEC,KAAc;IACtD,IAAID,SAASC,OAAO,OAAO;IAC3B,OACEpD,MAAMC,OAAO,CAACkD,SACdnD,MAAMC,OAAO,CAACmD,UACdD,KAAKR,MAAM,KAAKS,MAAMT,MAAM,IAC5BQ,KAAKhD,KAAK,CAAC,CAACW,MAAMuC,QAAUH,WAAWpC,MAAMsC,KAAK,CAACC,MAAM;AAE7D;AAEA,SAASC,UAAUH,IAAgB,EAAEC,KAAiB;IACpD,IAAID,SAAS,QAAQC,UAAU,MAAM,OAAOD,SAASC;IACrD,OAAOF,WAAWC,KAAKpD,KAAK,EAAEqD,MAAMrD,KAAK;AAC3C;AAEA,OAAO,SAASwD,WACdxB,KAAgB,EAChByB,IAAY,EACZC,OAAiC;IAEjC,MAAMpC,WAAWoC,SAASC,SAAS,CAACF,KAAK,IAAI;IAC7C,MAAMG,WAAWF,SAASG,WAAWF,SAAS,CAACF,KAAK;IACpD,MAAMK,SAAmF,CAAC;IAC1F,MAAMvC,SAAqC,CAAC;IAC5C,KAAK,MAAM,CAACT,MAAMoC,KAAK,IAAIZ,MAAMN,MAAMT,MAAM,EAAG;QAC9C,MAAMuB,UACJc,aAAanD,aAAaO,OAAOE,MAAM,CAAC0C,SAASrC,MAAM,EAAET,QACrD;YAAEd,OAAO4D,SAASrC,MAAM,CAACT,KAAK;QAAC,IAC/B;QACN,IAAI,CAACyC,UAAUL,KAAK9B,IAAI,EAAE0B,UAAUvB,MAAM,CAACT,KAAK,GAAGgC;IACrD;IACA,IAAI9B,OAAOa,IAAI,CAACN,QAAQqB,MAAM,GAAG,GAAGkB,OAAOvC,MAAM,GAAGA;IACpD,MAAME,WAA0C,CAAC;IACjD,KAAK,MAAM,CAACX,MAAMoC,KAAK,IAAIZ,MAAMN,MAAMP,QAAQ,EAAG;QAChD,MAAMqB,UACJc,aAAanD,aAAaO,OAAOE,MAAM,CAAC0C,SAASnC,QAAQ,EAAEX,QACvD8C,SAASnC,QAAQ,CAACX,KAAK,GACvB;QACN,IAAIgC,YAAYI,KAAK9B,IAAI,EAAEK,QAAQ,CAACX,KAAK,GAAGgC;IAC9C;IACA,IAAI9B,OAAOa,IAAI,CAACJ,UAAUmB,MAAM,GAAG,GAAGkB,OAAOrC,QAAQ,GAAGA;IACxD,MAAMQ,WAAW2B,UAAU3B,YAAY;IACvC,IAAID,MAAMC,QAAQ,KAAKxB,aAAawB,aAAaD,MAAMC,QAAQ,CAACb,IAAI,EAAE0C,OAAO7B,QAAQ,GAAGA;IACxF,IAAID,MAAMV,QAAQ,KAAKb,aAAaa,aAAaU,MAAMV,QAAQ,CAACF,IAAI,EAAE0C,OAAOxC,QAAQ,GAAGA;IACxF,IAAIU,MAAME,QAAQ,KAAKzB,aAAaa,aAAa,MAAMwC,OAAO5B,QAAQ,GAAGZ;IACzE,IAAIU,MAAMG,IAAI,KAAK1B,aAAaa,aAAaU,MAAMG,IAAI,CAACf,IAAI,EAAE0C,OAAO3B,IAAI,GAAGb;IAC5E,IAAIU,MAAMK,OAAO,KAAK5B,aAAaa,aAAaU,MAAMK,OAAO,CAACjB,IAAI,EAAE0C,OAAOzB,OAAO,GAAGf;IACrF,OAAOwC;AACT;AAEA,OAAO,SAASC,aAAaN,IAAY,EAAEK,MAAyB;IAClE,OAAO;WACDA,OAAO5B,QAAQ,KAAKzB,YAAY,EAAE,GAAG;YAAC;gBAAEgD;gBAAMP,MAAM;YAAoB;SAAE;WAC3EZ,MAAMwB,OAAOvC,MAAM,EAAE0B,GAAG,CAAC,CAAC,CAACnC,KAAK,GAAM,CAAA;gBAAE2C;gBAAMP,MAAM;gBAAkBpC;YAAK,CAAA;WAC3EwB,MAAMwB,OAAOrC,QAAQ,EAAEwB,GAAG,CAAC,CAAC,CAACnC,KAAK,GAAM,CAAA;gBAAE2C;gBAAMP,MAAM;gBAAoBpC;YAAK,CAAA;WAC9EgD,OAAO7B,QAAQ,KAAKxB,YAAY,EAAE,GAAG;YAAC;gBAAEgD;gBAAMP,MAAM;YAAoB;SAAE;WAC1EY,OAAOxC,QAAQ,KAAKb,YAAY,EAAE,GAAG;YAAC;gBAAEgD;gBAAMP,MAAM;YAAoB;SAAE;WAC1EY,OAAO3B,IAAI,KAAK1B,YAAY,EAAE,GAAG;YAAC;gBAAEgD;gBAAMP,MAAM;YAAgB;SAAE;WAClEY,OAAOzB,OAAO,KAAK5B,YAAY,EAAE,GAAG;YAAC;gBAAEgD;gBAAMP,MAAM;YAAmB;SAAE;KAC7E;AACH;AAEA,SAASc,OACPC,QAAiD,EACjDC,QAAiD;IAEjD,MAAMC,SAAS;QAAE,GAAGF,QAAQ;IAAC;IAC7B,KAAK,MAAM,CAACnD,MAAMoC,KAAK,IAAIZ,MAAM4B,UAAW,IAAI,CAAClD,OAAOE,MAAM,CAACiD,QAAQrD,OAAOqD,MAAM,CAACrD,KAAK,GAAGoC;IAC7F,OAAOlC,OAAOa,IAAI,CAACsC,QAAQvB,MAAM,KAAK,IAAInC,YAAY0D;AACxD;AAEA,SAASC,MAAM7D,IAAY;IACzB,OAAOA,SAAS,MAAMA,KAAK8D,QAAQ,CAAC,QAAQ9D,OAAO,GAAGA,KAAK,EAAE,CAAC;AAChE;AAEA,SAAS+D,cAAc/C,MAAwD;IAC7E,MAAMgD,SAAS7E,MAAM;IACrB,IAAI,CAAC6E,OAAOC,EAAE,EAAE,OAAO3E;IACvB,IAAI+D,WAAWW,OAAOX,QAAQ;IAC9B,KAAK,MAAM,CAAC9C,MAAMoC,KAAK,IAAI3B,OAAQ;QACjC,MAAMwB,OAAOtD,MAAMmE,UAAU;YAAEa,MAAM;YAAS3D;YAAMd,OAAOkD,KAAKlD,KAAK;YAAE0C,OAAOjC;QAAU;QACxF,IAAIsC,KAAK2B,OAAO,KAAK,WAAW,OAAO7E;QACvC+D,WAAWb,KAAKa,QAAQ;IAC1B;IACA,OAAOjE,UAAUiE;AACnB;AAEA,SAASe,aAAarD,QAAgB,EAAEU,KAAgB;IACtD,MAAMT,SAASe,MAAMN,MAAMT,MAAM;IACjC,MAAMqD,SAAS;WACTrD,OAAOqB,MAAM,KAAK,IAAI,EAAE,GAAG;YAAC0B,cAAc/C;SAAQ;WAClDS,MAAMC,QAAQ,KAAKxB,YAAY,EAAE,GAAG;YAACuB,MAAMC,QAAQ,CAACjC,KAAK;SAAC;WAC3DsC,MAAMN,MAAMP,QAAQ,EAAEwB,GAAG,CAAC,CAAC,CAACnC,MAAMoC,KAAK,GAAK,CAAC,GAAG,EAAEpC,KAAK,EAAE,EAAEoC,KAAKlD,KAAK,EAAE;KAC3E;IACD,IAAI4E,OAAOhC,MAAM,KAAK,GAAG,OAAOtB;IAChC,OAAO,GAAG8C,MAAM9C,UAAU,EAAE,EAAEsD,OAAO3B,GAAG,CAACmB,OAAOS,IAAI,CAAC,KAAK;AAC5D;AAEA,OAAO,SAASC,aAAab,QAA+B,EAAEC,QAAmB;IAC/E,IAAID,aAAaxD,WAAW,OAAOyD;IACnC,MAAMnB,OAAiE;QAAE,GAAGkB,QAAQ;IAAC;IACrF,MAAMc,QAAQd,SAAS3C,QAAQ,IAAI4C,SAAS5C,QAAQ;IACpD,IAAIyD,UAAUtE,WAAW;QACvB,MAAMc,SAASyC,OAAOC,SAAS1C,MAAM,EAAE2C,SAAS3C,MAAM;QACtD,MAAME,WAAWuC,OAAOC,SAASxC,QAAQ,EAAEyC,SAASzC,QAAQ;QAC5D,IAAIF,WAAWd,WAAWsC,KAAKxB,MAAM,GAAGA;QACxC,IAAIE,aAAahB,WAAWsC,KAAKtB,QAAQ,GAAGA;QAC5C,MAAMQ,WAAWgC,SAAShC,QAAQ,IAAIiC,SAASjC,QAAQ;QACvD,IAAIA,aAAaxB,WAAWsC,KAAKd,QAAQ,GAAGA;IAC9C,OAAO;QACL,OAAOc,KAAKxB,MAAM;QAClB,OAAOwB,KAAKtB,QAAQ;QACpB,OAAOsB,KAAKd,QAAQ;QACpB,MAAMjC,QAAQ2E,aAAaI,MAAM/E,KAAK,EAAEiE,SAAS3C,QAAQ,KAAKb,YAAYwD,WAAWC;QACrFnB,KAAKzB,QAAQ,GAAG;YAAEtB;YAAOoB,MAAM2D,MAAM3D,IAAI;QAAC;IAC5C;IACA,MAAMc,WAAW+B,SAAS/B,QAAQ,IAAIgC,SAAShC,QAAQ;IACvD,MAAMC,OAAO8B,SAAS9B,IAAI,IAAI+B,SAAS/B,IAAI;IAC3C,MAAME,UAAU4B,SAAS5B,OAAO,IAAI6B,SAAS7B,OAAO;IACpD,IAAIH,aAAazB,WAAWsC,KAAKb,QAAQ,GAAGA;IAC5C,IAAIC,SAAS1B,WAAWsC,KAAKZ,IAAI,GAAGA;IACpC,IAAIE,YAAY5B,WAAWsC,KAAKV,OAAO,GAAGA;IAC1C,OAAOU;AACT;AAEA,OAAO,SAASiC,UACdvB,IAAY,EACZzB,KAAgB;IAEhB,MAAMiD,UAAoB,EAAE;IAC5B,MAAMC,QAAwB,EAAE;IAChC,MAAMhD,WAAWF,MAAME,QAAQ;IAC/B,IAAIA,aAAazB,WAAW;QAC1BwE,QAAQE,IAAI,CACV,cAAcjD,WACV;YAAEuC,MAAM;YAAUhB;YAAM2B,SAASlD,SAASZ,QAAQ;QAAC,IACnD;YACEmD,MAAM;YACNhB;YACAlC,QAAQ;gBAAEC,MAAMU,SAASV,IAAI;gBAAE,GAAGU,SAASX,MAAM;YAAC;YAClDE,UAAUS,SAAST,QAAQ;QAC7B;IAER;IACA,KAAK,MAAM,CAACX,MAAMoC,KAAK,IAAIZ,MAAMN,MAAMT,MAAM,EAAG;QAC9C0D,QAAQE,IAAI,CAAC;YAAEV,MAAM;YAAShB;YAAM3C;YAAMd,OAAOkD,KAAKlD,KAAK;QAAC;QAC5DkF,MAAMC,IAAI,CAAC;YAAEV,MAAM;YAAShB;YAAM3C;YAAMd,OAAOkD,KAAK9B,IAAI,EAAEpB;QAAM;IAClE;IACA,KAAK,MAAM,CAACc,MAAMoC,KAAK,IAAIZ,MAAMN,MAAMP,QAAQ,EAAG;QAChDwD,QAAQE,IAAI,CAAC;YAAEV,MAAM;YAAWhB;YAAM3C;YAAMd,OAAOkD,KAAKlD,KAAK;QAAC;QAC9DkF,MAAMC,IAAI,CAAC;YAAEV,MAAM;YAAWhB;YAAM3C;YAAMd,OAAOkD,KAAK9B,IAAI;QAAC;IAC7D;IACA,IAAIY,MAAMC,QAAQ,KAAKxB,WAAW;QAChCwE,QAAQE,IAAI,CAAC;YAAEV,MAAM;YAAYhB;YAAMzD,OAAOgC,MAAMC,QAAQ,CAACjC,KAAK;QAAC;QACnEkF,MAAMC,IAAI,CAAC;YAAEV,MAAM;YAAYhB;YAAMzD,OAAOgC,MAAMC,QAAQ,CAACb,IAAI;QAAC;IAClE;IACA,IAAIY,MAAMV,QAAQ,KAAKb,WAAW;QAChCwE,QAAQE,IAAI,CAAC;YAAEV,MAAM;YAAWhB;YAAM2B,SAASpD,MAAMV,QAAQ,CAACtB,KAAK;QAAC;IACtE;IACA,IAAIgC,MAAMG,IAAI,KAAK1B,WAAW;QAC5B,MAAM2B,KAAKxC,UAAUoC,MAAMG,IAAI,CAACC,EAAE;QAClC6C,QAAQE,IAAI,CAAC;YAAEV,MAAM;YAAQhB;YAAMrB,IAAIA,OAAO,QAAQA,OAAO,KAAKJ,MAAMG,IAAI,CAACC,EAAE,GAAGA;QAAG;IACvF;IACA,IAAIJ,MAAMK,OAAO,KAAK5B,WAAWwE,QAAQE,IAAI,CAAC;QAAEV,MAAM;QAAUhB;IAAK;IACrE,OAAO;QAAEwB;QAASC;IAAM;AAC1B"}
|
package/dist/rows.d.ts
CHANGED
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,KAAK,
|
|
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,CAAC;IACb,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;CACd,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,EAClB,WAAW,EAAE,WAAW,GACvB,SAAS,GAAG,EAAE,CAqDhB"}
|
package/dist/rows.js
CHANGED
package/dist/rows.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/workspace/packages/mdruntime/src/rows.ts"],"sourcesContent":["import type
|
|
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;\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,\n composition: Composition,\n): readonly Row[] {\n if (!path.endsWith('.md')) return [];\n const type = document.type ?? 'any';\n const definition = definitionOf(governing(composition, path), document.type);\n const key = documentKey(room, path);\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 const body = keyOf('b', room, path);\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","endsWith","type","definition","key","values","sizes","references","name","Object","entries","fields","reference","compared","length","targets","flat","found","Set","push","source","field","body","directories","preamble","sections","markdown","content"],"mappings":"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"}
|
package/dist/save.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../src/save.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../src/save.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,KAAK,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AAE/C,MAAM,MAAM,SAAS,GAAG;IACtB,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,SAAS,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,OAAO,cAAc,EAAE,eAAe,CAAC;IACnD,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,cAAc,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IAC/B,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAAC;AAwK9C,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,GAAG,WAAW,CAOxF;AA2LD,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CA8FxD"}
|
package/dist/save.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { definitionOf } from './model.js';
|
|
2
|
-
import { apply, links, parse, serialize } from '@agentshouse/mdmodel';
|
|
2
|
+
import { apply, links, parse, retarget, serialize, target } from '@agentshouse/mdmodel';
|
|
3
3
|
import { immutable } from './change.js';
|
|
4
4
|
import { governing, parseCollection, validateCollection } from './collection.js';
|
|
5
5
|
import { changeBatchIdentity } from './identity.js';
|
|
6
6
|
import { overlay } from './overlay.js';
|
|
7
|
-
import { covered, normalize, relative
|
|
7
|
+
import { covered, normalize, relative } from './paths.js';
|
|
8
8
|
function refuse(rule, file, location) {
|
|
9
9
|
return {
|
|
10
10
|
kind: 'refused',
|
|
@@ -22,16 +22,16 @@ function refuse(rule, file, location) {
|
|
|
22
22
|
function referenceField(spec) {
|
|
23
23
|
return spec.kind === 'reference' || spec.kind === 'list' && spec.of.kind === 'reference';
|
|
24
24
|
}
|
|
25
|
-
function
|
|
25
|
+
function repointed(value, from, to, moves) {
|
|
26
26
|
if (Array.isArray(value)) {
|
|
27
|
-
const next = value.map((item)=>
|
|
27
|
+
const next = value.map((item)=>repointed(item, from, to, moves) ?? item);
|
|
28
28
|
return next.some((item, index)=>item !== value[index]) ? next : undefined;
|
|
29
29
|
}
|
|
30
30
|
if (typeof value !== 'string') return undefined;
|
|
31
|
-
const
|
|
32
|
-
if (
|
|
33
|
-
const
|
|
34
|
-
return
|
|
31
|
+
const named = target(from, value);
|
|
32
|
+
if (named === null) return undefined;
|
|
33
|
+
const destination = moves.get(named) ?? named;
|
|
34
|
+
return target(to, value) === destination ? undefined : retarget(value, relative(to, destination));
|
|
35
35
|
}
|
|
36
36
|
function edited(document, path, changes) {
|
|
37
37
|
let next = document;
|
|
@@ -150,7 +150,7 @@ function rewrites(changes, visible) {
|
|
|
150
150
|
const definition = definitionOf(governing(visible.collection.composition, path), document.type);
|
|
151
151
|
for (const [name, spec] of Object.entries(definition?.fields ?? {})){
|
|
152
152
|
if (!referenceField(spec) || settled.has(`${path} ${name}`)) continue;
|
|
153
|
-
const value =
|
|
153
|
+
const value = repointed(document.fields[name], path, moved, moves);
|
|
154
154
|
if (value === undefined) continue;
|
|
155
155
|
added.push({
|
|
156
156
|
kind: 'field',
|
|
@@ -205,8 +205,8 @@ function targets(value, from) {
|
|
|
205
205
|
const resolved = [];
|
|
206
206
|
for (const item of values){
|
|
207
207
|
if (typeof item !== 'string') continue;
|
|
208
|
-
const
|
|
209
|
-
if (
|
|
208
|
+
const named = target(from, item);
|
|
209
|
+
if (named !== null) resolved.push(named);
|
|
210
210
|
}
|
|
211
211
|
return resolved;
|
|
212
212
|
}
|
|
@@ -222,7 +222,7 @@ function incoming(collection, removed) {
|
|
|
222
222
|
const definition = definitionOf(governing(collection.composition, path), document.type);
|
|
223
223
|
for (const [name, spec] of Object.entries(definition?.fields ?? {})){
|
|
224
224
|
if (!referenceField(spec)) continue;
|
|
225
|
-
for (const
|
|
225
|
+
for (const named of targets(document.fields[name], path))note(named, path);
|
|
226
226
|
}
|
|
227
227
|
for (const link of links(document, path))note(link.target, path);
|
|
228
228
|
}
|
package/dist/save.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/workspace/packages/mdruntime/src/save.ts"],"sourcesContent":["import { definitionOf, type ModelState } from './model.js';\nimport {\n apply,\n links,\n parse,\n serialize,\n type Document,\n type FieldSpec,\n} from '@agentshouse/mdmodel';\nimport type { ProviderLimit } from './adapter.js';\nimport {\n immutable,\n type Change,\n type ChangeBatch,\n type Precondition,\n type WrittenBy,\n} from './change.js';\nimport {\n governing,\n parseCollection,\n validateCollection,\n type Collection,\n type Composition,\n} from './collection.js';\nimport { changeBatchIdentity } from './identity.js';\nimport { overlay, type Layer } from './overlay.js';\nimport { covered, normalize, relative, resolve } from './paths.js';\nimport type { VisibleLayer } from './replica.js';\nimport type { ChangedPart } from './room-draft.js';\n\nexport type SaveRefusal = {\n rule: string;\n file?: string;\n location?: string;\n referrers?: readonly string[];\n parts?: readonly ChangedPart[];\n};\n\nexport type Rewriting = 'runtime' | 'provider';\n\nexport type SaveInput = {\n composition: Composition;\n rewriting: Rewriting;\n baseRoomVersion: string;\n operations: import('./adapter.js').OperationScopes;\n providerOwnedPaths: readonly string[];\n providerLimits: readonly ProviderLimit[];\n visible: VisibleLayer;\n changes: readonly Change[];\n bases: readonly Precondition[];\n writtenBy?: WrittenBy;\n};\n\nexport type BatchResult =\n | { kind: 'batch'; batch: ChangeBatch }\n | { kind: 'refused'; refusal: SaveRefusal };\n\ntype Expansion =\n | { kind: 'changes'; changes: readonly Change[] }\n | { kind: 'refused'; refusal: SaveRefusal };\n\nfunction refuse(rule: string, file?: string, location?: string): BatchResult {\n return {\n kind: 'refused',\n refusal: {\n rule,\n ...(file === undefined ? {} : { file }),\n ...(location === undefined ? {} : { location }),\n },\n };\n}\n\nfunction referenceField(spec: FieldSpec): boolean {\n return spec.kind === 'reference' || (spec.kind === 'list' && spec.of.kind === 'reference');\n}\n\nfunction retarget(\n value: unknown,\n from: string,\n to: string,\n moves: ReadonlyMap<string, string>,\n): unknown {\n if (Array.isArray(value)) {\n const next = value.map((item) => retarget(item, from, to, moves) ?? item);\n return next.some((item, index) => item !== value[index]) ? next : undefined;\n }\n if (typeof value !== 'string') return undefined;\n const target = resolve(from, value);\n if (target === null) return undefined;\n const next = relative(to, moves.get(target) ?? target);\n return next === value ? undefined : next;\n}\n\nfunction edited(document: Document, path: string, changes: readonly Change[]): Document {\n let next = document;\n for (const change of changes) {\n if (change.path !== path) continue;\n if (change.kind !== 'section' && change.kind !== 'preamble') continue;\n const applied = apply(\n next,\n change.kind === 'preamble'\n ? { kind: 'preamble', value: change.value, prior: next.preamble }\n : {\n kind: 'section',\n name: change.name,\n value: change.value,\n prior: next.sections[change.name],\n },\n );\n if (applied.outcome === 'applied') next = applied.document;\n }\n return next;\n}\n\nfunction bodies(path: string, before: Document, after: Document): readonly Change[] {\n const changes: Change[] = [];\n if (after.preamble !== before.preamble) {\n changes.push({ kind: 'preamble', path, value: after.preamble });\n }\n for (const [name, value] of Object.entries(after.sections)) {\n if (before.sections[name] === value) continue;\n changes.push({ kind: 'section', path, name, value });\n }\n return changes;\n}\n\nfunction relinks(\n path: string,\n moved: string,\n before: Document,\n moves: ReadonlyMap<string, string>,\n): Expansion {\n let after = before;\n for (const link of links(before, path)) {\n const destination = moves.get(link.target) ?? link.target;\n if (destination === link.target && moved === path) continue;\n const to = relative(moved, destination);\n if (to === relative(path, link.target)) continue;\n const applied = apply(after, { kind: 'link', href: link.href, to });\n if (applied.outcome === 'refuse') {\n return {\n kind: 'refused',\n refusal: {\n rule: applied.refusal.rule,\n file: path,\n ...(applied.refusal.location === undefined ? {} : { location: applied.refusal.location }),\n },\n };\n }\n after = applied.document;\n }\n if (after === before) return { kind: 'changes', changes: [] };\n if (before.type === undefined) {\n return { kind: 'changes', changes: [{ kind: 'replace', path, content: serialize(after) }] };\n }\n return { kind: 'changes', changes: bodies(path, before, after) };\n}\n\nfunction subsumed(merged: Change[], path: string) {\n for (let index = merged.length - 1; index >= 0; index -= 1) {\n const item = merged[index];\n if (item.path !== path) continue;\n if (item.kind === 'section' || item.kind === 'preamble') merged.splice(index, 1);\n }\n}\n\nfunction rewrites(changes: readonly Change[], visible: VisibleLayer): Expansion {\n const moves = new Map<string, string>();\n const settled = new Set<string>();\n for (const change of changes) {\n if (change.kind === 'move') moves.set(change.path, change.to);\n if (change.kind === 'remove' || change.kind === 'replace' || change.kind === 'create') {\n settled.add(change.path);\n }\n if (change.kind === 'field') settled.add(`${change.path} ${change.name}`);\n }\n if (moves.size === 0) return { kind: 'changes', changes };\n const merged = [...changes];\n const added: Change[] = [];\n for (const [path, document] of Object.entries(visible.collection.documents)) {\n if (settled.has(path)) continue;\n const moved = moves.get(path) ?? path;\n const definition = definitionOf(governing(visible.collection.composition, path), document.type);\n for (const [name, spec] of Object.entries(definition?.fields ?? {})) {\n if (!referenceField(spec) || settled.has(`${path} ${name}`)) continue;\n const value = retarget(document.fields[name], path, moved, moves);\n if (value === undefined) continue;\n added.push({ kind: 'field', path, name, value });\n }\n const relinked = relinks(path, moved, edited(document, path, merged), moves);\n if (relinked.kind === 'refused') return relinked;\n for (const change of relinked.changes) {\n if (change.kind === 'replace') {\n subsumed(merged, path);\n added.push(change);\n continue;\n }\n const index = merged.findIndex(\n (item) =>\n item.kind === change.kind &&\n item.path === path &&\n (change.kind !== 'section' || (item.kind === 'section' && item.name === change.name)),\n );\n if (index === -1) added.push(change);\n else merged[index] = change;\n }\n }\n return { kind: 'changes', changes: [...added, ...merged] };\n}\n\nfunction anticipated(\n changes: readonly Change[],\n preconditions: readonly Precondition[],\n rewritten: readonly Change[],\n visible: VisibleLayer,\n) {\n const derived = rewritten.filter((change) => !changes.includes(change));\n return {\n changes: rewritten,\n preconditions: [...preconditionsOf(derived, visible, []), ...preconditions],\n };\n}\n\nexport function providerRewritten(batch: ChangeBatch, visible: VisibleLayer): ChangeBatch {\n const rewritten = rewrites(batch.changes, visible);\n if (rewritten.kind === 'refused') return batch;\n return {\n ...batch,\n ...anticipated(batch.changes, batch.preconditions, rewritten.changes, visible),\n };\n}\n\nfunction targets(value: unknown, from: string): readonly string[] {\n const values = Array.isArray(value) ? value : [value];\n const resolved: string[] = [];\n for (const item of values) {\n if (typeof item !== 'string') continue;\n const target = resolve(from, item);\n if (target !== null) resolved.push(target);\n }\n return resolved;\n}\n\nfunction incoming(collection: Collection, removed: ReadonlySet<string>): BatchResult | null {\n const found = new Map<string, Set<string>>();\n const note = (target: string, file: string) => {\n if (!removed.has(target)) return;\n const referrers = found.get(target) ?? new Set<string>();\n referrers.add(file);\n found.set(target, referrers);\n };\n for (const [path, document] of Object.entries(collection.documents)) {\n const definition = definitionOf(governing(collection.composition, path), document.type);\n for (const [name, spec] of Object.entries(definition?.fields ?? {})) {\n if (!referenceField(spec)) continue;\n for (const target of targets(document.fields[name], path)) note(target, path);\n }\n for (const link of links(document, path)) note(link.target, path);\n }\n const [first] = [...found.keys()].sort();\n if (first === undefined) return null;\n const every = new Set<string>();\n for (const referrers of found.values()) for (const file of referrers) every.add(file);\n return {\n kind: 'refused',\n refusal: { rule: 'referenced-missing-file', file: first, referrers: [...every].sort() },\n };\n}\n\nfunction affected(change: Change): readonly string[] {\n return change.kind === 'move' ? [change.path, change.to] : [change.path];\n}\n\nfunction guard(changes: readonly Change[], input: SaveInput): BatchResult | null {\n const existing = new Set([\n ...Object.keys(input.visible.documents),\n ...input.visible.binaryTargets,\n ]);\n for (const change of changes) {\n for (const path of affected(change)) {\n const normalized = normalize(path);\n if (normalized === null || normalized === '') return refuse('room-root', path);\n if (covered(input.providerOwnedPaths, normalized)) {\n return refuse('provider-owned-path', normalized);\n }\n const operation = change.kind === 'remove' ? 'delete' : 'write';\n if (!covered(input.operations[operation], normalized))\n return refuse(`${operation}-grant`, normalized);\n }\n if (change.kind === 'create') {\n if (existing.has(change.path)) return refuse('path-collision', change.path);\n existing.add(change.path);\n continue;\n }\n if (change.kind === 'move') {\n if (!existing.has(change.path)) return refuse('path-absent', change.path);\n if (existing.has(change.to)) return refuse('path-collision', change.to);\n existing.delete(change.path);\n existing.add(change.to);\n continue;\n }\n if (!existing.has(change.path)) return refuse('path-absent', change.path);\n if (change.kind === 'remove') {\n existing.delete(change.path);\n continue;\n }\n if (change.kind === 'replace') {\n if (input.visible.revisions[change.path] === undefined) {\n return refuse('unknown-revision', change.path);\n }\n continue;\n }\n if (input.visible.collection.documents[change.path] === undefined) {\n return refuse('path-absent', change.path);\n }\n }\n return null;\n}\n\nfunction existence(visible: VisibleLayer, path: string): Precondition {\n const revision = visible.revisions[path];\n return revision === undefined ? { kind: 'present', path } : { kind: 'revision', path, revision };\n}\n\nfunction sameTarget(precondition: Precondition, change: Change): boolean {\n if (precondition.kind !== change.kind || precondition.path !== change.path) return false;\n return (\n (precondition.kind !== 'field' && precondition.kind !== 'section') ||\n ((change.kind === 'field' || change.kind === 'section') && precondition.name === change.name)\n );\n}\n\nfunction preconditionsOf(\n changes: readonly Change[],\n visible: VisibleLayer,\n bases: readonly Precondition[],\n): readonly Precondition[] {\n const preconditions: Precondition[] = [];\n const seen = new Set<string>();\n const add = (precondition: Precondition) => {\n const part =\n precondition.kind === 'field' || precondition.kind === 'section' ? precondition.name : '';\n const identity = `${precondition.kind} ${precondition.path} ${part}`;\n if (seen.has(identity)) return;\n seen.add(identity);\n preconditions.push(precondition);\n };\n for (const change of changes) {\n if (change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble') {\n const based = bases.find((base) => sameTarget(base, change));\n if (based !== undefined) {\n add(based);\n continue;\n }\n const document = visible.collection.documents[change.path];\n if (change.kind === 'field') {\n add({\n kind: 'field',\n path: change.path,\n name: change.name,\n value: document.fields[change.name],\n });\n } else if (change.kind === 'section') {\n add({\n kind: 'section',\n path: change.path,\n name: change.name,\n value: document.sections[change.name],\n });\n } else add({ kind: 'preamble', path: change.path, value: document.preamble });\n continue;\n }\n if (change.kind === 'create') {\n add({ kind: 'absent', path: change.path });\n continue;\n }\n add(existence(visible, change.path));\n if (change.kind === 'move') add({ kind: 'absent', path: change.to });\n }\n return preconditions;\n}\n\nfunction depth(path: string) {\n return path.split('/').length;\n}\n\nfunction exceeded(\n limits: readonly ProviderLimit[],\n changes: readonly Change[],\n resulting: Layer,\n): BatchResult | null {\n const written = changes.map((change) => (change.kind === 'move' ? change.to : change.path));\n const created = changes\n .filter((change) => change.kind === 'create' || change.kind === 'move')\n .map((change) => (change.kind === 'move' ? change.to : change.path));\n for (const limit of limits) {\n const value = limit.value;\n if (typeof value !== 'number') continue;\n if (limit.name === 'change-batch-operations' && changes.length > value) {\n return refuse('provider-limit', undefined, limit.name);\n }\n if (limit.name === 'document-size') {\n const large = written.find((path) => (resulting.documents[path] ?? '').length > value);\n if (large !== undefined) return refuse('provider-limit', large, limit.name);\n }\n if (limit.name === 'path-length') {\n const long = created.find((path) => path.length > value);\n if (long !== undefined) return refuse('provider-limit', long, limit.name);\n }\n if (limit.name === 'path-depth') {\n const deep = created.find((path) => depth(path) > value);\n if (deep !== undefined) return refuse('provider-limit', deep, limit.name);\n }\n }\n return null;\n}\n\nexport function buildBatch(input: SaveInput): BatchResult {\n const structural = input.changes.find(\n (change) => change.kind === 'move' || change.kind === 'remove',\n );\n if (\n structural !== undefined &&\n Object.entries(input.visible.collection.documents).some(\n ([path, document]) =>\n document.type !== undefined &&\n document.type !== 'any' &&\n governing(input.composition, path).status === 'unavailable',\n )\n )\n return refuse('model-unavailable', structural.path);\n if (input.changes.length === 0) return refuse('no-change');\n const rewritten = rewrites(input.changes, input.visible);\n if (rewritten.kind === 'refused') return rewritten;\n const changes = input.rewriting === 'provider' ? input.changes : rewritten.changes;\n const refusal = guard(changes, input);\n if (refusal !== null) return refusal;\n const preconditions = preconditionsOf(changes, input.visible, input.bases);\n const predicted =\n input.rewriting === 'provider'\n ? anticipated(changes, preconditions, rewritten.changes, input.visible)\n : { changes, preconditions };\n const resulting = overlay(input.visible, [\n { id: '', baseRoomVersion: input.baseRoomVersion, ...predicted },\n ]);\n const removed = new Set(\n changes.filter((change) => change.kind === 'remove').map((change) => change.path),\n );\n if (removed.size > 0) {\n const referenced = incoming(parseCollection(resulting.documents, input.composition), removed);\n if (referenced !== null) return referenced;\n }\n const typed = (content: string | undefined) => {\n if (content === undefined) return false;\n const parsed = parse(content);\n return parsed.ok && parsed.document.type !== undefined && parsed.document.type !== 'any';\n };\n const typedPaths = [...new Set(predicted.changes.flatMap(affected))].filter(\n (path) => typed(input.visible.documents[path]) || typed(resulting.documents[path]),\n );\n const needsModel = typedPaths.length > 0;\n const withoutModel = typedPaths.find(\n (path) => governing(input.composition, path).status === 'unavailable',\n );\n if (withoutModel !== undefined) return refuse('model-unavailable', withoutModel);\n const validationText = needsModel\n ? resulting.documents\n : Object.fromEntries(\n Object.entries(resulting.documents).filter(([path]) =>\n predicted.changes.some((change) => affected(change).includes(path)),\n ),\n );\n const verdict = validateCollection(validationText, resulting.binaryTargets, input.composition);\n if (verdict.verdict === 'refuse') {\n return {\n kind: 'refused',\n refusal: {\n rule: verdict.rule,\n file: verdict.file,\n ...(verdict.location === undefined ? {} : { location: verdict.location }),\n ...(verdict.referrers === undefined ? {} : { referrers: verdict.referrers }),\n },\n };\n }\n const limited = exceeded(input.providerLimits, changes, resulting);\n if (limited !== null) return limited;\n const validated = typedPaths\n .map((path) => governing(input.composition, path))\n .find(\n (model): model is Extract<ModelState, { status: 'current' | 'cached' }> =>\n model.status !== 'unavailable',\n );\n return {\n kind: 'batch',\n batch: immutable({\n id: changeBatchIdentity(),\n baseRoomVersion: input.baseRoomVersion,\n changes,\n preconditions,\n ...(input.writtenBy === undefined ? {} : { writtenBy: input.writtenBy }),\n ...(validated === undefined\n ? {}\n : {\n validation: {\n identity: validated.snapshot.identity,\n version: validated.snapshot.version,\n source: validated.status,\n },\n }),\n }),\n };\n}\n"],"names":["definitionOf","apply","links","parse","serialize","immutable","governing","parseCollection","validateCollection","changeBatchIdentity","overlay","covered","normalize","relative","resolve","refuse","rule","file","location","kind","refusal","undefined","referenceField","spec","of","retarget","value","from","to","moves","Array","isArray","next","map","item","some","index","target","get","edited","document","path","changes","change","applied","prior","preamble","name","sections","outcome","bodies","before","after","push","Object","entries","relinks","moved","link","destination","href","type","content","subsumed","merged","length","splice","rewrites","visible","Map","settled","Set","set","add","size","added","collection","documents","has","definition","composition","fields","relinked","findIndex","anticipated","preconditions","rewritten","derived","filter","includes","preconditionsOf","providerRewritten","batch","targets","values","resolved","incoming","removed","found","note","referrers","first","keys","sort","every","affected","guard","input","existing","binaryTargets","normalized","providerOwnedPaths","operation","operations","delete","revisions","existence","revision","sameTarget","precondition","bases","seen","part","identity","based","find","base","depth","split","exceeded","limits","resulting","written","created","limit","large","long","deep","buildBatch","structural","status","rewriting","predicted","id","baseRoomVersion","referenced","typed","parsed","ok","typedPaths","flatMap","needsModel","withoutModel","validationText","fromEntries","verdict","limited","providerLimits","validated","model","writtenBy","validation","snapshot","version","source"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/workspace/packages/mdruntime/src/save.ts"],"sourcesContent":["import { definitionOf, type ModelState } from './model.js';\nimport {\n apply,\n links,\n parse,\n retarget,\n serialize,\n target,\n type Document,\n type FieldSpec,\n} from '@agentshouse/mdmodel';\nimport type { ProviderLimit } from './adapter.js';\nimport {\n immutable,\n type Change,\n type ChangeBatch,\n type Precondition,\n type WrittenBy,\n} from './change.js';\nimport {\n governing,\n parseCollection,\n validateCollection,\n type Collection,\n type Composition,\n} from './collection.js';\nimport { changeBatchIdentity } from './identity.js';\nimport { overlay, type Layer } from './overlay.js';\nimport { covered, normalize, relative } from './paths.js';\nimport type { VisibleLayer } from './replica.js';\nimport type { ChangedPart } from './room-draft.js';\n\nexport type SaveRefusal = {\n rule: string;\n file?: string;\n location?: string;\n referrers?: readonly string[];\n parts?: readonly ChangedPart[];\n};\n\nexport type Rewriting = 'runtime' | 'provider';\n\nexport type SaveInput = {\n composition: Composition;\n rewriting: Rewriting;\n baseRoomVersion: string;\n operations: import('./adapter.js').OperationScopes;\n providerOwnedPaths: readonly string[];\n providerLimits: readonly ProviderLimit[];\n visible: VisibleLayer;\n changes: readonly Change[];\n bases: readonly Precondition[];\n writtenBy?: WrittenBy;\n};\n\nexport type BatchResult =\n | { kind: 'batch'; batch: ChangeBatch }\n | { kind: 'refused'; refusal: SaveRefusal };\n\ntype Expansion =\n | { kind: 'changes'; changes: readonly Change[] }\n | { kind: 'refused'; refusal: SaveRefusal };\n\nfunction refuse(rule: string, file?: string, location?: string): BatchResult {\n return {\n kind: 'refused',\n refusal: {\n rule,\n ...(file === undefined ? {} : { file }),\n ...(location === undefined ? {} : { location }),\n },\n };\n}\n\nfunction referenceField(spec: FieldSpec): boolean {\n return spec.kind === 'reference' || (spec.kind === 'list' && spec.of.kind === 'reference');\n}\n\nfunction repointed(\n value: unknown,\n from: string,\n to: string,\n moves: ReadonlyMap<string, string>,\n): unknown {\n if (Array.isArray(value)) {\n const next = value.map((item) => repointed(item, from, to, moves) ?? item);\n return next.some((item, index) => item !== value[index]) ? next : undefined;\n }\n if (typeof value !== 'string') return undefined;\n const named = target(from, value);\n if (named === null) return undefined;\n const destination = moves.get(named) ?? named;\n return target(to, value) === destination ? undefined : retarget(value, relative(to, destination));\n}\n\nfunction edited(document: Document, path: string, changes: readonly Change[]): Document {\n let next = document;\n for (const change of changes) {\n if (change.path !== path) continue;\n if (change.kind !== 'section' && change.kind !== 'preamble') continue;\n const applied = apply(\n next,\n change.kind === 'preamble'\n ? { kind: 'preamble', value: change.value, prior: next.preamble }\n : {\n kind: 'section',\n name: change.name,\n value: change.value,\n prior: next.sections[change.name],\n },\n );\n if (applied.outcome === 'applied') next = applied.document;\n }\n return next;\n}\n\nfunction bodies(path: string, before: Document, after: Document): readonly Change[] {\n const changes: Change[] = [];\n if (after.preamble !== before.preamble) {\n changes.push({ kind: 'preamble', path, value: after.preamble });\n }\n for (const [name, value] of Object.entries(after.sections)) {\n if (before.sections[name] === value) continue;\n changes.push({ kind: 'section', path, name, value });\n }\n return changes;\n}\n\nfunction relinks(\n path: string,\n moved: string,\n before: Document,\n moves: ReadonlyMap<string, string>,\n): Expansion {\n let after = before;\n for (const link of links(before, path)) {\n const destination = moves.get(link.target) ?? link.target;\n if (destination === link.target && moved === path) continue;\n const to = relative(moved, destination);\n if (to === relative(path, link.target)) continue;\n const applied = apply(after, { kind: 'link', href: link.href, to });\n if (applied.outcome === 'refuse') {\n return {\n kind: 'refused',\n refusal: {\n rule: applied.refusal.rule,\n file: path,\n ...(applied.refusal.location === undefined ? {} : { location: applied.refusal.location }),\n },\n };\n }\n after = applied.document;\n }\n if (after === before) return { kind: 'changes', changes: [] };\n if (before.type === undefined) {\n return { kind: 'changes', changes: [{ kind: 'replace', path, content: serialize(after) }] };\n }\n return { kind: 'changes', changes: bodies(path, before, after) };\n}\n\nfunction subsumed(merged: Change[], path: string) {\n for (let index = merged.length - 1; index >= 0; index -= 1) {\n const item = merged[index];\n if (item.path !== path) continue;\n if (item.kind === 'section' || item.kind === 'preamble') merged.splice(index, 1);\n }\n}\n\nfunction rewrites(changes: readonly Change[], visible: VisibleLayer): Expansion {\n const moves = new Map<string, string>();\n const settled = new Set<string>();\n for (const change of changes) {\n if (change.kind === 'move') moves.set(change.path, change.to);\n if (change.kind === 'remove' || change.kind === 'replace' || change.kind === 'create') {\n settled.add(change.path);\n }\n if (change.kind === 'field') settled.add(`${change.path} ${change.name}`);\n }\n if (moves.size === 0) return { kind: 'changes', changes };\n const merged = [...changes];\n const added: Change[] = [];\n for (const [path, document] of Object.entries(visible.collection.documents)) {\n if (settled.has(path)) continue;\n const moved = moves.get(path) ?? path;\n const definition = definitionOf(governing(visible.collection.composition, path), document.type);\n for (const [name, spec] of Object.entries(definition?.fields ?? {})) {\n if (!referenceField(spec) || settled.has(`${path} ${name}`)) continue;\n const value = repointed(document.fields[name], path, moved, moves);\n if (value === undefined) continue;\n added.push({ kind: 'field', path, name, value });\n }\n const relinked = relinks(path, moved, edited(document, path, merged), moves);\n if (relinked.kind === 'refused') return relinked;\n for (const change of relinked.changes) {\n if (change.kind === 'replace') {\n subsumed(merged, path);\n added.push(change);\n continue;\n }\n const index = merged.findIndex(\n (item) =>\n item.kind === change.kind &&\n item.path === path &&\n (change.kind !== 'section' || (item.kind === 'section' && item.name === change.name)),\n );\n if (index === -1) added.push(change);\n else merged[index] = change;\n }\n }\n return { kind: 'changes', changes: [...added, ...merged] };\n}\n\nfunction anticipated(\n changes: readonly Change[],\n preconditions: readonly Precondition[],\n rewritten: readonly Change[],\n visible: VisibleLayer,\n) {\n const derived = rewritten.filter((change) => !changes.includes(change));\n return {\n changes: rewritten,\n preconditions: [...preconditionsOf(derived, visible, []), ...preconditions],\n };\n}\n\nexport function providerRewritten(batch: ChangeBatch, visible: VisibleLayer): ChangeBatch {\n const rewritten = rewrites(batch.changes, visible);\n if (rewritten.kind === 'refused') return batch;\n return {\n ...batch,\n ...anticipated(batch.changes, batch.preconditions, rewritten.changes, visible),\n };\n}\n\nfunction targets(value: unknown, from: string): readonly string[] {\n const values = Array.isArray(value) ? value : [value];\n const resolved: string[] = [];\n for (const item of values) {\n if (typeof item !== 'string') continue;\n const named = target(from, item);\n if (named !== null) resolved.push(named);\n }\n return resolved;\n}\n\nfunction incoming(collection: Collection, removed: ReadonlySet<string>): BatchResult | null {\n const found = new Map<string, Set<string>>();\n const note = (target: string, file: string) => {\n if (!removed.has(target)) return;\n const referrers = found.get(target) ?? new Set<string>();\n referrers.add(file);\n found.set(target, referrers);\n };\n for (const [path, document] of Object.entries(collection.documents)) {\n const definition = definitionOf(governing(collection.composition, path), document.type);\n for (const [name, spec] of Object.entries(definition?.fields ?? {})) {\n if (!referenceField(spec)) continue;\n for (const named of targets(document.fields[name], path)) note(named, path);\n }\n for (const link of links(document, path)) note(link.target, path);\n }\n const [first] = [...found.keys()].sort();\n if (first === undefined) return null;\n const every = new Set<string>();\n for (const referrers of found.values()) for (const file of referrers) every.add(file);\n return {\n kind: 'refused',\n refusal: { rule: 'referenced-missing-file', file: first, referrers: [...every].sort() },\n };\n}\n\nfunction affected(change: Change): readonly string[] {\n return change.kind === 'move' ? [change.path, change.to] : [change.path];\n}\n\nfunction guard(changes: readonly Change[], input: SaveInput): BatchResult | null {\n const existing = new Set([\n ...Object.keys(input.visible.documents),\n ...input.visible.binaryTargets,\n ]);\n for (const change of changes) {\n for (const path of affected(change)) {\n const normalized = normalize(path);\n if (normalized === null || normalized === '') return refuse('room-root', path);\n if (covered(input.providerOwnedPaths, normalized)) {\n return refuse('provider-owned-path', normalized);\n }\n const operation = change.kind === 'remove' ? 'delete' : 'write';\n if (!covered(input.operations[operation], normalized))\n return refuse(`${operation}-grant`, normalized);\n }\n if (change.kind === 'create') {\n if (existing.has(change.path)) return refuse('path-collision', change.path);\n existing.add(change.path);\n continue;\n }\n if (change.kind === 'move') {\n if (!existing.has(change.path)) return refuse('path-absent', change.path);\n if (existing.has(change.to)) return refuse('path-collision', change.to);\n existing.delete(change.path);\n existing.add(change.to);\n continue;\n }\n if (!existing.has(change.path)) return refuse('path-absent', change.path);\n if (change.kind === 'remove') {\n existing.delete(change.path);\n continue;\n }\n if (change.kind === 'replace') {\n if (input.visible.revisions[change.path] === undefined) {\n return refuse('unknown-revision', change.path);\n }\n continue;\n }\n if (input.visible.collection.documents[change.path] === undefined) {\n return refuse('path-absent', change.path);\n }\n }\n return null;\n}\n\nfunction existence(visible: VisibleLayer, path: string): Precondition {\n const revision = visible.revisions[path];\n return revision === undefined ? { kind: 'present', path } : { kind: 'revision', path, revision };\n}\n\nfunction sameTarget(precondition: Precondition, change: Change): boolean {\n if (precondition.kind !== change.kind || precondition.path !== change.path) return false;\n return (\n (precondition.kind !== 'field' && precondition.kind !== 'section') ||\n ((change.kind === 'field' || change.kind === 'section') && precondition.name === change.name)\n );\n}\n\nfunction preconditionsOf(\n changes: readonly Change[],\n visible: VisibleLayer,\n bases: readonly Precondition[],\n): readonly Precondition[] {\n const preconditions: Precondition[] = [];\n const seen = new Set<string>();\n const add = (precondition: Precondition) => {\n const part =\n precondition.kind === 'field' || precondition.kind === 'section' ? precondition.name : '';\n const identity = `${precondition.kind} ${precondition.path} ${part}`;\n if (seen.has(identity)) return;\n seen.add(identity);\n preconditions.push(precondition);\n };\n for (const change of changes) {\n if (change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble') {\n const based = bases.find((base) => sameTarget(base, change));\n if (based !== undefined) {\n add(based);\n continue;\n }\n const document = visible.collection.documents[change.path];\n if (change.kind === 'field') {\n add({\n kind: 'field',\n path: change.path,\n name: change.name,\n value: document.fields[change.name],\n });\n } else if (change.kind === 'section') {\n add({\n kind: 'section',\n path: change.path,\n name: change.name,\n value: document.sections[change.name],\n });\n } else add({ kind: 'preamble', path: change.path, value: document.preamble });\n continue;\n }\n if (change.kind === 'create') {\n add({ kind: 'absent', path: change.path });\n continue;\n }\n add(existence(visible, change.path));\n if (change.kind === 'move') add({ kind: 'absent', path: change.to });\n }\n return preconditions;\n}\n\nfunction depth(path: string) {\n return path.split('/').length;\n}\n\nfunction exceeded(\n limits: readonly ProviderLimit[],\n changes: readonly Change[],\n resulting: Layer,\n): BatchResult | null {\n const written = changes.map((change) => (change.kind === 'move' ? change.to : change.path));\n const created = changes\n .filter((change) => change.kind === 'create' || change.kind === 'move')\n .map((change) => (change.kind === 'move' ? change.to : change.path));\n for (const limit of limits) {\n const value = limit.value;\n if (typeof value !== 'number') continue;\n if (limit.name === 'change-batch-operations' && changes.length > value) {\n return refuse('provider-limit', undefined, limit.name);\n }\n if (limit.name === 'document-size') {\n const large = written.find((path) => (resulting.documents[path] ?? '').length > value);\n if (large !== undefined) return refuse('provider-limit', large, limit.name);\n }\n if (limit.name === 'path-length') {\n const long = created.find((path) => path.length > value);\n if (long !== undefined) return refuse('provider-limit', long, limit.name);\n }\n if (limit.name === 'path-depth') {\n const deep = created.find((path) => depth(path) > value);\n if (deep !== undefined) return refuse('provider-limit', deep, limit.name);\n }\n }\n return null;\n}\n\nexport function buildBatch(input: SaveInput): BatchResult {\n const structural = input.changes.find(\n (change) => change.kind === 'move' || change.kind === 'remove',\n );\n if (\n structural !== undefined &&\n Object.entries(input.visible.collection.documents).some(\n ([path, document]) =>\n document.type !== undefined &&\n document.type !== 'any' &&\n governing(input.composition, path).status === 'unavailable',\n )\n )\n return refuse('model-unavailable', structural.path);\n if (input.changes.length === 0) return refuse('no-change');\n const rewritten = rewrites(input.changes, input.visible);\n if (rewritten.kind === 'refused') return rewritten;\n const changes = input.rewriting === 'provider' ? input.changes : rewritten.changes;\n const refusal = guard(changes, input);\n if (refusal !== null) return refusal;\n const preconditions = preconditionsOf(changes, input.visible, input.bases);\n const predicted =\n input.rewriting === 'provider'\n ? anticipated(changes, preconditions, rewritten.changes, input.visible)\n : { changes, preconditions };\n const resulting = overlay(input.visible, [\n { id: '', baseRoomVersion: input.baseRoomVersion, ...predicted },\n ]);\n const removed = new Set(\n changes.filter((change) => change.kind === 'remove').map((change) => change.path),\n );\n if (removed.size > 0) {\n const referenced = incoming(parseCollection(resulting.documents, input.composition), removed);\n if (referenced !== null) return referenced;\n }\n const typed = (content: string | undefined) => {\n if (content === undefined) return false;\n const parsed = parse(content);\n return parsed.ok && parsed.document.type !== undefined && parsed.document.type !== 'any';\n };\n const typedPaths = [...new Set(predicted.changes.flatMap(affected))].filter(\n (path) => typed(input.visible.documents[path]) || typed(resulting.documents[path]),\n );\n const needsModel = typedPaths.length > 0;\n const withoutModel = typedPaths.find(\n (path) => governing(input.composition, path).status === 'unavailable',\n );\n if (withoutModel !== undefined) return refuse('model-unavailable', withoutModel);\n const validationText = needsModel\n ? resulting.documents\n : Object.fromEntries(\n Object.entries(resulting.documents).filter(([path]) =>\n predicted.changes.some((change) => affected(change).includes(path)),\n ),\n );\n const verdict = validateCollection(validationText, resulting.binaryTargets, input.composition);\n if (verdict.verdict === 'refuse') {\n return {\n kind: 'refused',\n refusal: {\n rule: verdict.rule,\n file: verdict.file,\n ...(verdict.location === undefined ? {} : { location: verdict.location }),\n ...(verdict.referrers === undefined ? {} : { referrers: verdict.referrers }),\n },\n };\n }\n const limited = exceeded(input.providerLimits, changes, resulting);\n if (limited !== null) return limited;\n const validated = typedPaths\n .map((path) => governing(input.composition, path))\n .find(\n (model): model is Extract<ModelState, { status: 'current' | 'cached' }> =>\n model.status !== 'unavailable',\n );\n return {\n kind: 'batch',\n batch: immutable({\n id: changeBatchIdentity(),\n baseRoomVersion: input.baseRoomVersion,\n changes,\n preconditions,\n ...(input.writtenBy === undefined ? {} : { writtenBy: input.writtenBy }),\n ...(validated === undefined\n ? {}\n : {\n validation: {\n identity: validated.snapshot.identity,\n version: validated.snapshot.version,\n source: validated.status,\n },\n }),\n }),\n };\n}\n"],"names":["definitionOf","apply","links","parse","retarget","serialize","target","immutable","governing","parseCollection","validateCollection","changeBatchIdentity","overlay","covered","normalize","relative","refuse","rule","file","location","kind","refusal","undefined","referenceField","spec","of","repointed","value","from","to","moves","Array","isArray","next","map","item","some","index","named","destination","get","edited","document","path","changes","change","applied","prior","preamble","name","sections","outcome","bodies","before","after","push","Object","entries","relinks","moved","link","href","type","content","subsumed","merged","length","splice","rewrites","visible","Map","settled","Set","set","add","size","added","collection","documents","has","definition","composition","fields","relinked","findIndex","anticipated","preconditions","rewritten","derived","filter","includes","preconditionsOf","providerRewritten","batch","targets","values","resolved","incoming","removed","found","note","referrers","first","keys","sort","every","affected","guard","input","existing","binaryTargets","normalized","providerOwnedPaths","operation","operations","delete","revisions","existence","revision","sameTarget","precondition","bases","seen","part","identity","based","find","base","depth","split","exceeded","limits","resulting","written","created","limit","large","long","deep","buildBatch","structural","status","rewriting","predicted","id","baseRoomVersion","referenced","typed","parsed","ok","typedPaths","flatMap","needsModel","withoutModel","validationText","fromEntries","verdict","limited","providerLimits","validated","model","writtenBy","validation","snapshot","version","source"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentshouse/mdruntime",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.29",
|
|
4
4
|
"description": "The headless core of MD App",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"url": "https://github.com/agentshouse/mdruntime/issues"
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@agentshouse/mdmodel": "0.1.0-alpha.
|
|
48
|
+
"@agentshouse/mdmodel": "0.1.0-alpha.15",
|
|
49
49
|
"@tanstack/db": "0.9.2",
|
|
50
50
|
"minisearch": "7.2.0"
|
|
51
51
|
}
|