@agentshouse/mdruntime-adapter 0.1.0-alpha.1 → 0.1.0-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/AGENTS.md +82 -0
  2. package/dist/actions.d.ts +16 -0
  3. package/dist/actions.d.ts.map +1 -0
  4. package/dist/actions.js +454 -0
  5. package/dist/actions.js.map +1 -0
  6. package/dist/adapter.d.ts +10 -0
  7. package/dist/adapter.d.ts.map +1 -0
  8. package/dist/adapter.js +285 -0
  9. package/dist/adapter.js.map +1 -0
  10. package/dist/digest.d.ts +3 -0
  11. package/dist/digest.d.ts.map +1 -0
  12. package/dist/digest.js +11 -0
  13. package/dist/digest.js.map +1 -0
  14. package/dist/discovery.d.ts +87 -0
  15. package/dist/discovery.d.ts.map +1 -0
  16. package/dist/discovery.js +347 -0
  17. package/dist/discovery.js.map +1 -0
  18. package/dist/index.d.ts +3 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +2 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/map.d.ts +3 -0
  23. package/dist/map.d.ts.map +1 -0
  24. package/dist/map.js +15 -0
  25. package/dist/map.js.map +1 -0
  26. package/dist/model.d.ts +19 -0
  27. package/dist/model.d.ts.map +1 -0
  28. package/dist/model.js +64 -0
  29. package/dist/model.js.map +1 -0
  30. package/dist/read.d.ts +73 -0
  31. package/dist/read.d.ts.map +1 -0
  32. package/dist/read.js +326 -0
  33. package/dist/read.js.map +1 -0
  34. package/dist/refusal.d.ts +11 -0
  35. package/dist/refusal.d.ts.map +1 -0
  36. package/dist/refusal.js +78 -0
  37. package/dist/refusal.js.map +1 -0
  38. package/dist/site.d.ts +4 -0
  39. package/dist/site.d.ts.map +1 -0
  40. package/dist/site.js +200 -0
  41. package/dist/site.js.map +1 -0
  42. package/dist/stream.d.ts +12 -0
  43. package/dist/stream.d.ts.map +1 -0
  44. package/dist/stream.js +298 -0
  45. package/dist/stream.js.map +1 -0
  46. package/dist/transport.d.ts +88 -0
  47. package/dist/transport.d.ts.map +1 -0
  48. package/dist/transport.js +12 -0
  49. package/dist/transport.js.map +1 -0
  50. package/dist/version.d.ts +14 -0
  51. package/dist/version.d.ts.map +1 -0
  52. package/dist/version.js +29 -0
  53. package/dist/version.js.map +1 -0
  54. package/dist/write.d.ts +47 -0
  55. package/dist/write.d.ts.map +1 -0
  56. package/dist/write.js +389 -0
  57. package/dist/write.js.map +1 -0
  58. package/package.json +7 -2
@@ -0,0 +1,88 @@
1
+ export declare const DOOR_DISCOVER = "/door/discover";
2
+ export declare const DOOR_BOOTSTRAP = "/door/bootstrap";
3
+ export declare const DOOR_ENUMERATE = "/door/enumerate";
4
+ export declare const DOOR_BATCH = "/door/batch";
5
+ export declare const DOOR_BATCH_UPLOAD = "/door/batch-upload";
6
+ export declare const DOOR_REVISIONS = "/door/revisions";
7
+ export declare const SITE_DOOR_DISCOVER = "/_house/door/discover";
8
+ export declare const SITE_DOOR_BOOTSTRAP = "/_house/door/bootstrap/";
9
+ export declare const SITE_DOOR_ENUMERATE = "/_house/door/enumerate";
10
+ export declare const PRIVATE_AUTHORITY = "private";
11
+ export type HouseMode = 'credential' | 'site';
12
+ export type HouseDoorAnswer = {
13
+ status: number;
14
+ body: unknown;
15
+ };
16
+ export type HouseByteAct = 'working_copy_bundle' | 'authored_batch_upload' | 'conversation_original_upload';
17
+ export type HouseByteBody = string | ArrayBuffer | Uint8Array;
18
+ export type HouseByteTransfer = {
19
+ act: HouseByteAct;
20
+ method: 'GET' | 'POST';
21
+ url: string;
22
+ body?: HouseByteBody;
23
+ operation?: string;
24
+ };
25
+ export type HouseStreamAuthority = {
26
+ kind: 'room';
27
+ room: string;
28
+ } | {
29
+ kind: 'private';
30
+ } | {
31
+ kind: 'conversation';
32
+ conversation: string;
33
+ };
34
+ export type HouseStreamEntry = {
35
+ path: string;
36
+ kind: 'edited' | 'removed';
37
+ revision?: string;
38
+ text?: string;
39
+ };
40
+ export type HouseStreamFrame = {
41
+ type: 'entries';
42
+ authority: string;
43
+ position: string;
44
+ log_epoch: string;
45
+ entries: readonly HouseStreamEntry[];
46
+ } | {
47
+ type: 'subscribed';
48
+ authority: string;
49
+ position?: string;
50
+ log_epoch?: string;
51
+ } | {
52
+ type: 'refused';
53
+ authority: string;
54
+ code: string;
55
+ } | {
56
+ type: 'unsubscribed';
57
+ authority: string;
58
+ code?: string;
59
+ } | {
60
+ type: 'draft';
61
+ conversation_id: string;
62
+ session_id: string;
63
+ turn_id: string;
64
+ text: string;
65
+ } | {
66
+ type: 'message';
67
+ conversation_id: string;
68
+ message: unknown;
69
+ } | {
70
+ type: 'session';
71
+ conversation_id: string;
72
+ summary: unknown;
73
+ };
74
+ export type HouseStream = {
75
+ subscribe(authorities: readonly HouseStreamAuthority[]): void;
76
+ observe(receive: (frame: HouseStreamFrame) => void): () => void;
77
+ };
78
+ export type HouseDoor = {
79
+ door(route: string, body: unknown): Promise<HouseDoorAnswer>;
80
+ stream: HouseStream;
81
+ };
82
+ export type HouseTransport = HouseDoor & {
83
+ transfer(request: HouseByteTransfer): Promise<HouseDoorAnswer>;
84
+ };
85
+ export type HouseSiteTransport = HouseDoor & {
86
+ read(route: string): Promise<HouseDoorAnswer>;
87
+ };
88
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export const DOOR_DISCOVER = '/door/discover';
2
+ export const DOOR_BOOTSTRAP = '/door/bootstrap';
3
+ export const DOOR_ENUMERATE = '/door/enumerate';
4
+ export const DOOR_BATCH = '/door/batch';
5
+ export const DOOR_BATCH_UPLOAD = '/door/batch-upload';
6
+ export const DOOR_REVISIONS = '/door/revisions';
7
+ export const SITE_DOOR_DISCOVER = '/_house/door/discover';
8
+ export const SITE_DOOR_BOOTSTRAP = '/_house/door/bootstrap/';
9
+ export const SITE_DOOR_ENUMERATE = '/_house/door/enumerate';
10
+ export const PRIVATE_AUTHORITY = 'private';
11
+
12
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/transport.ts"],"sourcesContent":["export const DOOR_DISCOVER = '/door/discover';\n\nexport const DOOR_BOOTSTRAP = '/door/bootstrap';\n\nexport const DOOR_ENUMERATE = '/door/enumerate';\n\nexport const DOOR_BATCH = '/door/batch';\n\nexport const DOOR_BATCH_UPLOAD = '/door/batch-upload';\n\nexport const DOOR_REVISIONS = '/door/revisions';\n\nexport const SITE_DOOR_DISCOVER = '/_house/door/discover';\n\nexport const SITE_DOOR_BOOTSTRAP = '/_house/door/bootstrap/';\n\nexport const SITE_DOOR_ENUMERATE = '/_house/door/enumerate';\n\nexport const PRIVATE_AUTHORITY = 'private';\n\nexport type HouseMode = 'credential' | 'site';\n\nexport type HouseDoorAnswer = {\n status: number;\n body: unknown;\n};\n\nexport type HouseByteAct =\n | 'working_copy_bundle'\n | 'authored_batch_upload'\n | 'conversation_original_upload';\n\nexport type HouseByteBody = string | ArrayBuffer | Uint8Array;\n\nexport type HouseByteTransfer = {\n act: HouseByteAct;\n method: 'GET' | 'POST';\n url: string;\n body?: HouseByteBody;\n operation?: string;\n};\n\nexport type HouseStreamAuthority =\n | { kind: 'room'; room: string }\n | { kind: 'private' }\n | { kind: 'conversation'; conversation: string };\n\nexport type HouseStreamEntry = {\n path: string;\n kind: 'edited' | 'removed';\n revision?: string;\n text?: string;\n};\n\nexport type HouseStreamFrame =\n | {\n type: 'entries';\n authority: string;\n position: string;\n log_epoch: string;\n entries: readonly HouseStreamEntry[];\n }\n | { type: 'subscribed'; authority: string; position?: string; log_epoch?: string }\n | { type: 'refused'; authority: string; code: string }\n | { type: 'unsubscribed'; authority: string; code?: string }\n | {\n type: 'draft';\n conversation_id: string;\n session_id: string;\n turn_id: string;\n text: string;\n }\n | { type: 'message'; conversation_id: string; message: unknown }\n | { type: 'session'; conversation_id: string; summary: unknown };\n\nexport type HouseStream = {\n subscribe(authorities: readonly HouseStreamAuthority[]): void;\n observe(receive: (frame: HouseStreamFrame) => void): () => void;\n};\n\nexport type HouseDoor = {\n door(route: string, body: unknown): Promise<HouseDoorAnswer>;\n stream: HouseStream;\n};\n\nexport type HouseTransport = HouseDoor & {\n transfer(request: HouseByteTransfer): Promise<HouseDoorAnswer>;\n};\n\nexport type HouseSiteTransport = HouseDoor & {\n read(route: string): Promise<HouseDoorAnswer>;\n};\n"],"names":["DOOR_DISCOVER","DOOR_BOOTSTRAP","DOOR_ENUMERATE","DOOR_BATCH","DOOR_BATCH_UPLOAD","DOOR_REVISIONS","SITE_DOOR_DISCOVER","SITE_DOOR_BOOTSTRAP","SITE_DOOR_ENUMERATE","PRIVATE_AUTHORITY"],"mappings":"AAAA,OAAO,MAAMA,gBAAgB,iBAAiB;AAE9C,OAAO,MAAMC,iBAAiB,kBAAkB;AAEhD,OAAO,MAAMC,iBAAiB,kBAAkB;AAEhD,OAAO,MAAMC,aAAa,cAAc;AAExC,OAAO,MAAMC,oBAAoB,qBAAqB;AAEtD,OAAO,MAAMC,iBAAiB,kBAAkB;AAEhD,OAAO,MAAMC,qBAAqB,wBAAwB;AAE1D,OAAO,MAAMC,sBAAsB,0BAA0B;AAE7D,OAAO,MAAMC,sBAAsB,yBAAyB;AAE5D,OAAO,MAAMC,oBAAoB,UAAU"}
@@ -0,0 +1,14 @@
1
+ export type LogPosition = {
2
+ position: string;
3
+ logEpoch: string;
4
+ };
5
+ export type PresentedPosition = {
6
+ authority: string;
7
+ position: string;
8
+ log_epoch: string;
9
+ };
10
+ export declare function roomVersion(at: LogPosition): string;
11
+ export declare function logPosition(version: string): LogPosition | null;
12
+ export declare function readPosition(held: Readonly<Record<string, unknown>>): LogPosition | null;
13
+ export declare function presented(authority: string, at: LogPosition): PresentedPosition;
14
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAAE,EAAE,WAAW,GAAG,MAAM,CAEnD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAI/D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,WAAW,GAAG,IAAI,CAKxF;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,GAAG,iBAAiB,CAE/E"}
@@ -0,0 +1,29 @@
1
+ export function roomVersion(at) {
2
+ return `${at.logEpoch}:${at.position}`;
3
+ }
4
+ export function logPosition(version) {
5
+ const split = version.lastIndexOf(':');
6
+ if (split < 1 || split === version.length - 1) return null;
7
+ return {
8
+ logEpoch: version.slice(0, split),
9
+ position: version.slice(split + 1)
10
+ };
11
+ }
12
+ export function readPosition(held) {
13
+ const { position, log_epoch: logEpoch } = held;
14
+ if (typeof position !== 'string' || position.length === 0) return null;
15
+ if (typeof logEpoch !== 'string' || logEpoch.length === 0) return null;
16
+ return {
17
+ position,
18
+ logEpoch
19
+ };
20
+ }
21
+ export function presented(authority, at) {
22
+ return {
23
+ authority,
24
+ position: at.position,
25
+ log_epoch: at.logEpoch
26
+ };
27
+ }
28
+
29
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/version.ts"],"sourcesContent":["export type LogPosition = {\n position: string;\n logEpoch: string;\n};\n\nexport type PresentedPosition = {\n authority: string;\n position: string;\n log_epoch: string;\n};\n\nexport function roomVersion(at: LogPosition): string {\n return `${at.logEpoch}:${at.position}`;\n}\n\nexport function logPosition(version: string): LogPosition | null {\n const split = version.lastIndexOf(':');\n if (split < 1 || split === version.length - 1) return null;\n return { logEpoch: version.slice(0, split), position: version.slice(split + 1) };\n}\n\nexport function readPosition(held: Readonly<Record<string, unknown>>): LogPosition | null {\n const { position, log_epoch: logEpoch } = held;\n if (typeof position !== 'string' || position.length === 0) return null;\n if (typeof logEpoch !== 'string' || logEpoch.length === 0) return null;\n return { position, logEpoch };\n}\n\nexport function presented(authority: string, at: LogPosition): PresentedPosition {\n return { authority, position: at.position, log_epoch: at.logEpoch };\n}\n"],"names":["roomVersion","at","logEpoch","position","logPosition","version","split","lastIndexOf","length","slice","readPosition","held","log_epoch","presented","authority"],"mappings":"AAWA,OAAO,SAASA,YAAYC,EAAe;IACzC,OAAO,GAAGA,GAAGC,QAAQ,CAAC,CAAC,EAAED,GAAGE,QAAQ,EAAE;AACxC;AAEA,OAAO,SAASC,YAAYC,OAAe;IACzC,MAAMC,QAAQD,QAAQE,WAAW,CAAC;IAClC,IAAID,QAAQ,KAAKA,UAAUD,QAAQG,MAAM,GAAG,GAAG,OAAO;IACtD,OAAO;QAAEN,UAAUG,QAAQI,KAAK,CAAC,GAAGH;QAAQH,UAAUE,QAAQI,KAAK,CAACH,QAAQ;IAAG;AACjF;AAEA,OAAO,SAASI,aAAaC,IAAuC;IAClE,MAAM,EAAER,QAAQ,EAAES,WAAWV,QAAQ,EAAE,GAAGS;IAC1C,IAAI,OAAOR,aAAa,YAAYA,SAASK,MAAM,KAAK,GAAG,OAAO;IAClE,IAAI,OAAON,aAAa,YAAYA,SAASM,MAAM,KAAK,GAAG,OAAO;IAClE,OAAO;QAAEL;QAAUD;IAAS;AAC9B;AAEA,OAAO,SAASW,UAAUC,SAAiB,EAAEb,EAAe;IAC1D,OAAO;QAAEa;QAAWX,UAAUF,GAAGE,QAAQ;QAAES,WAAWX,GAAGC,QAAQ;IAAC;AACpE"}
@@ -0,0 +1,47 @@
1
+ import type { ChangeBatch, HistoryResult, MutationResult } from '@agentshouse/mdruntime';
2
+ export declare const INLINE_BODY_LIMIT_BYTES: number;
3
+ export declare const UPLOAD_LINE_BYTES = 37;
4
+ export declare const UPLOAD_BYTES_MAX: number;
5
+ export type HouseOperation = Readonly<Record<string, unknown>>;
6
+ export type ChangeMapping = {
7
+ kind: 'changes';
8
+ changes: readonly HouseOperation[];
9
+ } | {
10
+ kind: 'unmapped';
11
+ path: string;
12
+ rule: string;
13
+ };
14
+ export declare function houseChanges(batch: ChangeBatch, handle: string | undefined): ChangeMapping;
15
+ export type OperationHead = {
16
+ readonly operation_id: string;
17
+ readonly app_ref?: string;
18
+ readonly release?: string;
19
+ };
20
+ export declare function operationHead(batch: ChangeBatch): OperationHead;
21
+ export declare function batchPaths(changes: readonly HouseOperation[]): readonly string[];
22
+ export declare function deltaBody(changes: readonly HouseOperation[]): string;
23
+ export declare function deltaBytes(delta: string): number;
24
+ export declare function uploadable(bytes: number): boolean;
25
+ export declare function deltaDigest(delta: string): Promise<string>;
26
+ export declare function mutationOutcome(status: number, body: unknown, locator: string, handle: string | undefined): MutationResult;
27
+ export declare function rejectedMapping(mapping: Extract<ChangeMapping, {
28
+ kind: 'unmapped';
29
+ }>): {
30
+ kind: 'rejected';
31
+ affected: {};
32
+ code: string;
33
+ fields: {
34
+ path: string;
35
+ };
36
+ };
37
+ export declare function revisionBody(input: {
38
+ path: string;
39
+ handle: string | undefined;
40
+ revision?: string;
41
+ pageToken?: string;
42
+ }): Record<string, unknown>;
43
+ export declare function historyOutcome(status: number, body: unknown, locator: string, request: {
44
+ path: string;
45
+ revision?: string;
46
+ }): HistoryResult;
47
+ //# sourceMappingURL=write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../src/write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,WAAW,EACX,aAAa,EAEb,cAAc,EAEf,MAAM,wBAAwB,CAAC;AAMhC,eAAO,MAAM,uBAAuB,QAAkB,CAAC;AAEvD,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,eAAO,MAAM,gBAAgB,QAAuC,CAAC;AAErE,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE/D,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AA6GrD,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,CAQ1F;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,aAAa,CAK/D;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,SAAS,MAAM,EAAE,CAQhF;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,CAEpE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE1D;AAqCD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,cAAc,CAsDhB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;IAEjF,IAAI,EAAE,UAAU;IAChB,QAAQ;IACR,IAAI;IACJ,MAAM;QAAI,IAAI;;EAEjB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAM1B;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,aAAa,CAoDf"}
package/dist/write.js ADDED
@@ -0,0 +1,389 @@
1
+ import { sha256Hex, textBytes } from './digest.js';
2
+ import { nativePath, roomLocalPath } from './map.js';
3
+ import { classifyDoor, doorRefusal, scopedRefusal } from './refusal.js';
4
+ import { readPosition, roomVersion } from './version.js';
5
+ export const INLINE_BODY_LIMIT_BYTES = 4 * 1024 * 1024;
6
+ export const UPLOAD_LINE_BYTES = 37;
7
+ export const UPLOAD_BYTES_MAX = 32 * 1024 * 1024 - UPLOAD_LINE_BYTES;
8
+ function priorField(batch, path, name) {
9
+ return batch.preconditions.find((precondition)=>precondition.kind === 'field' && precondition.path === path && precondition.name === name);
10
+ }
11
+ function priorSection(batch, path, name) {
12
+ return batch.preconditions.find((precondition)=>precondition.kind === 'section' && precondition.path === path && precondition.name === name);
13
+ }
14
+ function priorPreamble(batch, path) {
15
+ return batch.preconditions.find((precondition)=>precondition.kind === 'preamble' && precondition.path === path);
16
+ }
17
+ function priorAbsence(batch, path) {
18
+ return batch.preconditions.find((precondition)=>precondition.kind === 'absent' && precondition.path === path);
19
+ }
20
+ function priorExistence(batch, path) {
21
+ const precondition = batch.preconditions.find((held)=>held.path === path && (held.kind === 'revision' || held.kind === 'present'));
22
+ if (precondition === undefined) return undefined;
23
+ return precondition.kind === 'revision' ? {
24
+ base: precondition.revision
25
+ } : {
26
+ kind: 'presence'
27
+ };
28
+ }
29
+ function typedCreate(change, path) {
30
+ const { type, ...fields } = change.fields;
31
+ if (typeof type !== 'string' || type.length === 0) return null;
32
+ return {
33
+ op: 'create_typed',
34
+ path,
35
+ type,
36
+ fields,
37
+ sections: change.sections
38
+ };
39
+ }
40
+ function operationOf(batch, change, handle) {
41
+ const path = nativePath(change.path, handle);
42
+ if (change.kind === 'field') {
43
+ const prior = priorField(batch, change.path, change.name);
44
+ if (prior === undefined) return {
45
+ rule: 'precondition-missing'
46
+ };
47
+ return {
48
+ operation: {
49
+ op: 'set_field',
50
+ path,
51
+ field: change.name,
52
+ value: change.value,
53
+ ...prior.value === undefined ? {} : {
54
+ base: prior.value
55
+ }
56
+ }
57
+ };
58
+ }
59
+ if (change.kind === 'section') {
60
+ const prior = priorSection(batch, change.path, change.name);
61
+ if (prior === undefined) return {
62
+ rule: 'precondition-missing'
63
+ };
64
+ return {
65
+ operation: {
66
+ op: 'replace_section',
67
+ path,
68
+ section: change.name,
69
+ base: prior.value,
70
+ content: change.value
71
+ }
72
+ };
73
+ }
74
+ if (change.kind === 'preamble') {
75
+ const prior = priorPreamble(batch, change.path);
76
+ if (prior === undefined) return {
77
+ rule: 'precondition-missing'
78
+ };
79
+ return {
80
+ operation: {
81
+ op: 'replace_preamble',
82
+ path,
83
+ base: prior.value,
84
+ content: change.value
85
+ }
86
+ };
87
+ }
88
+ if (change.kind === 'create') {
89
+ if (priorAbsence(batch, change.path) === undefined) return {
90
+ rule: 'precondition-missing'
91
+ };
92
+ const created = typedCreate(change, path);
93
+ return created === null ? {
94
+ rule: 'type-missing'
95
+ } : {
96
+ operation: created
97
+ };
98
+ }
99
+ const existence = priorExistence(batch, change.path);
100
+ if (existence === undefined) return {
101
+ rule: 'precondition-missing'
102
+ };
103
+ if (!('base' in existence)) return {
104
+ rule: 'presence-base-unrepresentable'
105
+ };
106
+ if (change.kind === 'replace') {
107
+ return {
108
+ operation: {
109
+ op: 'replace',
110
+ path,
111
+ base: existence.base,
112
+ content: change.content
113
+ }
114
+ };
115
+ }
116
+ if (change.kind === 'move') {
117
+ if (priorAbsence(batch, change.to) === undefined) return {
118
+ rule: 'precondition-missing'
119
+ };
120
+ return {
121
+ operation: {
122
+ op: 'rename',
123
+ path,
124
+ to: nativePath(change.to, handle),
125
+ base: existence.base
126
+ }
127
+ };
128
+ }
129
+ return {
130
+ operation: {
131
+ op: 'remove',
132
+ path,
133
+ base: existence.base
134
+ }
135
+ };
136
+ }
137
+ export function houseChanges(batch, handle) {
138
+ const changes = [];
139
+ for (const change of batch.changes){
140
+ const mapped = operationOf(batch, change, handle);
141
+ if ('rule' in mapped) return {
142
+ kind: 'unmapped',
143
+ path: change.path,
144
+ rule: mapped.rule
145
+ };
146
+ changes.push(mapped.operation);
147
+ }
148
+ return {
149
+ kind: 'changes',
150
+ changes
151
+ };
152
+ }
153
+ export function operationHead(batch) {
154
+ const writer = batch.writtenBy;
155
+ return writer === undefined ? {
156
+ operation_id: batch.id
157
+ } : {
158
+ operation_id: batch.id,
159
+ app_ref: writer.app,
160
+ release: writer.release
161
+ };
162
+ }
163
+ export function batchPaths(changes) {
164
+ return [
165
+ ...new Set(changes.flatMap((change)=>change.op === 'rename' ? [
166
+ String(change.path),
167
+ String(change.to)
168
+ ] : [
169
+ String(change.path)
170
+ ]))
171
+ ].sort();
172
+ }
173
+ export function deltaBody(changes) {
174
+ return JSON.stringify({
175
+ changes
176
+ });
177
+ }
178
+ export function deltaBytes(delta) {
179
+ return textBytes(delta);
180
+ }
181
+ export function uploadable(bytes) {
182
+ return bytes > INLINE_BODY_LIMIT_BYTES && bytes <= UPLOAD_BYTES_MAX;
183
+ }
184
+ export function deltaDigest(delta) {
185
+ return sha256Hex(delta);
186
+ }
187
+ function material(value, handle) {
188
+ if (!Array.isArray(value)) return null;
189
+ const held = [];
190
+ for (const entry of value){
191
+ if (typeof entry !== 'object' || entry === null) return null;
192
+ const file = entry;
193
+ if (typeof file.path !== 'string') return null;
194
+ if (file.content !== null && typeof file.content !== 'string') return null;
195
+ if (file.revision !== null && file.revision !== undefined && typeof file.revision !== 'string') return null;
196
+ let path;
197
+ try {
198
+ path = roomLocalPath(file.path, handle);
199
+ } catch {
200
+ return null;
201
+ }
202
+ held.push({
203
+ path,
204
+ content: file.content,
205
+ revision: typeof file.revision === 'string' ? file.revision : null
206
+ });
207
+ }
208
+ return held;
209
+ }
210
+ function affectedOf(held) {
211
+ const affected = {};
212
+ for (const entry of held){
213
+ if (entry.content !== null) affected[entry.path] = entry.content;
214
+ }
215
+ return affected;
216
+ }
217
+ export function mutationOutcome(status, body, locator, handle) {
218
+ const refusal = doorRefusal(body);
219
+ if (refusal !== null && refusal.code === 'rate_limited') {
220
+ const reset = refusal.fields.retry_at;
221
+ return {
222
+ kind: 'retryable-refusal',
223
+ code: refusal.code,
224
+ fields: refusal.fields,
225
+ ...typeof reset === 'string' ? {
226
+ reset
227
+ } : {}
228
+ };
229
+ }
230
+ if (refusal !== null && refusal.code === 'operation_expired') return {
231
+ kind: 'expired'
232
+ };
233
+ if (refusal !== null && refusal.code === 'edit_conflict') {
234
+ const { current, ...fields } = refusal.fields;
235
+ const held = material(current, handle) ?? [];
236
+ return {
237
+ kind: 'conflicted',
238
+ affected: affectedOf(held),
239
+ code: refusal.code,
240
+ fields
241
+ };
242
+ }
243
+ if (refusal !== null && status === 404) {
244
+ return scopedRefusal(locator, 'undisclosed', refusal);
245
+ }
246
+ const classified = classifyDoor(status, body, locator);
247
+ if (classified !== null && classified.kind !== 'scoped-refusal') {
248
+ return classified.kind === 'beyond-horizon' ? {
249
+ kind: 'expired'
250
+ } : classified;
251
+ }
252
+ if (classified !== null && status === 403) return classified;
253
+ if (refusal !== null && status >= 400) {
254
+ return {
255
+ kind: 'rejected',
256
+ affected: {},
257
+ code: refusal.code,
258
+ fields: refusal.fields
259
+ };
260
+ }
261
+ if (status !== 200 || typeof body !== 'object' || body === null) {
262
+ return {
263
+ kind: 'transport-uncertainty'
264
+ };
265
+ }
266
+ const held = body;
267
+ const at = readPosition(held);
268
+ if (at === null) return {
269
+ kind: 'transport-uncertainty'
270
+ };
271
+ const contents = material(held.contents, handle);
272
+ if (contents === null) return {
273
+ kind: 'transport-uncertainty'
274
+ };
275
+ const documents = {};
276
+ const revisions = {};
277
+ const removals = [];
278
+ for (const entry of contents){
279
+ if (entry.content === null || entry.revision === null) {
280
+ removals.push(entry.path);
281
+ continue;
282
+ }
283
+ documents[entry.path] = entry.content;
284
+ revisions[entry.path] = entry.revision;
285
+ }
286
+ return {
287
+ kind: 'accepted',
288
+ roomVersion: roomVersion(at),
289
+ documents,
290
+ revisions,
291
+ removals: removals.sort()
292
+ };
293
+ }
294
+ export function rejectedMapping(mapping) {
295
+ return {
296
+ kind: 'rejected',
297
+ affected: {},
298
+ code: mapping.rule,
299
+ fields: {
300
+ path: mapping.path
301
+ }
302
+ };
303
+ }
304
+ export function revisionBody(input) {
305
+ return {
306
+ path: nativePath(input.path, input.handle),
307
+ ...input.revision === undefined ? {} : {
308
+ revision: input.revision
309
+ },
310
+ ...input.pageToken === undefined ? {} : {
311
+ before: Number(input.pageToken)
312
+ }
313
+ };
314
+ }
315
+ export function historyOutcome(status, body, locator, request) {
316
+ const classified = classifyDoor(status, body, locator);
317
+ if (classified !== null) {
318
+ return classified.kind === 'beyond-horizon' ? {
319
+ kind: 'transport-uncertainty'
320
+ } : classified;
321
+ }
322
+ if (status !== 200 || typeof body !== 'object' || body === null) {
323
+ return {
324
+ kind: 'transport-uncertainty'
325
+ };
326
+ }
327
+ const held = body;
328
+ if (!Array.isArray(held.revisions)) return {
329
+ kind: 'transport-uncertainty'
330
+ };
331
+ const entries = [];
332
+ for (const entry of held.revisions){
333
+ if (typeof entry !== 'object' || entry === null) return {
334
+ kind: 'transport-uncertainty'
335
+ };
336
+ entries.push(entry);
337
+ }
338
+ if (request.revision !== undefined) {
339
+ const named = entries[0];
340
+ if (named === undefined) return {
341
+ kind: 'no-history'
342
+ };
343
+ if (named.unavailable === true) {
344
+ return {
345
+ kind: 'scoped-refusal',
346
+ locator,
347
+ scope: 'content',
348
+ code: 'retained_history_unavailable',
349
+ fields: {
350
+ path: request.path,
351
+ revision: request.revision
352
+ }
353
+ };
354
+ }
355
+ if (typeof named.content !== 'string') return {
356
+ kind: 'transport-uncertainty'
357
+ };
358
+ return {
359
+ kind: 'revision',
360
+ content: named.content
361
+ };
362
+ }
363
+ if (entries.length === 0) return {
364
+ kind: 'no-history'
365
+ };
366
+ const revisions = [];
367
+ for (const entry of entries){
368
+ if (typeof entry.revision !== 'string' || typeof entry.author_user !== 'string' || typeof entry.created_at !== 'string') {
369
+ return {
370
+ kind: 'transport-uncertainty'
371
+ };
372
+ }
373
+ revisions.push({
374
+ revision: entry.revision,
375
+ author: entry.author_user,
376
+ time: entry.created_at
377
+ });
378
+ }
379
+ const next = held.next_before;
380
+ return {
381
+ kind: 'history',
382
+ revisions,
383
+ ...typeof next === 'number' ? {
384
+ pageToken: String(next)
385
+ } : {}
386
+ };
387
+ }
388
+
389
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/write.ts"],"sourcesContent":["import type {\n Change,\n ChangeBatch,\n HistoryResult,\n HistoryRevision,\n MutationResult,\n Precondition,\n} from '@agentshouse/mdruntime';\nimport { sha256Hex, textBytes } from './digest.js';\nimport { nativePath, roomLocalPath } from './map.js';\nimport { classifyDoor, doorRefusal, scopedRefusal } from './refusal.js';\nimport { readPosition, roomVersion } from './version.js';\n\nexport const INLINE_BODY_LIMIT_BYTES = 4 * 1024 * 1024;\n\nexport const UPLOAD_LINE_BYTES = 37;\n\nexport const UPLOAD_BYTES_MAX = 32 * 1024 * 1024 - UPLOAD_LINE_BYTES;\n\nexport type HouseOperation = Readonly<Record<string, unknown>>;\n\nexport type ChangeMapping =\n | { kind: 'changes'; changes: readonly HouseOperation[] }\n | { kind: 'unmapped'; path: string; rule: string };\n\ntype Existence = { base: string } | { kind: 'presence' };\n\nfunction priorField(batch: ChangeBatch, path: string, name: string) {\n return batch.preconditions.find(\n (precondition): precondition is Extract<Precondition, { kind: 'field' }> =>\n precondition.kind === 'field' && precondition.path === path && precondition.name === name,\n );\n}\n\nfunction priorSection(batch: ChangeBatch, path: string, name: string) {\n return batch.preconditions.find(\n (precondition): precondition is Extract<Precondition, { kind: 'section' }> =>\n precondition.kind === 'section' && precondition.path === path && precondition.name === name,\n );\n}\n\nfunction priorPreamble(batch: ChangeBatch, path: string) {\n return batch.preconditions.find(\n (precondition): precondition is Extract<Precondition, { kind: 'preamble' }> =>\n precondition.kind === 'preamble' && precondition.path === path,\n );\n}\n\nfunction priorAbsence(batch: ChangeBatch, path: string) {\n return batch.preconditions.find(\n (precondition) => precondition.kind === 'absent' && precondition.path === path,\n );\n}\n\nfunction priorExistence(batch: ChangeBatch, path: string): Existence | undefined {\n const precondition = batch.preconditions.find(\n (held) => held.path === path && (held.kind === 'revision' || held.kind === 'present'),\n );\n if (precondition === undefined) return undefined;\n return precondition.kind === 'revision' ? { base: precondition.revision } : { kind: 'presence' };\n}\n\nfunction typedCreate(\n change: Extract<Change, { kind: 'create' }>,\n path: string,\n): HouseOperation | null {\n const { type, ...fields } = change.fields;\n if (typeof type !== 'string' || type.length === 0) return null;\n return { op: 'create_typed', path, type, fields, sections: change.sections };\n}\n\ntype MappedOperation = { operation: HouseOperation } | { rule: string };\n\nfunction operationOf(\n batch: ChangeBatch,\n change: Change,\n handle: string | undefined,\n): MappedOperation {\n const path = nativePath(change.path, handle);\n if (change.kind === 'field') {\n const prior = priorField(batch, change.path, change.name);\n if (prior === undefined) return { rule: 'precondition-missing' };\n return {\n operation: {\n op: 'set_field',\n path,\n field: change.name,\n value: change.value,\n ...(prior.value === undefined ? {} : { base: prior.value }),\n },\n };\n }\n if (change.kind === 'section') {\n const prior = priorSection(batch, change.path, change.name);\n if (prior === undefined) return { rule: 'precondition-missing' };\n return {\n operation: {\n op: 'replace_section',\n path,\n section: change.name,\n base: prior.value,\n content: change.value,\n },\n };\n }\n if (change.kind === 'preamble') {\n const prior = priorPreamble(batch, change.path);\n if (prior === undefined) return { rule: 'precondition-missing' };\n return {\n operation: { op: 'replace_preamble', path, base: prior.value, content: change.value },\n };\n }\n if (change.kind === 'create') {\n if (priorAbsence(batch, change.path) === undefined) return { rule: 'precondition-missing' };\n const created = typedCreate(change, path);\n return created === null ? { rule: 'type-missing' } : { operation: created };\n }\n const existence = priorExistence(batch, change.path);\n if (existence === undefined) return { rule: 'precondition-missing' };\n if (!('base' in existence)) return { rule: 'presence-base-unrepresentable' };\n if (change.kind === 'replace') {\n return { operation: { op: 'replace', path, base: existence.base, content: change.content } };\n }\n if (change.kind === 'move') {\n if (priorAbsence(batch, change.to) === undefined) return { rule: 'precondition-missing' };\n return {\n operation: { op: 'rename', path, to: nativePath(change.to, handle), base: existence.base },\n };\n }\n return { operation: { op: 'remove', path, base: existence.base } };\n}\n\nexport function houseChanges(batch: ChangeBatch, handle: string | undefined): ChangeMapping {\n const changes: HouseOperation[] = [];\n for (const change of batch.changes) {\n const mapped = operationOf(batch, change, handle);\n if ('rule' in mapped) return { kind: 'unmapped', path: change.path, rule: mapped.rule };\n changes.push(mapped.operation);\n }\n return { kind: 'changes', changes };\n}\n\nexport type OperationHead = {\n readonly operation_id: string;\n readonly app_ref?: string;\n readonly release?: string;\n};\n\nexport function operationHead(batch: ChangeBatch): OperationHead {\n const writer = batch.writtenBy;\n return writer === undefined\n ? { operation_id: batch.id }\n : { operation_id: batch.id, app_ref: writer.app, release: writer.release };\n}\n\nexport function batchPaths(changes: readonly HouseOperation[]): readonly string[] {\n return [\n ...new Set(\n changes.flatMap((change) =>\n change.op === 'rename' ? [String(change.path), String(change.to)] : [String(change.path)],\n ),\n ),\n ].sort();\n}\n\nexport function deltaBody(changes: readonly HouseOperation[]): string {\n return JSON.stringify({ changes });\n}\n\nexport function deltaBytes(delta: string): number {\n return textBytes(delta);\n}\n\nexport function uploadable(bytes: number): boolean {\n return bytes > INLINE_BODY_LIMIT_BYTES && bytes <= UPLOAD_BYTES_MAX;\n}\n\nexport function deltaDigest(delta: string): Promise<string> {\n return sha256Hex(delta);\n}\n\ntype Material = { path: string; content: string | null; revision: string | null };\n\nfunction material(value: unknown, handle: string | undefined): readonly Material[] | null {\n if (!Array.isArray(value)) return null;\n const held: Material[] = [];\n for (const entry of value) {\n if (typeof entry !== 'object' || entry === null) return null;\n const file = entry as Record<string, unknown>;\n if (typeof file.path !== 'string') return null;\n if (file.content !== null && typeof file.content !== 'string') return null;\n if (file.revision !== null && file.revision !== undefined && typeof file.revision !== 'string')\n return null;\n let path: string;\n try {\n path = roomLocalPath(file.path, handle);\n } catch {\n return null;\n }\n held.push({\n path,\n content: file.content,\n revision: typeof file.revision === 'string' ? file.revision : null,\n });\n }\n return held;\n}\n\nfunction affectedOf(held: readonly Material[]): Readonly<Record<string, string>> {\n const affected: Record<string, string> = {};\n for (const entry of held) {\n if (entry.content !== null) affected[entry.path] = entry.content;\n }\n return affected;\n}\n\nexport function mutationOutcome(\n status: number,\n body: unknown,\n locator: string,\n handle: string | undefined,\n): MutationResult {\n const refusal = doorRefusal(body);\n if (refusal !== null && refusal.code === 'rate_limited') {\n const reset = refusal.fields.retry_at;\n return {\n kind: 'retryable-refusal',\n code: refusal.code,\n fields: refusal.fields,\n ...(typeof reset === 'string' ? { reset } : {}),\n };\n }\n if (refusal !== null && refusal.code === 'operation_expired') return { kind: 'expired' };\n if (refusal !== null && refusal.code === 'edit_conflict') {\n const { current, ...fields } = refusal.fields;\n const held = material(current, handle) ?? [];\n return { kind: 'conflicted', affected: affectedOf(held), code: refusal.code, fields };\n }\n if (refusal !== null && status === 404) {\n return scopedRefusal(locator, 'undisclosed', refusal);\n }\n const classified = classifyDoor(status, body, locator);\n if (classified !== null && classified.kind !== 'scoped-refusal') {\n return classified.kind === 'beyond-horizon' ? { kind: 'expired' } : classified;\n }\n if (classified !== null && status === 403) return classified;\n if (refusal !== null && status >= 400) {\n return { kind: 'rejected', affected: {}, code: refusal.code, fields: refusal.fields };\n }\n if (status !== 200 || typeof body !== 'object' || body === null) {\n return { kind: 'transport-uncertainty' };\n }\n const held = body as Record<string, unknown>;\n const at = readPosition(held);\n if (at === null) return { kind: 'transport-uncertainty' };\n const contents = material(held.contents, handle);\n if (contents === null) return { kind: 'transport-uncertainty' };\n const documents: Record<string, string> = {};\n const revisions: Record<string, string> = {};\n const removals: string[] = [];\n for (const entry of contents) {\n if (entry.content === null || entry.revision === null) {\n removals.push(entry.path);\n continue;\n }\n documents[entry.path] = entry.content;\n revisions[entry.path] = entry.revision;\n }\n return {\n kind: 'accepted',\n roomVersion: roomVersion(at),\n documents,\n revisions,\n removals: removals.sort(),\n };\n}\n\nexport function rejectedMapping(mapping: Extract<ChangeMapping, { kind: 'unmapped' }>) {\n return {\n kind: 'rejected' as const,\n affected: {},\n code: mapping.rule,\n fields: { path: mapping.path },\n };\n}\n\nexport function revisionBody(input: {\n path: string;\n handle: string | undefined;\n revision?: string;\n pageToken?: string;\n}): Record<string, unknown> {\n return {\n path: nativePath(input.path, input.handle),\n ...(input.revision === undefined ? {} : { revision: input.revision }),\n ...(input.pageToken === undefined ? {} : { before: Number(input.pageToken) }),\n };\n}\n\nexport function historyOutcome(\n status: number,\n body: unknown,\n locator: string,\n request: { path: string; revision?: string },\n): HistoryResult {\n const classified = classifyDoor(status, body, locator);\n if (classified !== null) {\n return classified.kind === 'beyond-horizon' ? { kind: 'transport-uncertainty' } : classified;\n }\n if (status !== 200 || typeof body !== 'object' || body === null) {\n return { kind: 'transport-uncertainty' };\n }\n const held = body as Record<string, unknown>;\n if (!Array.isArray(held.revisions)) return { kind: 'transport-uncertainty' };\n const entries: Record<string, unknown>[] = [];\n for (const entry of held.revisions) {\n if (typeof entry !== 'object' || entry === null) return { kind: 'transport-uncertainty' };\n entries.push(entry as Record<string, unknown>);\n }\n if (request.revision !== undefined) {\n const named = entries[0];\n if (named === undefined) return { kind: 'no-history' };\n if (named.unavailable === true) {\n return {\n kind: 'scoped-refusal',\n locator,\n scope: 'content',\n code: 'retained_history_unavailable',\n fields: { path: request.path, revision: request.revision },\n };\n }\n if (typeof named.content !== 'string') return { kind: 'transport-uncertainty' };\n return { kind: 'revision', content: named.content };\n }\n if (entries.length === 0) return { kind: 'no-history' };\n const revisions: HistoryRevision[] = [];\n for (const entry of entries) {\n if (\n typeof entry.revision !== 'string' ||\n typeof entry.author_user !== 'string' ||\n typeof entry.created_at !== 'string'\n ) {\n return { kind: 'transport-uncertainty' };\n }\n revisions.push({\n revision: entry.revision,\n author: entry.author_user,\n time: entry.created_at,\n });\n }\n const next = held.next_before;\n return {\n kind: 'history',\n revisions,\n ...(typeof next === 'number' ? { pageToken: String(next) } : {}),\n };\n}\n"],"names":["sha256Hex","textBytes","nativePath","roomLocalPath","classifyDoor","doorRefusal","scopedRefusal","readPosition","roomVersion","INLINE_BODY_LIMIT_BYTES","UPLOAD_LINE_BYTES","UPLOAD_BYTES_MAX","priorField","batch","path","name","preconditions","find","precondition","kind","priorSection","priorPreamble","priorAbsence","priorExistence","held","undefined","base","revision","typedCreate","change","type","fields","length","op","sections","operationOf","handle","prior","rule","operation","field","value","section","content","created","existence","to","houseChanges","changes","mapped","push","operationHead","writer","writtenBy","operation_id","id","app_ref","app","release","batchPaths","Set","flatMap","String","sort","deltaBody","JSON","stringify","deltaBytes","delta","uploadable","bytes","deltaDigest","material","Array","isArray","entry","file","affectedOf","affected","mutationOutcome","status","body","locator","refusal","code","reset","retry_at","current","classified","at","contents","documents","revisions","removals","rejectedMapping","mapping","revisionBody","input","pageToken","before","Number","historyOutcome","request","entries","named","unavailable","scope","author_user","created_at","author","time","next","next_before"],"mappings":"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"}