@voltro/plugin-inventory 0.0.0-stage → 0.87.0

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,448 @@
1
+ import { Context } from 'effect';
2
+ import { Effect } from 'effect';
3
+ import { Layer } from 'effect';
4
+ import { Layer as Layer_2 } from 'effect/Layer';
5
+ import { PluginPrivacyTarget } from '@voltro/protocol';
6
+ import { Schema } from 'effect';
7
+ import { Subject } from '@voltro/protocol';
8
+ import { YieldableError } from 'effect/Cause';
9
+
10
+ export declare const catalogFakeLayer: Layer_2<InventoryPort | CraftingPort | CatalogSource, never, never>;
11
+
12
+ /** Serializable content uses a declared item's version, never a stored Schema object. */
13
+ declare interface CatalogItem {
14
+ readonly id: string;
15
+ readonly schemaVersion: number;
16
+ readonly kind: ItemKind;
17
+ readonly stackable: boolean;
18
+ readonly maxStack: number;
19
+ readonly tradable: boolean;
20
+ readonly rarity: string;
21
+ readonly tags: readonly string[];
22
+ readonly equipSlot: string | null;
23
+ readonly expiresAfter: number | null;
24
+ readonly display: {
25
+ readonly nameKey: string;
26
+ readonly icon: string | null;
27
+ };
28
+ readonly attributes: JsonValue;
29
+ readonly instanceDefaults: JsonValue;
30
+ }
31
+
32
+ declare interface CatalogScope {
33
+ readonly tenantId: string;
34
+ readonly channel: string;
35
+ readonly locale: string;
36
+ }
37
+
38
+ declare interface CatalogSnapshot {
39
+ readonly revision: string;
40
+ readonly items: readonly CatalogItem[];
41
+ }
42
+
43
+ declare class CatalogSource extends CatalogSource_base {
44
+ }
45
+
46
+ declare const CatalogSource_base: Context.ServiceClass<CatalogSource, "@voltro/CatalogSource", CatalogSourceService>;
47
+
48
+ /** Read only. Call at join/workflow boundaries, never from a room tick. */
49
+ declare interface CatalogSourceService {
50
+ readonly read: (scope: CatalogScope) => Effect.Effect<CatalogSnapshot, InventoryError>;
51
+ }
52
+
53
+ export declare const catalogSourceSystemFixture: Readonly<{
54
+ kind: "port";
55
+ tag: typeof CatalogSource;
56
+ fakeLayer: Layer_2<InventoryPort | CraftingPort | CatalogSource, never, never>;
57
+ probe: {
58
+ run: () => Effect.Effect<{
59
+ revision: string;
60
+ items: string[];
61
+ }, InventoryError, never>;
62
+ expected: {
63
+ revision: string;
64
+ items: string[];
65
+ };
66
+ };
67
+ }>;
68
+
69
+ /** Uses the actual recipe declaration; amounts are illustrative fixture rules. */
70
+ export declare const craftFixture: () => Readonly<{
71
+ recipe: Recipe;
72
+ batches: 1;
73
+ at: number;
74
+ available: readonly Readonly<{
75
+ id: "fixture.potion";
76
+ itemId: "test.potion";
77
+ schemaVersion: 1;
78
+ qty: 6;
79
+ attributes: Readonly<{}>;
80
+ acquiredAt: number;
81
+ expiresAt: null;
82
+ locked: false;
83
+ source: "fixture";
84
+ }>[];
85
+ excludedIds: readonly never[];
86
+ }>;
87
+
88
+ export declare const craftingFakeLayer: Layer_2<InventoryPort | CraftingPort | CatalogSource, never, never>;
89
+
90
+ declare class CraftingPort extends CraftingPort_base {
91
+ }
92
+
93
+ declare const CraftingPort_base: Context.ServiceClass<CraftingPort, "@voltro/CraftingPort", CraftingService>;
94
+
95
+ export declare const craftingPortSystemFixture: Readonly<{
96
+ kind: "port";
97
+ tag: typeof CraftingPort;
98
+ fakeLayer: Layer_2<InventoryPort | CraftingPort | CatalogSource, never, never>;
99
+ probe: {
100
+ run: () => Effect.Effect<{
101
+ original: boolean;
102
+ quantity: number;
103
+ }, InventoryError, never>;
104
+ expected: {
105
+ original: boolean;
106
+ quantity: number;
107
+ };
108
+ };
109
+ }>;
110
+
111
+ /** Small independent seam; InventoryPort retains its eight-method surface. */
112
+ declare interface CraftingService {
113
+ readonly craft: (subject: Subject, input: CraftRequest) => Effect.Effect<InventoryReceipt, InventoryError>;
114
+ readonly recipes: (subject: Subject) => Effect.Effect<readonly Recipe[], InventoryError>;
115
+ readonly exportSubject: (target: PluginPrivacyTarget) => Effect.Effect<unknown, InventoryError>;
116
+ readonly eraseSubject: (target: PluginPrivacyTarget) => Effect.Effect<void, InventoryError>;
117
+ }
118
+
119
+ declare interface CraftInput {
120
+ readonly recipe: Recipe;
121
+ readonly batches: number;
122
+ readonly at: number;
123
+ readonly available: readonly InventoryInstance[];
124
+ readonly excludedIds: readonly string[];
125
+ }
126
+
127
+ declare interface CraftPlan {
128
+ readonly consume: readonly {
129
+ readonly instanceId: string;
130
+ readonly qty: number;
131
+ }[];
132
+ readonly outputs: readonly RecipeOutput[];
133
+ }
134
+
135
+ declare interface CraftRequest {
136
+ readonly tenantId: string;
137
+ readonly owner: InventoryOwner;
138
+ readonly recipeId: string;
139
+ readonly requestId: string;
140
+ readonly batches?: number;
141
+ }
142
+
143
+ declare type CraftResolver = (input: CraftInput) => CraftPlan;
144
+
145
+ export declare const craftResolverSystemFixture: Readonly<{
146
+ kind: "slot";
147
+ defaultImplementation: CraftResolver;
148
+ defaultProbe: {
149
+ run: () => Effect.Effect< CraftPlan, never, never>;
150
+ expected: {
151
+ consume: {
152
+ instanceId: string;
153
+ qty: number;
154
+ }[];
155
+ outputs: {
156
+ itemId: string;
157
+ qty: number;
158
+ }[];
159
+ };
160
+ };
161
+ overrideProbe: {
162
+ run: () => Effect.Effect< CraftPlan, never, never>;
163
+ expected: {
164
+ consume: {
165
+ instanceId: string;
166
+ qty: number;
167
+ }[];
168
+ outputs: {
169
+ itemId: string;
170
+ qty: number;
171
+ }[];
172
+ };
173
+ };
174
+ }>;
175
+
176
+ declare interface ExpiryInput {
177
+ readonly item: CatalogItem;
178
+ readonly acquiredAt: number;
179
+ }
180
+
181
+ declare type ExpiryPolicy = (input: ExpiryInput) => number | null;
182
+
183
+ export declare const expiryPolicySystemFixture: Readonly<{
184
+ kind: "slot";
185
+ defaultImplementation: ExpiryPolicy;
186
+ defaultProbe: {
187
+ run: () => Effect.Effect<number | null, never, never>;
188
+ expected: null;
189
+ };
190
+ overrideProbe: {
191
+ run: () => Effect.Effect<number | null, never, never>;
192
+ expected: number;
193
+ };
194
+ }>;
195
+
196
+ declare interface InventoryConsume {
197
+ readonly tenantId: string;
198
+ readonly owner: InventoryOwner;
199
+ readonly requestId: string;
200
+ readonly instanceId: string;
201
+ readonly qty: number;
202
+ readonly reason: string;
203
+ readonly ref: InventoryRef;
204
+ }
205
+
206
+ declare interface InventoryEquip {
207
+ readonly slotSet: string;
208
+ readonly slot: string;
209
+ readonly instanceId: string | null;
210
+ readonly requestId: string;
211
+ }
212
+
213
+ /** Public errors carry codes, never subjects, catalog values or provider causes. */
214
+ declare class InventoryError extends InventoryError_base {
215
+ }
216
+
217
+ declare const InventoryError_base: Schema.Class<InventoryError, Schema.TaggedStruct<"InventoryError", {
218
+ readonly code: Schema.Literals<readonly ["invalid_input", "invalid_record", "invalid_item", "invalid_attributes", "conflict", "forbidden", "not_found", "unavailable", "limit_exceeded", "erased", "insufficient_items", "insufficient_funds", "payment_refused", "locked", "expired", "invalid_slot"]>;
219
+ }>, YieldableError>;
220
+
221
+ declare interface InventoryExpire {
222
+ readonly tenantId: string;
223
+ readonly owner: InventoryOwner;
224
+ readonly requestId: string;
225
+ readonly until: number;
226
+ }
227
+
228
+ export declare const inventoryFakeLayer: Layer_2<InventoryPort | CraftingPort | CatalogSource, never, never>;
229
+
230
+ /** Illustrative fixtures invoke the exported runtime contract and content validator. */
231
+ export declare const inventoryFixture: () => Readonly<{
232
+ item: ItemContract;
233
+ content: CatalogItem;
234
+ stack: Readonly<{
235
+ item: CatalogItem;
236
+ quantity: 12;
237
+ available: readonly {
238
+ id: string;
239
+ quantity: number;
240
+ }[];
241
+ }>;
242
+ expiry: Readonly<{
243
+ item: CatalogItem;
244
+ acquiredAt: number;
245
+ }>;
246
+ }>;
247
+
248
+ declare interface InventoryGrant {
249
+ readonly tenantId: string;
250
+ readonly owner: InventoryOwner;
251
+ readonly requestId: string;
252
+ readonly itemId: string;
253
+ readonly qty: number;
254
+ readonly attributes?: JsonValue;
255
+ readonly reason: string;
256
+ readonly ref: InventoryRef;
257
+ }
258
+
259
+ declare interface InventoryInstance {
260
+ readonly id: string;
261
+ readonly itemId: string;
262
+ readonly schemaVersion: number;
263
+ readonly qty: number;
264
+ readonly attributes: JsonValue;
265
+ readonly acquiredAt: number;
266
+ readonly expiresAt: number | null;
267
+ readonly locked: boolean;
268
+ readonly source: string;
269
+ }
270
+
271
+ declare interface InventoryLoadout {
272
+ readonly slotSet: string;
273
+ readonly slot: string;
274
+ readonly instanceId: string;
275
+ }
276
+
277
+ declare interface InventoryOwner {
278
+ readonly ownerKind: 'player' | 'guild';
279
+ readonly ownerId: string;
280
+ }
281
+
282
+ declare class InventoryPort extends InventoryPort_base {
283
+ }
284
+
285
+ declare const InventoryPort_base: Context.ServiceClass<InventoryPort, "@voltro/InventoryPort", InventoryService>;
286
+
287
+ /** Explicit test-only scoped Layer; actual SQL-owned writers on one private InMemoryDataStore, never a production backend. */
288
+ export declare function inventoryPortFixture(input: InventoryPortFixtureOptions & {
289
+ readonly recipes: readonly Recipe[];
290
+ }): Readonly<{
291
+ layer: Layer.Layer<InventoryPort | CatalogSource | CraftingPort>;
292
+ }>;
293
+
294
+ export declare function inventoryPortFixture(input: InventoryPortFixtureOptions): Readonly<{
295
+ layer: Layer.Layer<InventoryPort | CatalogSource>;
296
+ }>;
297
+
298
+ export declare interface InventoryPortFixtureOptions {
299
+ readonly tenantId: string;
300
+ readonly items: readonly ItemDefinition[];
301
+ readonly content: readonly CatalogItem[];
302
+ readonly recipes?: readonly Recipe[];
303
+ readonly slotSets?: Readonly<Record<string, readonly string[]>>;
304
+ readonly now?: () => number;
305
+ }
306
+
307
+ export declare const inventoryPortSystemFixture: Readonly<{
308
+ kind: "port";
309
+ tag: typeof InventoryPort;
310
+ fakeLayer: Layer_2<InventoryPort | CraftingPort | CatalogSource, never, never>;
311
+ probe: {
312
+ run: () => Effect.Effect<number, InventoryError, never>;
313
+ expected: number;
314
+ };
315
+ }>;
316
+
317
+ declare interface InventoryReceipt {
318
+ readonly operationId: string;
319
+ readonly kind: 'grant' | 'consume' | 'equip' | 'expire' | 'craft' | 'reserve' | 'release' | 'transfer-out' | 'transfer-in';
320
+ readonly changes: readonly {
321
+ readonly instanceId: string;
322
+ readonly delta: number;
323
+ }[];
324
+ readonly at: number;
325
+ }
326
+
327
+ declare interface InventoryRef {
328
+ readonly kind: string;
329
+ readonly id: string;
330
+ }
331
+
332
+ /** Installed routes and trusted callers use this same replaceable service. */
333
+ declare interface InventoryService {
334
+ readonly grant: (subject: Subject, input: InventoryGrant) => Effect.Effect<InventoryReceipt, InventoryError>;
335
+ readonly consume: (subject: Subject, input: InventoryConsume) => Effect.Effect<InventoryReceipt, InventoryError>;
336
+ readonly mine: (subject: Subject) => Effect.Effect<readonly InventoryInstance[], InventoryError>;
337
+ readonly loadout: (subject: Subject, slotSet: string) => Effect.Effect<readonly InventoryLoadout[], InventoryError>;
338
+ readonly equip: (subject: Subject, input: InventoryEquip) => Effect.Effect<InventoryReceipt, InventoryError>;
339
+ readonly expire: (subject: Subject, input: InventoryExpire) => Effect.Effect<InventoryReceipt, InventoryError>;
340
+ readonly exportSubject: (target: PluginPrivacyTarget) => Effect.Effect<unknown, InventoryError>;
341
+ readonly eraseSubject: (target: PluginPrivacyTarget) => Effect.Effect<void, InventoryError>;
342
+ }
343
+
344
+ declare const ITEM_KINDS: readonly ["consumable", "equipment", "cosmetic", "currencyBundle", "key", "mod"];
345
+
346
+ declare interface ItemContract extends Omit<ItemDefinition, 'schemaVersion' | 'equipSlot' | 'expiresAfter' | 'display'> {
347
+ readonly schemaVersion: number;
348
+ readonly equipSlot: string | null;
349
+ readonly expiresAfter: number | null;
350
+ readonly display: {
351
+ readonly nameKey: string;
352
+ readonly icon: string | null;
353
+ };
354
+ }
355
+
356
+ declare interface ItemDefinition {
357
+ readonly id: string;
358
+ readonly kind: ItemKind;
359
+ readonly schemaVersion?: number;
360
+ readonly stackable: boolean;
361
+ readonly maxStack: number;
362
+ readonly tradable: boolean;
363
+ readonly rarity: string;
364
+ readonly tags: readonly string[];
365
+ readonly attributes: Schema.Top;
366
+ readonly instanceAttributes: Schema.Top;
367
+ readonly equipSlot?: string | null;
368
+ /** Milliseconds; resolved on grant, never by a tick. */
369
+ readonly expiresAfter?: number | null;
370
+ readonly display: {
371
+ readonly nameKey: string;
372
+ readonly icon?: string | null;
373
+ };
374
+ }
375
+
376
+ declare type ItemKind = typeof ITEM_KINDS[number];
377
+
378
+ declare type JsonValue = null | boolean | number | string | readonly JsonValue[] | {
379
+ readonly [key: string]: JsonValue;
380
+ };
381
+
382
+ declare interface Recipe {
383
+ readonly id: string;
384
+ readonly version: number;
385
+ readonly inputs: readonly RecipeIngredient[];
386
+ readonly outputs: readonly RecipeOutput[];
387
+ readonly maxBatches: number;
388
+ readonly cost: RecipeCurrencyCost | null;
389
+ readonly timeMs: 0;
390
+ readonly requires: null;
391
+ }
392
+
393
+ declare interface RecipeCurrencyCost {
394
+ readonly currency: string;
395
+ readonly amount: string;
396
+ }
397
+
398
+ declare interface RecipeIngredient {
399
+ readonly itemId: string;
400
+ readonly qty: number;
401
+ }
402
+
403
+ declare interface RecipeOutput extends RecipeIngredient {
404
+ readonly attributes?: JsonValue;
405
+ }
406
+
407
+ declare interface StackInput {
408
+ readonly item: CatalogItem;
409
+ readonly quantity: number;
410
+ readonly available: readonly {
411
+ readonly id: string;
412
+ readonly quantity: number;
413
+ }[];
414
+ }
415
+
416
+ declare interface StackPlan {
417
+ readonly existing: readonly {
418
+ readonly id: string;
419
+ readonly add: number;
420
+ }[];
421
+ readonly create: readonly number[];
422
+ }
423
+
424
+ declare type StackPolicy = (input: StackInput) => StackPlan;
425
+
426
+ export declare const stackPolicySystemFixture: Readonly<{
427
+ kind: "slot";
428
+ defaultImplementation: StackPolicy;
429
+ defaultProbe: {
430
+ run: () => Effect.Effect< StackPlan, never, never>;
431
+ expected: {
432
+ existing: {
433
+ id: string;
434
+ add: number;
435
+ }[];
436
+ create: number[];
437
+ };
438
+ };
439
+ overrideProbe: {
440
+ run: () => Effect.Effect< StackPlan, never, never>;
441
+ expected: {
442
+ existing: never[];
443
+ create: number[];
444
+ };
445
+ };
446
+ }>;
447
+
448
+ export { }
@@ -0,0 +1,4 @@
1
+ import { craftFixture as e, inventoryFixture as t } from "./declarationFixtures.js";
2
+ import { inventoryPortFixture as n } from "./inventoryPort.fixture.js";
3
+ import { catalogFakeLayer as r, catalogSourceSystemFixture as i, craftResolverSystemFixture as a, craftingFakeLayer as o, craftingPortSystemFixture as s, expiryPolicySystemFixture as c, inventoryFakeLayer as l, inventoryPortSystemFixture as u, stackPolicySystemFixture as d } from "./systemFixtures.js";
4
+ export { r as catalogFakeLayer, i as catalogSourceSystemFixture, e as craftFixture, a as craftResolverSystemFixture, o as craftingFakeLayer, s as craftingPortSystemFixture, c as expiryPolicySystemFixture, l as inventoryFakeLayer, t as inventoryFixture, n as inventoryPortFixture, u as inventoryPortSystemFixture, d as stackPolicySystemFixture };
package/dist/web.d.ts ADDED
@@ -0,0 +1,60 @@
1
+ import { ActionState } from '@voltro/client';
2
+ import { SubscriptionState } from '@voltro/client';
3
+
4
+ export declare const useCatalog: (apiName?: string) => SubscriptionState<{
5
+ readonly revision: string;
6
+ readonly items: readonly {
7
+ readonly id: string;
8
+ readonly schemaVersion: number;
9
+ readonly kind: "key" | "consumable" | "equipment" | "cosmetic" | "currencyBundle" | "mod";
10
+ readonly stackable: boolean;
11
+ readonly maxStack: number;
12
+ readonly tradable: boolean;
13
+ readonly rarity: string;
14
+ readonly tags: readonly string[];
15
+ readonly equipSlot: string | null;
16
+ readonly expiresAfter: number | null;
17
+ readonly display: {
18
+ readonly nameKey: string;
19
+ readonly icon: string | null;
20
+ };
21
+ readonly attributes: unknown;
22
+ readonly instanceDefaults: unknown;
23
+ }[];
24
+ }>;
25
+
26
+ export declare const useInventory: (apiName?: string) => SubscriptionState<readonly {
27
+ readonly id: string;
28
+ readonly itemId: string;
29
+ readonly schemaVersion: number;
30
+ readonly qty: number;
31
+ readonly attributes: unknown;
32
+ readonly acquiredAt: number;
33
+ readonly expiresAt: number | null;
34
+ readonly locked: boolean;
35
+ readonly source: string;
36
+ }[]>;
37
+
38
+ /** Sends only the declared equip intention; the own live subscriptions supply accepted state. */
39
+ export declare const useInventoryEquip: (apiName?: string) => ActionState<{
40
+ readonly slotSet: string;
41
+ readonly slot: string;
42
+ readonly instanceId: string | null;
43
+ readonly requestId: string;
44
+ }, {
45
+ readonly operationId: string;
46
+ readonly kind: "grant" | "expire" | "release" | "reserve" | "consume" | "equip" | "craft" | "transfer-out" | "transfer-in";
47
+ readonly changes: readonly {
48
+ readonly instanceId: string;
49
+ readonly delta: number;
50
+ }[];
51
+ readonly at: number;
52
+ }>;
53
+
54
+ export declare const useLoadout: (slotSet: string, apiName?: string) => SubscriptionState<readonly {
55
+ readonly slotSet: string;
56
+ readonly slot: string;
57
+ readonly instanceId: string;
58
+ }[]>;
59
+
60
+ export { }
package/dist/web.js ADDED
@@ -0,0 +1,7 @@
1
+ import { INVENTORY_NAME as e } from "./rpc.js";
2
+ import { pluginTag as t } from "@voltro/protocol";
3
+ import { useAction as n, useSubscription as r } from "@voltro/client";
4
+ //#region src/web.ts
5
+ var i = (n = "app") => r(n, t(e, "mine"), {}), a = (n, i = "app") => r(i, t(e, "loadout"), { slotSet: n }), o = (n = "app") => r(n, t(e, "catalog"), {}), s = (r = "app") => n(r, t(e, "equip"));
6
+ //#endregion
7
+ export { o as useCatalog, i as useInventory, s as useInventoryEquip, a as useLoadout };
package/package.json CHANGED
@@ -1,6 +1,106 @@
1
1
  {
2
2
  "name": "@voltro/plugin-inventory",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.87.0",
4
+ "description": "Versioned catalogs, SQL-owned item grants and consumption, bounded stacks, equip intentions and privacy fences.",
5
+ "keywords": [
6
+ "voltro",
7
+ "typescript",
8
+ "framework"
9
+ ],
10
+ "license": "SEE LICENSE IN LICENSE",
11
+ "homepage": "https://voltro.dev",
12
+ "bugs": {
13
+ "email": "support@voltro.dev"
14
+ },
15
+ "author": {
16
+ "name": "Voltro UG",
17
+ "url": "https://voltro.dev"
18
+ },
19
+ "type": "module",
20
+ "exports": {
21
+ ".": {
22
+ "types": "./dist/index.d.ts",
23
+ "import": "./dist/index.js",
24
+ "default": "./dist/index.js"
25
+ },
26
+ "./errors": {
27
+ "types": "./dist/errors.d.ts",
28
+ "import": "./dist/errors.js",
29
+ "default": "./dist/errors.js"
30
+ },
31
+ "./catalog": {
32
+ "types": "./dist/catalog.d.ts",
33
+ "import": "./dist/catalog.js",
34
+ "default": "./dist/catalog.js"
35
+ },
36
+ "./items": {
37
+ "types": "./dist/item.d.ts",
38
+ "import": "./dist/item.js",
39
+ "default": "./dist/item.js"
40
+ },
41
+ "./strategies": {
42
+ "types": "./dist/strategies.d.ts",
43
+ "import": "./dist/strategies.js",
44
+ "default": "./dist/strategies.js"
45
+ },
46
+ "./server": {
47
+ "types": "./dist/server.d.ts",
48
+ "import": "./dist/server.js",
49
+ "default": "./dist/server.js"
50
+ },
51
+ "./cms": {
52
+ "types": "./dist/cmsCatalog.d.ts",
53
+ "import": "./dist/cmsCatalog.js",
54
+ "default": "./dist/cmsCatalog.js"
55
+ },
56
+ "./testing": {
57
+ "types": "./dist/testing.d.ts",
58
+ "import": "./dist/testing.js",
59
+ "default": "./dist/testing.js"
60
+ },
61
+ "./rpc": {
62
+ "types": "./dist/rpc.d.ts",
63
+ "import": "./dist/rpc.js",
64
+ "default": "./dist/rpc.js"
65
+ },
66
+ "./web": {
67
+ "types": "./dist/web.d.ts",
68
+ "import": "./dist/web.js",
69
+ "default": "./dist/web.js"
70
+ },
71
+ "./package.json": "./package.json",
72
+ "./crafting": {
73
+ "types": "./dist/crafting.d.ts",
74
+ "import": "./dist/crafting.js",
75
+ "default": "./dist/crafting.js"
76
+ },
77
+ "./components": {
78
+ "types": "./dist/components.d.ts",
79
+ "import": "./dist/components.js",
80
+ "default": "./dist/components.js"
81
+ }
82
+ },
83
+ "main": "./dist/index.js",
84
+ "module": "./dist/index.js",
85
+ "types": "./dist/index.d.ts",
86
+ "sideEffects": false,
87
+ "engines": {
88
+ "node": ">=24.0.0"
89
+ },
90
+ "dependencies": {
91
+ "@voltro/database": "0.87.0",
92
+ "@voltro/protocol": "0.87.0",
93
+ "@voltro/client": "0.87.0",
94
+ "@voltro/cms": "0.87.0",
95
+ "@voltro/ui-shadcn": "0.87.0",
96
+ "@voltro/runtime": "0.87.0",
97
+ "@voltro/plugin-licensing": "0.87.0"
98
+ },
99
+ "peerDependencies": {
100
+ "effect": "4.0.1",
101
+ "react": "^19.0.0"
102
+ },
103
+ "publishConfig": {
104
+ "access": "public"
105
+ }
106
+ }