@objectstack/objectql 3.0.7 → 3.0.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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @objectstack/objectql@3.0.7 build /home/runner/work/spec/spec/packages/objectql
2
+ > @objectstack/objectql@3.0.9 build /home/runner/work/spec/spec/packages/objectql
3
3
  > tsup --config ../../tsup.config.ts
4
4
 
5
5
  CLI Building entry: src/index.ts
@@ -10,13 +10,13 @@
10
10
  CLI Cleaning output folder
11
11
  ESM Build start
12
12
  CJS Build start
13
- CJS dist/index.js 84.46 KB
14
- CJS dist/index.js.map 171.04 KB
15
- CJS ⚡️ Build success in 157ms
16
- ESM dist/index.mjs 82.74 KB
17
- ESM dist/index.mjs.map 169.75 KB
18
- ESM ⚡️ Build success in 157ms
13
+ ESM dist/index.mjs 88.87 KB
14
+ ESM dist/index.mjs.map 182.19 KB
15
+ ESM ⚡️ Build success in 230ms
16
+ CJS dist/index.js 90.59 KB
17
+ CJS dist/index.js.map 183.48 KB
18
+ CJS ⚡️ Build success in 230ms
19
19
  DTS Build start
20
- DTS ⚡️ Build success in 18224ms
21
- DTS dist/index.d.mts 70.90 KB
22
- DTS dist/index.d.ts 70.90 KB
20
+ DTS ⚡️ Build success in 20591ms
21
+ DTS dist/index.d.mts 73.43 KB
22
+ DTS dist/index.d.ts 73.43 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @objectstack/objectql
2
2
 
3
+ ## 3.0.9
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [15e0df6]
8
+ - @objectstack/spec@3.0.9
9
+ - @objectstack/core@3.0.9
10
+ - @objectstack/types@3.0.9
11
+
12
+ ## 3.0.8
13
+
14
+ ### Patch Changes
15
+
16
+ - Updated dependencies [5a968a2]
17
+ - @objectstack/spec@3.0.8
18
+ - @objectstack/core@3.0.8
19
+ - @objectstack/types@3.0.8
20
+
3
21
  ## 3.0.7
4
22
 
5
23
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -4,6 +4,7 @@ import { ServiceObject, ObjectOwnership, HookContext, QueryAST, DataEngineQueryO
4
4
  import { ObjectStackManifest, InstalledPackage, ExecutionContext } from '@objectstack/spec/kernel';
5
5
  import { ObjectStackProtocol, MetadataCacheRequest, MetadataCacheResponse, BatchUpdateRequest, BatchUpdateResponse, UpdateManyDataRequest, DeleteManyDataRequest } from '@objectstack/spec/api';
6
6
  import { IDataEngine, DriverInterface, Logger, Plugin, PluginContext, ObjectKernel } from '@objectstack/core';
7
+ import { IFeedService } from '@objectstack/spec/contracts';
7
8
 
8
9
  /**
9
10
  * XState-inspired State Machine Protocol
@@ -220,6 +221,7 @@ declare class SchemaRegistry {
220
221
  label?: string | undefined;
221
222
  description?: string | undefined;
222
223
  format?: string | undefined;
224
+ columnName?: string | undefined;
223
225
  defaultValue?: unknown;
224
226
  maxLength?: number | undefined;
225
227
  minLength?: number | undefined;
@@ -482,6 +484,24 @@ declare class SchemaRegistry {
482
484
  favicon?: string | undefined;
483
485
  } | undefined;
484
486
  navigation?: any[] | undefined;
487
+ areas?: {
488
+ id: string;
489
+ label: string | {
490
+ key: string;
491
+ defaultValue?: string | undefined;
492
+ params?: Record<string, string | number | boolean> | undefined;
493
+ };
494
+ navigation: any[];
495
+ icon?: string | undefined;
496
+ order?: number | undefined;
497
+ description?: string | {
498
+ key: string;
499
+ defaultValue?: string | undefined;
500
+ params?: Record<string, string | number | boolean> | undefined;
501
+ } | undefined;
502
+ visible?: string | undefined;
503
+ requiredPermissions?: string[] | undefined;
504
+ }[] | undefined;
485
505
  homePageId?: string | undefined;
486
506
  requiredPermissions?: string[] | undefined;
487
507
  objects?: unknown[] | undefined;
@@ -687,7 +707,7 @@ declare class SchemaRegistry {
687
707
  preload?: {
688
708
  enabled: boolean;
689
709
  priority: number;
690
- resources?: ("dependencies" | "code" | "metadata" | "services" | "assets")[] | undefined;
710
+ resources?: ("dependencies" | "code" | "metadata" | "assets" | "services")[] | undefined;
691
711
  conditions?: {
692
712
  routes?: string[] | undefined;
693
713
  roles?: string[] | undefined;
@@ -821,6 +841,9 @@ declare class SchemaRegistry {
821
841
  } | undefined;
822
842
  } | undefined;
823
843
  } | undefined;
844
+ engine?: {
845
+ objectstack: string;
846
+ } | undefined;
824
847
  };
825
848
  status: "error" | "disabled" | "installed" | "installing" | "upgrading" | "uninstalling";
826
849
  enabled: boolean;
@@ -831,6 +854,14 @@ declare class SchemaRegistry {
831
854
  statusChangedAt?: string | undefined;
832
855
  errorMessage?: string | undefined;
833
856
  settings?: Record<string, unknown> | undefined;
857
+ upgradeHistory?: {
858
+ fromVersion: string;
859
+ toVersion: string;
860
+ upgradedAt: string;
861
+ status: "success" | "failed" | "rolled_back";
862
+ migrationLog?: string[] | undefined;
863
+ }[] | undefined;
864
+ registeredNamespaces?: string[] | undefined;
834
865
  } | {
835
866
  id: string;
836
867
  version: string;
@@ -1001,7 +1032,7 @@ declare class SchemaRegistry {
1001
1032
  preload?: {
1002
1033
  enabled: boolean;
1003
1034
  priority: number;
1004
- resources?: ("dependencies" | "code" | "metadata" | "services" | "assets")[] | undefined;
1035
+ resources?: ("dependencies" | "code" | "metadata" | "assets" | "services")[] | undefined;
1005
1036
  conditions?: {
1006
1037
  routes?: string[] | undefined;
1007
1038
  roles?: string[] | undefined;
@@ -1135,6 +1166,9 @@ declare class SchemaRegistry {
1135
1166
  } | undefined;
1136
1167
  } | undefined;
1137
1168
  } | undefined;
1169
+ engine?: {
1170
+ objectstack: string;
1171
+ } | undefined;
1138
1172
  };
1139
1173
  /**
1140
1174
  * Universal Unregister Method
@@ -1180,7 +1214,9 @@ declare class SchemaRegistry {
1180
1214
  declare class ObjectStackProtocolImplementation implements ObjectStackProtocol {
1181
1215
  private engine;
1182
1216
  private getServicesRegistry?;
1183
- constructor(engine: IDataEngine, getServicesRegistry?: () => Map<string, any>);
1217
+ private getFeedService?;
1218
+ constructor(engine: IDataEngine, getServicesRegistry?: () => Map<string, any>, getFeedService?: () => IFeedService | undefined);
1219
+ private requireFeedService;
1184
1220
  getDiscovery(): Promise<{
1185
1221
  version: string;
1186
1222
  apiName: string;
@@ -1205,8 +1241,24 @@ declare class ObjectStackProtocolImplementation implements ObjectStackProtocol {
1205
1241
  status: "degraded" | "stub" | "available" | "unavailable";
1206
1242
  route?: string | undefined;
1207
1243
  provider?: string | undefined;
1244
+ version?: string | undefined;
1208
1245
  message?: string | undefined;
1246
+ rateLimit?: {
1247
+ requestsPerMinute?: number | undefined;
1248
+ requestsPerHour?: number | undefined;
1249
+ burstLimit?: number | undefined;
1250
+ retryAfterMs?: number | undefined;
1251
+ } | undefined;
1209
1252
  }>;
1253
+ capabilities: {
1254
+ feed: boolean;
1255
+ comments: boolean;
1256
+ automation: boolean;
1257
+ cron: boolean;
1258
+ search: boolean;
1259
+ export: boolean;
1260
+ chunkedUpload: boolean;
1261
+ };
1210
1262
  }>;
1211
1263
  getMetaTypes(): Promise<{
1212
1264
  types: string[];
@@ -1334,6 +1386,20 @@ declare class ObjectStackProtocolImplementation implements ObjectStackProtocol {
1334
1386
  success: boolean;
1335
1387
  message: string;
1336
1388
  }>;
1389
+ listFeed(request: any): Promise<any>;
1390
+ createFeedItem(request: any): Promise<any>;
1391
+ updateFeedItem(request: any): Promise<any>;
1392
+ deleteFeedItem(request: any): Promise<any>;
1393
+ addReaction(request: any): Promise<any>;
1394
+ removeReaction(request: any): Promise<any>;
1395
+ pinFeedItem(request: any): Promise<any>;
1396
+ unpinFeedItem(request: any): Promise<any>;
1397
+ starFeedItem(request: any): Promise<any>;
1398
+ unstarFeedItem(request: any): Promise<any>;
1399
+ searchFeed(request: any): Promise<any>;
1400
+ getChangelog(request: any): Promise<any>;
1401
+ feedSubscribe(request: any): Promise<any>;
1402
+ feedUnsubscribe(request: any): Promise<any>;
1337
1403
  }
1338
1404
 
1339
1405
  type HookHandler = (context: HookContext) => Promise<void> | void;
package/dist/index.d.ts CHANGED
@@ -4,6 +4,7 @@ import { ServiceObject, ObjectOwnership, HookContext, QueryAST, DataEngineQueryO
4
4
  import { ObjectStackManifest, InstalledPackage, ExecutionContext } from '@objectstack/spec/kernel';
5
5
  import { ObjectStackProtocol, MetadataCacheRequest, MetadataCacheResponse, BatchUpdateRequest, BatchUpdateResponse, UpdateManyDataRequest, DeleteManyDataRequest } from '@objectstack/spec/api';
6
6
  import { IDataEngine, DriverInterface, Logger, Plugin, PluginContext, ObjectKernel } from '@objectstack/core';
7
+ import { IFeedService } from '@objectstack/spec/contracts';
7
8
 
8
9
  /**
9
10
  * XState-inspired State Machine Protocol
@@ -220,6 +221,7 @@ declare class SchemaRegistry {
220
221
  label?: string | undefined;
221
222
  description?: string | undefined;
222
223
  format?: string | undefined;
224
+ columnName?: string | undefined;
223
225
  defaultValue?: unknown;
224
226
  maxLength?: number | undefined;
225
227
  minLength?: number | undefined;
@@ -482,6 +484,24 @@ declare class SchemaRegistry {
482
484
  favicon?: string | undefined;
483
485
  } | undefined;
484
486
  navigation?: any[] | undefined;
487
+ areas?: {
488
+ id: string;
489
+ label: string | {
490
+ key: string;
491
+ defaultValue?: string | undefined;
492
+ params?: Record<string, string | number | boolean> | undefined;
493
+ };
494
+ navigation: any[];
495
+ icon?: string | undefined;
496
+ order?: number | undefined;
497
+ description?: string | {
498
+ key: string;
499
+ defaultValue?: string | undefined;
500
+ params?: Record<string, string | number | boolean> | undefined;
501
+ } | undefined;
502
+ visible?: string | undefined;
503
+ requiredPermissions?: string[] | undefined;
504
+ }[] | undefined;
485
505
  homePageId?: string | undefined;
486
506
  requiredPermissions?: string[] | undefined;
487
507
  objects?: unknown[] | undefined;
@@ -687,7 +707,7 @@ declare class SchemaRegistry {
687
707
  preload?: {
688
708
  enabled: boolean;
689
709
  priority: number;
690
- resources?: ("dependencies" | "code" | "metadata" | "services" | "assets")[] | undefined;
710
+ resources?: ("dependencies" | "code" | "metadata" | "assets" | "services")[] | undefined;
691
711
  conditions?: {
692
712
  routes?: string[] | undefined;
693
713
  roles?: string[] | undefined;
@@ -821,6 +841,9 @@ declare class SchemaRegistry {
821
841
  } | undefined;
822
842
  } | undefined;
823
843
  } | undefined;
844
+ engine?: {
845
+ objectstack: string;
846
+ } | undefined;
824
847
  };
825
848
  status: "error" | "disabled" | "installed" | "installing" | "upgrading" | "uninstalling";
826
849
  enabled: boolean;
@@ -831,6 +854,14 @@ declare class SchemaRegistry {
831
854
  statusChangedAt?: string | undefined;
832
855
  errorMessage?: string | undefined;
833
856
  settings?: Record<string, unknown> | undefined;
857
+ upgradeHistory?: {
858
+ fromVersion: string;
859
+ toVersion: string;
860
+ upgradedAt: string;
861
+ status: "success" | "failed" | "rolled_back";
862
+ migrationLog?: string[] | undefined;
863
+ }[] | undefined;
864
+ registeredNamespaces?: string[] | undefined;
834
865
  } | {
835
866
  id: string;
836
867
  version: string;
@@ -1001,7 +1032,7 @@ declare class SchemaRegistry {
1001
1032
  preload?: {
1002
1033
  enabled: boolean;
1003
1034
  priority: number;
1004
- resources?: ("dependencies" | "code" | "metadata" | "services" | "assets")[] | undefined;
1035
+ resources?: ("dependencies" | "code" | "metadata" | "assets" | "services")[] | undefined;
1005
1036
  conditions?: {
1006
1037
  routes?: string[] | undefined;
1007
1038
  roles?: string[] | undefined;
@@ -1135,6 +1166,9 @@ declare class SchemaRegistry {
1135
1166
  } | undefined;
1136
1167
  } | undefined;
1137
1168
  } | undefined;
1169
+ engine?: {
1170
+ objectstack: string;
1171
+ } | undefined;
1138
1172
  };
1139
1173
  /**
1140
1174
  * Universal Unregister Method
@@ -1180,7 +1214,9 @@ declare class SchemaRegistry {
1180
1214
  declare class ObjectStackProtocolImplementation implements ObjectStackProtocol {
1181
1215
  private engine;
1182
1216
  private getServicesRegistry?;
1183
- constructor(engine: IDataEngine, getServicesRegistry?: () => Map<string, any>);
1217
+ private getFeedService?;
1218
+ constructor(engine: IDataEngine, getServicesRegistry?: () => Map<string, any>, getFeedService?: () => IFeedService | undefined);
1219
+ private requireFeedService;
1184
1220
  getDiscovery(): Promise<{
1185
1221
  version: string;
1186
1222
  apiName: string;
@@ -1205,8 +1241,24 @@ declare class ObjectStackProtocolImplementation implements ObjectStackProtocol {
1205
1241
  status: "degraded" | "stub" | "available" | "unavailable";
1206
1242
  route?: string | undefined;
1207
1243
  provider?: string | undefined;
1244
+ version?: string | undefined;
1208
1245
  message?: string | undefined;
1246
+ rateLimit?: {
1247
+ requestsPerMinute?: number | undefined;
1248
+ requestsPerHour?: number | undefined;
1249
+ burstLimit?: number | undefined;
1250
+ retryAfterMs?: number | undefined;
1251
+ } | undefined;
1209
1252
  }>;
1253
+ capabilities: {
1254
+ feed: boolean;
1255
+ comments: boolean;
1256
+ automation: boolean;
1257
+ cron: boolean;
1258
+ search: boolean;
1259
+ export: boolean;
1260
+ chunkedUpload: boolean;
1261
+ };
1210
1262
  }>;
1211
1263
  getMetaTypes(): Promise<{
1212
1264
  types: string[];
@@ -1334,6 +1386,20 @@ declare class ObjectStackProtocolImplementation implements ObjectStackProtocol {
1334
1386
  success: boolean;
1335
1387
  message: string;
1336
1388
  }>;
1389
+ listFeed(request: any): Promise<any>;
1390
+ createFeedItem(request: any): Promise<any>;
1391
+ updateFeedItem(request: any): Promise<any>;
1392
+ deleteFeedItem(request: any): Promise<any>;
1393
+ addReaction(request: any): Promise<any>;
1394
+ removeReaction(request: any): Promise<any>;
1395
+ pinFeedItem(request: any): Promise<any>;
1396
+ unpinFeedItem(request: any): Promise<any>;
1397
+ starFeedItem(request: any): Promise<any>;
1398
+ unstarFeedItem(request: any): Promise<any>;
1399
+ searchFeed(request: any): Promise<any>;
1400
+ getChangelog(request: any): Promise<any>;
1401
+ feedSubscribe(request: any): Promise<any>;
1402
+ feedUnsubscribe(request: any): Promise<any>;
1337
1403
  }
1338
1404
 
1339
1405
  type HookHandler = (context: HookContext) => Promise<void> | void;
package/dist/index.js CHANGED
@@ -558,9 +558,17 @@ var SERVICE_CONFIG = {
558
558
  search: { route: "/api/v1/search", plugin: "plugin-search" }
559
559
  };
560
560
  var ObjectStackProtocolImplementation = class {
561
- constructor(engine, getServicesRegistry) {
561
+ constructor(engine, getServicesRegistry, getFeedService) {
562
562
  this.engine = engine;
563
563
  this.getServicesRegistry = getServicesRegistry;
564
+ this.getFeedService = getFeedService;
565
+ }
566
+ requireFeedService() {
567
+ const svc = this.getFeedService?.();
568
+ if (!svc) {
569
+ throw new Error("Feed service not available. Install and register service-feed to enable feed operations.");
570
+ }
571
+ return svc;
564
572
  }
565
573
  async getDiscovery() {
566
574
  const registeredServices = this.getServicesRegistry ? this.getServicesRegistry() : /* @__PURE__ */ new Map();
@@ -609,16 +617,40 @@ var ObjectStackProtocolImplementation = class {
609
617
  }
610
618
  }
611
619
  }
620
+ if (registeredServices.has("feed")) {
621
+ services["feed"] = {
622
+ enabled: true,
623
+ status: "available",
624
+ route: "/api/v1/data",
625
+ provider: "service-feed"
626
+ };
627
+ } else {
628
+ services["feed"] = {
629
+ enabled: false,
630
+ status: "unavailable",
631
+ message: "Install service-feed to enable"
632
+ };
633
+ }
612
634
  const routes = {
613
635
  data: "/api/v1/data",
614
636
  metadata: "/api/v1/meta",
615
637
  ...optionalRoutes
616
638
  };
639
+ const capabilities = {
640
+ feed: registeredServices.has("feed"),
641
+ comments: registeredServices.has("feed"),
642
+ automation: registeredServices.has("automation"),
643
+ cron: registeredServices.has("job"),
644
+ search: registeredServices.has("search"),
645
+ export: registeredServices.has("automation") || registeredServices.has("queue"),
646
+ chunkedUpload: registeredServices.has("file-storage")
647
+ };
617
648
  return {
618
649
  version: "1.0",
619
650
  apiName: "ObjectStack API",
620
651
  routes,
621
- services
652
+ services,
653
+ capabilities
622
654
  };
623
655
  }
624
656
  async getMetaTypes() {
@@ -1100,6 +1132,137 @@ var ObjectStackProtocolImplementation = class {
1100
1132
  message: "Saved to memory registry"
1101
1133
  };
1102
1134
  }
1135
+ // ==========================================
1136
+ // Feed Operations
1137
+ // ==========================================
1138
+ async listFeed(request) {
1139
+ const svc = this.requireFeedService();
1140
+ const result = await svc.listFeed({
1141
+ object: request.object,
1142
+ recordId: request.recordId,
1143
+ filter: request.type,
1144
+ limit: request.limit,
1145
+ cursor: request.cursor
1146
+ });
1147
+ return { success: true, data: result };
1148
+ }
1149
+ async createFeedItem(request) {
1150
+ const svc = this.requireFeedService();
1151
+ const item = await svc.createFeedItem({
1152
+ object: request.object,
1153
+ recordId: request.recordId,
1154
+ type: request.type,
1155
+ actor: { type: "user", id: "current_user" },
1156
+ body: request.body,
1157
+ mentions: request.mentions,
1158
+ parentId: request.parentId,
1159
+ visibility: request.visibility
1160
+ });
1161
+ return { success: true, data: item };
1162
+ }
1163
+ async updateFeedItem(request) {
1164
+ const svc = this.requireFeedService();
1165
+ const item = await svc.updateFeedItem(request.feedId, {
1166
+ body: request.body,
1167
+ mentions: request.mentions,
1168
+ visibility: request.visibility
1169
+ });
1170
+ return { success: true, data: item };
1171
+ }
1172
+ async deleteFeedItem(request) {
1173
+ const svc = this.requireFeedService();
1174
+ await svc.deleteFeedItem(request.feedId);
1175
+ return { success: true, data: { feedId: request.feedId } };
1176
+ }
1177
+ async addReaction(request) {
1178
+ const svc = this.requireFeedService();
1179
+ const reactions = await svc.addReaction(request.feedId, request.emoji, "current_user");
1180
+ return { success: true, data: { reactions } };
1181
+ }
1182
+ async removeReaction(request) {
1183
+ const svc = this.requireFeedService();
1184
+ const reactions = await svc.removeReaction(request.feedId, request.emoji, "current_user");
1185
+ return { success: true, data: { reactions } };
1186
+ }
1187
+ async pinFeedItem(request) {
1188
+ const svc = this.requireFeedService();
1189
+ const item = await svc.getFeedItem(request.feedId);
1190
+ if (!item) throw new Error(`Feed item ${request.feedId} not found`);
1191
+ await svc.updateFeedItem(request.feedId, { visibility: item.visibility });
1192
+ return { success: true, data: { feedId: request.feedId, pinned: true, pinnedAt: (/* @__PURE__ */ new Date()).toISOString() } };
1193
+ }
1194
+ async unpinFeedItem(request) {
1195
+ const svc = this.requireFeedService();
1196
+ const item = await svc.getFeedItem(request.feedId);
1197
+ if (!item) throw new Error(`Feed item ${request.feedId} not found`);
1198
+ await svc.updateFeedItem(request.feedId, { visibility: item.visibility });
1199
+ return { success: true, data: { feedId: request.feedId, pinned: false } };
1200
+ }
1201
+ async starFeedItem(request) {
1202
+ const svc = this.requireFeedService();
1203
+ const item = await svc.getFeedItem(request.feedId);
1204
+ if (!item) throw new Error(`Feed item ${request.feedId} not found`);
1205
+ await svc.updateFeedItem(request.feedId, { visibility: item.visibility });
1206
+ return { success: true, data: { feedId: request.feedId, starred: true, starredAt: (/* @__PURE__ */ new Date()).toISOString() } };
1207
+ }
1208
+ async unstarFeedItem(request) {
1209
+ const svc = this.requireFeedService();
1210
+ const item = await svc.getFeedItem(request.feedId);
1211
+ if (!item) throw new Error(`Feed item ${request.feedId} not found`);
1212
+ await svc.updateFeedItem(request.feedId, { visibility: item.visibility });
1213
+ return { success: true, data: { feedId: request.feedId, starred: false } };
1214
+ }
1215
+ async searchFeed(request) {
1216
+ const svc = this.requireFeedService();
1217
+ const result = await svc.listFeed({
1218
+ object: request.object,
1219
+ recordId: request.recordId,
1220
+ filter: request.type,
1221
+ limit: request.limit,
1222
+ cursor: request.cursor
1223
+ });
1224
+ const queryLower = (request.query || "").toLowerCase();
1225
+ const filtered = result.items.filter(
1226
+ (item) => item.body?.toLowerCase().includes(queryLower)
1227
+ );
1228
+ return { success: true, data: { items: filtered, total: filtered.length, hasMore: false } };
1229
+ }
1230
+ async getChangelog(request) {
1231
+ const svc = this.requireFeedService();
1232
+ const result = await svc.listFeed({
1233
+ object: request.object,
1234
+ recordId: request.recordId,
1235
+ filter: "changes_only",
1236
+ limit: request.limit,
1237
+ cursor: request.cursor
1238
+ });
1239
+ const entries = result.items.map((item) => ({
1240
+ id: item.id,
1241
+ object: item.object,
1242
+ recordId: item.recordId,
1243
+ actor: item.actor,
1244
+ changes: item.changes || [],
1245
+ timestamp: item.createdAt,
1246
+ source: item.source
1247
+ }));
1248
+ return { success: true, data: { entries, total: result.total, nextCursor: result.nextCursor, hasMore: result.hasMore } };
1249
+ }
1250
+ async feedSubscribe(request) {
1251
+ const svc = this.requireFeedService();
1252
+ const subscription = await svc.subscribe({
1253
+ object: request.object,
1254
+ recordId: request.recordId,
1255
+ userId: "current_user",
1256
+ events: request.events,
1257
+ channels: request.channels
1258
+ });
1259
+ return { success: true, data: subscription };
1260
+ }
1261
+ async feedUnsubscribe(request) {
1262
+ const svc = this.requireFeedService();
1263
+ const unsubscribed = await svc.unsubscribe(request.object, request.recordId, "current_user");
1264
+ return { success: true, data: { object: request.object, recordId: request.recordId, unsubscribed } };
1265
+ }
1103
1266
  };
1104
1267
 
1105
1268
  // src/engine.ts