@powerhousedao/reactor-drive 6.0.0-dev.253 → 6.0.2-staging.9

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.
@@ -0,0 +1,353 @@
1
+ import * as _powerhousedao_shared_document_model0 from "@powerhousedao/shared/document-model";
2
+ import { Action, CreateDocument, CreateState, DocumentModelModule, OperationWithContext, PHBaseState, PHDocument, StateReducer } from "@powerhousedao/shared/document-model";
3
+ import * as kysely from "kysely";
4
+ import { Generated, Kysely } from "kysely";
5
+ import { BaseReadModel, IConsistencyTracker, IDriveClient, IOperationIndex, IReactorClient, IWriteCache, PagedResults, PagingOptions } from "@powerhousedao/reactor";
6
+ import { DocumentDriveDocument, DriveInput, FolderNode, Node } from "@powerhousedao/shared/document-drive";
7
+ import * as graphql_language_ast_js0 from "graphql/language/ast.js";
8
+
9
+ //#region src/constants.d.ts
10
+ declare const REACTOR_DRIVE_DOCUMENT_TYPE = "powerhouse/reactor-drive";
11
+ declare const DRIVE_CHILD_RELATIONSHIP_TYPE = "drive/child";
12
+ declare const REACTOR_DRIVE_FILE_EXTENSION = "phrd";
13
+ //#endregion
14
+ //#region src/types.d.ts
15
+ type ReactorDriveGlobalState = {
16
+ name: string;
17
+ icon: string | null;
18
+ };
19
+ type ReactorDriveLocalState = {
20
+ sharingType: string;
21
+ availableOffline: boolean;
22
+ };
23
+ type ReactorDrivePHState = PHBaseState & {
24
+ global: ReactorDriveGlobalState;
25
+ local: ReactorDriveLocalState;
26
+ };
27
+ type ReactorDriveInput = {
28
+ global: Partial<ReactorDriveGlobalState>;
29
+ local?: Partial<ReactorDriveLocalState>;
30
+ preferredEditor?: string;
31
+ };
32
+ type ReactorDriveDocumentModelModule = DocumentModelModule<ReactorDrivePHState>;
33
+ /**
34
+ * Metadata carried on the `drive/child` relationship for file children.
35
+ * The parentFolderId is null when the file lives directly under the drive root.
36
+ * Files don't carry their name here — it lives on the child document's header.
37
+ * documentType is duplicated here so the projection never depends on the order
38
+ * in which CREATE_DOCUMENT and ADD_RELATIONSHIP arrive; documentType is
39
+ * immutable after document creation, so the duplication is safe.
40
+ */
41
+ type DriveChildFileMetadata = {
42
+ kind: "file";
43
+ parentFolderId: string | null;
44
+ documentType: string;
45
+ };
46
+ type AddFolderActionInput = {
47
+ folderId: string;
48
+ parentFolderId: string | null;
49
+ name: string;
50
+ };
51
+ type UpdateFolderActionInput = {
52
+ folderId: string;
53
+ name?: string;
54
+ parentFolderId?: string | null;
55
+ };
56
+ type RemoveFolderActionInput = {
57
+ folderId: string;
58
+ };
59
+ type ReactorDriveNodeKind = "file" | "folder";
60
+ type ReactorDriveFileNode = {
61
+ kind: "file";
62
+ id: string;
63
+ driveId: string;
64
+ parentFolder: string | null;
65
+ name: string;
66
+ documentType: string;
67
+ };
68
+ type ReactorDriveFolderNode = {
69
+ kind: "folder";
70
+ id: string;
71
+ driveId: string;
72
+ parentFolder: string | null;
73
+ name: string;
74
+ };
75
+ type ReactorDriveNode = ReactorDriveFileNode | ReactorDriveFolderNode;
76
+ //#endregion
77
+ //#region src/actions.d.ts
78
+ type SetDriveNameInput = {
79
+ name: string;
80
+ };
81
+ type SetDriveIconInput = {
82
+ icon: string | null;
83
+ };
84
+ type SetSharingTypeInput = {
85
+ sharingType: string;
86
+ };
87
+ type SetAvailableOfflineInput = {
88
+ availableOffline: boolean;
89
+ };
90
+ declare function setDriveNameAction(input: SetDriveNameInput): Action;
91
+ declare function setDriveIconAction(input: SetDriveIconInput): Action;
92
+ declare function setSharingTypeAction(input: SetSharingTypeInput): Action;
93
+ declare function setAvailableOfflineAction(input: SetAvailableOfflineInput): Action;
94
+ declare function addFolderAction(input: AddFolderActionInput): Action;
95
+ declare function updateFolderAction(input: UpdateFolderActionInput): Action;
96
+ declare function removeFolderAction(input: RemoveFolderActionInput): Action;
97
+ declare const reactorDriveActions: {
98
+ setDriveName: typeof setDriveNameAction;
99
+ setDriveIcon: typeof setDriveIconAction;
100
+ setSharingType: typeof setSharingTypeAction;
101
+ setAvailableOffline: typeof setAvailableOfflineAction;
102
+ addFolder: typeof addFolderAction;
103
+ updateFolder: typeof updateFolderAction;
104
+ removeFolder: typeof removeFolderAction;
105
+ };
106
+ //#endregion
107
+ //#region src/module.d.ts
108
+ declare const reactorDriveCreateState: CreateState<ReactorDrivePHState>;
109
+ declare const reactorDriveCreateDocument: CreateDocument<ReactorDrivePHState>;
110
+ declare const reactorDriveDocumentReducer: _powerhousedao_shared_document_model0.Reducer<ReactorDrivePHState>;
111
+ declare const reactorDriveDocumentModelModule: ReactorDriveDocumentModelModule;
112
+ //#endregion
113
+ //#region src/reducer/drive.d.ts
114
+ declare const reactorDriveStateReducer: StateReducer<ReactorDrivePHState>;
115
+ //#endregion
116
+ //#region src/schema/tables.d.ts
117
+ interface DriveNodeTable {
118
+ driveId: string;
119
+ id: string;
120
+ kind: "file" | "folder";
121
+ name: string;
122
+ requestedName: string;
123
+ parentFolder: string | null;
124
+ documentType: string | null;
125
+ createdAt: Generated<Date>;
126
+ updatedAt: Generated<Date>;
127
+ }
128
+ interface DocumentNameTable {
129
+ docId: string;
130
+ name: string;
131
+ updatedAt: Generated<Date>;
132
+ }
133
+ interface ReactorDriveDatabase {
134
+ DriveNode: DriveNodeTable;
135
+ DocumentName: DocumentNameTable;
136
+ }
137
+ //#endregion
138
+ //#region src/schema/migrations/migrator.d.ts
139
+ interface ReactorDriveMigrationResult {
140
+ success: boolean;
141
+ migrationsExecuted: string[];
142
+ error?: Error;
143
+ }
144
+ declare function runReactorDriveMigrations(db: Kysely<unknown>, schema: string): Promise<ReactorDriveMigrationResult>;
145
+ declare function getReactorDriveMigrationStatus(db: Kysely<unknown>, schema: string): Promise<readonly kysely.MigrationInfo[]>;
146
+ //#endregion
147
+ //#region src/processors/utils/collisions.d.ts
148
+ /**
149
+ * Deterministic per-folder name collision rule. Given a desired name and the
150
+ * set of names already taken by siblings, returns the next available name as
151
+ * `requested`, `requested (2)`, `requested (3)`, etc.
152
+ *
153
+ * The rule matches the legacy document-drive module so that migration from
154
+ * the legacy state produces stable suffixes.
155
+ */
156
+ declare function resolveCollision(requested: string, takenNames: Iterable<string>): string;
157
+ //#endregion
158
+ //#region src/processors/node-processor.d.ts
159
+ declare class NodeProcessor extends BaseReadModel {
160
+ private readonly driveDb;
161
+ private readonly baseDb;
162
+ private readonly schema;
163
+ constructor(baseDb: Kysely<unknown>, schema: string, operationIndex: IOperationIndex, writeCache: IWriteCache, consistencyTracker: IConsistencyTracker);
164
+ init(): Promise<void>;
165
+ protected commitOperations(items: OperationWithContext[]): Promise<void>;
166
+ private applyNameOperation;
167
+ private applyStructureOperation;
168
+ private applyDeleteDocument;
169
+ private handleAddFileRelationship;
170
+ private handleAddFolder;
171
+ private handleUpdateFolder;
172
+ private resolveSiblingName;
173
+ private lookupDocumentName;
174
+ private parseFileMetadata;
175
+ private upsertDocumentName;
176
+ }
177
+ //#endregion
178
+ //#region src/read-model/interfaces.d.ts
179
+ /**
180
+ * Drive-specific projection of the relationship graph. Reads from the
181
+ * `DriveNode` and `DocumentName` tables maintained by `NodeProcessor`.
182
+ *
183
+ * All methods are eventually-consistent reads against the projection.
184
+ * Callers that need read-after-write consistency must coordinate at the
185
+ * client layer (e.g. via `IReactorClient.waitForConsistency`) before
186
+ * invoking these methods.
187
+ */
188
+ interface IDriveReadModel {
189
+ getNode(driveId: string, nodeId: string, signal?: AbortSignal): Promise<ReactorDriveNode | undefined>;
190
+ /**
191
+ * Lists nodes within a drive with optional filtering by parent folder.
192
+ *
193
+ * - `parentFolder === undefined` returns every node in the drive.
194
+ * - `parentFolder === null` returns only root-level nodes.
195
+ * - `parentFolder === <id>` returns only direct children of that folder.
196
+ */
197
+ listChildren(driveId: string, parentFolder: string | null | undefined, paging?: PagingOptions, signal?: AbortSignal): Promise<PagedResults<ReactorDriveNode>>;
198
+ /**
199
+ * Returns every node reachable from `root` (inclusive) within the same
200
+ * drive via parentFolder chains. Useful for cascade delete and copy.
201
+ */
202
+ getDescendants(driveId: string, root: string, signal?: AbortSignal): Promise<ReactorDriveNode[]>;
203
+ /**
204
+ * Returns every node in the drive, unpaged. Intended for hydrating the
205
+ * legacy `state.global.nodes` representation when returning drive
206
+ * documents to legacy consumers.
207
+ */
208
+ listAll(driveId: string, signal?: AbortSignal): Promise<ReactorDriveNode[]>;
209
+ }
210
+ //#endregion
211
+ //#region src/read-model/drive-node-view.d.ts
212
+ declare class DriveNodeView implements IDriveReadModel {
213
+ private readonly db;
214
+ constructor(db: Kysely<ReactorDriveDatabase>);
215
+ getNode(driveId: string, nodeId: string): Promise<ReactorDriveNode | undefined>;
216
+ listChildren(driveId: string, parentFolder: string | null | undefined, paging?: PagingOptions): Promise<PagedResults<ReactorDriveNode>>;
217
+ listAll(driveId: string): Promise<ReactorDriveNode[]>;
218
+ getDescendants(driveId: string, root: string): Promise<ReactorDriveNode[]>;
219
+ }
220
+ //#endregion
221
+ //#region src/client/reactor-drive-client.d.ts
222
+ interface ReactorDriveClientArgs {
223
+ reactor: IReactorClient;
224
+ readModel: IDriveReadModel;
225
+ }
226
+ /**
227
+ * Implementation of {@link IDriveClient} backed by the reactor's relationship
228
+ * primitives and the drive-scoped folder actions. Folder structure lives in
229
+ * the operation log (ADD_FOLDER/UPDATE_FOLDER/REMOVE_FOLDER + ADD_RELATIONSHIP
230
+ * for files) and is materialised by `NodeProcessor` into the `DriveNode`
231
+ * table consumed via {@link IDriveReadModel}.
232
+ */
233
+ declare class ReactorDriveClient implements IDriveClient {
234
+ private readonly reactor;
235
+ private readonly readModel;
236
+ constructor(args: ReactorDriveClientArgs);
237
+ create(input: DriveInput, signal?: AbortSignal): Promise<DocumentDriveDocument>;
238
+ addFile<TDocument extends PHDocument = PHDocument>(driveIdentifier: string, document: PHDocument, parentFolder?: string, signal?: AbortSignal): Promise<TDocument>;
239
+ addFolder(driveIdentifier: string, name: string, parentFolder?: string, signal?: AbortSignal): Promise<FolderNode>;
240
+ removeNode(driveIdentifier: string, nodeId: string, signal?: AbortSignal): Promise<void>;
241
+ renameNode(driveIdentifier: string, nodeId: string, name: string, signal?: AbortSignal): Promise<Node>;
242
+ setPreferredEditorOnNode(nodeId: string, preferredEditor: string | null, signal?: AbortSignal): Promise<PHDocument>;
243
+ moveNode(driveIdentifier: string, srcNodeId: string, targetParentFolderId: string | undefined, signal?: AbortSignal): Promise<DocumentDriveDocument>;
244
+ copyNode(driveIdentifier: string, srcNodeId: string, targetParentFolderId: string | undefined, signal?: AbortSignal): Promise<DocumentDriveDocument>;
245
+ getNode(driveIdentifier: string, nodeId: string, signal?: AbortSignal): Promise<Node>;
246
+ listNodes(driveIdentifier: string, parentFolder?: string | null, paging?: PagingOptions, signal?: AbortSignal): Promise<PagedResults<Node>>;
247
+ private toLegacyNode;
248
+ private toLegacyDriveDocument;
249
+ private orderDeepestFirst;
250
+ }
251
+ //#endregion
252
+ //#region src/subgraph/schema.d.ts
253
+ declare const typeDefs: graphql_language_ast_js0.DocumentNode;
254
+ //#endregion
255
+ //#region src/subgraph/resolvers.d.ts
256
+ interface ReactorDriveResolverContext {
257
+ reactorClient: IReactorClient;
258
+ readModel: IDriveReadModel;
259
+ }
260
+ type PagingInput = {
261
+ cursor?: string;
262
+ limit?: number;
263
+ };
264
+ type NodeKindFilter = "FILE" | "FOLDER" | undefined;
265
+ /**
266
+ * Builds GraphQL resolvers backed by the drive read model. The resolvers are
267
+ * pure — every external dependency is read off the GraphQL context. Wiring
268
+ * the resolvers into a subgraph (e.g. `reactor-api`'s `ISubgraph`) is the
269
+ * caller's responsibility.
270
+ */
271
+ declare function createReactorDriveResolvers(): {
272
+ Query: {
273
+ reactorDrive(_root: unknown, args: {
274
+ id: string;
275
+ }, ctx: ReactorDriveResolverContext): Promise<{
276
+ id: string;
277
+ name: string;
278
+ icon: string | null;
279
+ sharingType: string;
280
+ availableOffline: boolean;
281
+ } | null>;
282
+ reactorDriveNode(_root: unknown, args: {
283
+ driveId: string;
284
+ id: string;
285
+ }, ctx: ReactorDriveResolverContext): Promise<ReactorDriveNode | undefined>;
286
+ reactorDriveDescendants(_root: unknown, args: {
287
+ driveId: string;
288
+ root: string;
289
+ }, ctx: ReactorDriveResolverContext): Promise<ReactorDriveNode[]>;
290
+ };
291
+ ReactorDrive: {
292
+ rootNodes(parent: {
293
+ id: string;
294
+ }, args: {
295
+ paging?: PagingInput;
296
+ kind?: NodeKindFilter;
297
+ }, ctx: ReactorDriveResolverContext): Promise<{
298
+ results: ReactorDriveNode[];
299
+ nextCursor: string | undefined;
300
+ hasMore: boolean;
301
+ totalCount: number | undefined;
302
+ }>;
303
+ };
304
+ ReactorDriveFolderNode: {
305
+ children(parent: {
306
+ id: string;
307
+ driveId: string;
308
+ }, args: {
309
+ paging?: PagingInput;
310
+ kind?: NodeKindFilter;
311
+ }, ctx: ReactorDriveResolverContext): Promise<{
312
+ results: ReactorDriveNode[];
313
+ nextCursor: string | undefined;
314
+ hasMore: boolean;
315
+ totalCount: number | undefined;
316
+ }>;
317
+ };
318
+ ReactorDriveNode: {
319
+ __resolveType(node: ReactorDriveNode): "ReactorDriveFileNode" | "ReactorDriveFolderNode";
320
+ };
321
+ };
322
+ //#endregion
323
+ //#region src/migration/migrate-legacy-state.d.ts
324
+ interface MigrateLegacyDriveStateArgs {
325
+ reactor: IReactorClient;
326
+ readModel: IDriveReadModel;
327
+ driveId: string;
328
+ nodes: Node[];
329
+ branch?: string;
330
+ signal?: AbortSignal;
331
+ }
332
+ interface MigrateLegacyDriveStateResult {
333
+ emittedActions: number;
334
+ skippedExisting: number;
335
+ }
336
+ /**
337
+ * Translates a legacy `document-drive` `state.global.nodes` array into the
338
+ * action vocabulary used by the new reactor-drive module.
339
+ *
340
+ * Folder nodes are emitted as `ADD_FOLDER` actions targeting the drive
341
+ * document. File nodes are emitted as `ADD_RELATIONSHIP` actions on the drive
342
+ * with `drive/child` metadata carrying the parent folder id. File nodes
343
+ * assume the underlying PHDocument still exists under the same id — the
344
+ * migration only re-links it into the new drive, it does not recreate
345
+ * documents.
346
+ *
347
+ * Re-running the migration is safe: existing `DriveNode` rows are skipped
348
+ * so already-migrated nodes are left untouched.
349
+ */
350
+ declare function migrateLegacyDriveState(args: MigrateLegacyDriveStateArgs): Promise<MigrateLegacyDriveStateResult>;
351
+ //#endregion
352
+ export { type AddFolderActionInput, DRIVE_CHILD_RELATIONSHIP_TYPE, type DocumentNameTable, type DriveChildFileMetadata, type DriveNodeTable, DriveNodeView, type IDriveReadModel, type MigrateLegacyDriveStateArgs, type MigrateLegacyDriveStateResult, NodeProcessor, REACTOR_DRIVE_DOCUMENT_TYPE, REACTOR_DRIVE_FILE_EXTENSION, ReactorDriveClient, type ReactorDriveClientArgs, type ReactorDriveDatabase, type ReactorDriveDocumentModelModule, type ReactorDriveFileNode, type ReactorDriveFolderNode, type ReactorDriveGlobalState, type ReactorDriveInput, type ReactorDriveLocalState, type ReactorDriveMigrationResult, type ReactorDriveNode, type ReactorDriveNodeKind, type ReactorDrivePHState, type ReactorDriveResolverContext, type RemoveFolderActionInput, type SetAvailableOfflineInput, type SetDriveIconInput, type SetDriveNameInput, type SetSharingTypeInput, type UpdateFolderActionInput, addFolderAction, createReactorDriveResolvers, getReactorDriveMigrationStatus, migrateLegacyDriveState, reactorDriveActions, reactorDriveCreateDocument, reactorDriveCreateState, reactorDriveDocumentModelModule, reactorDriveDocumentReducer, reactorDriveStateReducer, typeDefs as reactorDriveSubgraphTypeDefs, removeFolderAction, resolveCollision, runReactorDriveMigrations, setAvailableOfflineAction, setDriveIconAction, setDriveNameAction, setSharingTypeAction, updateFolderAction };
353
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/constants.ts","../src/types.ts","../src/actions.ts","../src/module.ts","../src/reducer/drive.ts","../src/schema/tables.ts","../src/schema/migrations/migrator.ts","../src/processors/utils/collisions.ts","../src/processors/node-processor.ts","../src/read-model/interfaces.ts","../src/read-model/drive-node-view.ts","../src/client/reactor-drive-client.ts","../src/subgraph/schema.ts","../src/subgraph/resolvers.ts","../src/migration/migrate-legacy-state.ts"],"mappings":"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"}