@objectstack/client 4.0.1 → 4.0.3

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,22 +1,22 @@
1
1
 
2
- > @objectstack/client@4.0.1 build /home/runner/work/spec/spec/packages/client
2
+ > @objectstack/client@4.0.3 build /home/runner/work/framework/framework/packages/client
3
3
  > tsup --config ../../tsup.config.ts
4
4
 
5
5
  CLI Building entry: src/index.ts
6
6
  CLI Using tsconfig: tsconfig.json
7
7
  CLI tsup v8.5.1
8
- CLI Using tsup config: /home/runner/work/spec/spec/tsup.config.ts
8
+ CLI Using tsup config: /home/runner/work/framework/framework/tsup.config.ts
9
9
  CLI Target: es2020
10
10
  CLI Cleaning output folder
11
11
  ESM Build start
12
12
  CJS Build start
13
- CJS dist/index.js 55.15 KB
14
- CJS dist/index.js.map 109.54 KB
15
- CJS ⚡️ Build success in 80ms
16
- ESM dist/index.mjs 53.98 KB
17
- ESM dist/index.mjs.map 109.49 KB
18
- ESM ⚡️ Build success in 90ms
13
+ ESM dist/index.mjs 58.24 KB
14
+ ESM dist/index.mjs.map 118.84 KB
15
+ ESM ⚡️ Build success in 28ms
16
+ CJS dist/index.js 59.44 KB
17
+ CJS dist/index.js.map 118.90 KB
18
+ CJS ⚡️ Build success in 28ms
19
19
  DTS Build start
20
- DTS ⚡️ Build success in 5542ms
21
- DTS dist/index.d.mts 33.59 KB
22
- DTS dist/index.d.ts 33.59 KB
20
+ DTS ⚡️ Build success in 2598ms
21
+ DTS dist/index.d.mts 36.26 KB
22
+ DTS dist/index.d.ts 36.26 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @objectstack/client
2
2
 
3
+ ## 4.0.3
4
+
5
+ ### Patch Changes
6
+
7
+ - @objectstack/spec@4.0.3
8
+ - @objectstack/core@4.0.3
9
+
10
+ ## 4.0.2
11
+
12
+ ### Patch Changes
13
+
14
+ - 5f659e9: fix ai
15
+ - Updated dependencies [5f659e9]
16
+ - @objectstack/spec@4.0.2
17
+ - @objectstack/core@4.0.2
18
+
3
19
  ## 4.0.0
4
20
 
5
21
  ### Minor Changes
package/dist/index.d.mts CHANGED
@@ -1,7 +1,77 @@
1
1
  import { FilterCondition, QueryAST, SortNode, AggregationNode } from '@objectstack/spec/data';
2
- import { ApiRoutes, GetDiscoveryResponse, WellKnownCapabilities, GetMetaTypesResponse, GetMetaItemsResponse, MetadataCacheRequest, MetadataCacheResponse, LoginRequest, SessionResponse, RegisterRequest, FileUploadResponse, GetPresignedUrlRequest, PresignedUrlResponse, InitiateChunkedUploadRequest, InitiateChunkedUploadResponse, UploadChunkResponse, CompleteChunkedUploadRequest, CompleteChunkedUploadResponse, CheckPermissionRequest, CheckPermissionResponse, GetObjectPermissionsResponse, GetEffectivePermissionsResponse, RealtimeConnectRequest, RealtimeConnectResponse, RealtimeSubscribeRequest, RealtimeSubscribeResponse, SetPresenceRequest, GetPresenceResponse, GetWorkflowConfigResponse, GetWorkflowStateResponse, WorkflowTransitionRequest, WorkflowTransitionResponse, WorkflowApproveRequest, WorkflowApproveResponse, WorkflowRejectRequest, WorkflowRejectResponse, ListViewsResponse, GetViewResponse, CreateViewRequest, CreateViewResponse, UpdateViewRequest, UpdateViewResponse, DeleteViewResponse, RegisterDeviceRequest, RegisterDeviceResponse, UnregisterDeviceResponse, GetNotificationPreferencesResponse, UpdateNotificationPreferencesRequest, UpdateNotificationPreferencesResponse, ListNotificationsResponse, MarkNotificationsReadResponse, MarkAllNotificationsReadResponse, AiNlqRequest, AiNlqResponse, AiChatRequest, AiChatResponse, AiSuggestRequest, AiSuggestResponse, AiInsightsRequest, AiInsightsResponse, GetLocalesResponse, GetTranslationsResponse, GetFieldLabelsResponse, GetFeedResponse, CreateFeedItemResponse, UpdateFeedItemResponse, DeleteFeedItemResponse, AddReactionResponse, RemoveReactionResponse, PinFeedItemResponse, UnpinFeedItemResponse, StarFeedItemResponse, UnstarFeedItemResponse, SearchFeedResponse, GetChangelogResponse, SubscribeResponse, UnsubscribeResponse, BatchUpdateRequest, BatchUpdateResponse, BatchOptions, StandardErrorCode, ErrorCategory } from '@objectstack/spec/api';
3
- export { AddReactionResponse, AiChatRequest, AiChatResponse, AiInsightsRequest, AiInsightsResponse, AiNlqRequest, AiNlqResponse, AiSuggestRequest, AiSuggestResponse, BatchOperationResult, BatchOptions, BatchRecord, BatchUpdateRequest, BatchUpdateResponse, CheckPermissionRequest, CheckPermissionResponse, CreateFeedItemResponse, CreateViewResponse, DeleteFeedItemResponse, DeleteManyRequest, DeleteViewResponse, ErrorCategory, GetChangelogResponse, GetDiscoveryResponse, GetEffectivePermissionsResponse, GetFeedResponse, GetFieldLabelsResponse, GetLocalesResponse, GetMetaItemsResponse, GetMetaTypesResponse, GetObjectPermissionsResponse, GetPresenceResponse, GetTranslationsResponse, GetViewResponse, GetWorkflowConfigResponse, GetWorkflowStateResponse, ListNotificationsResponse, ListViewsResponse, MetadataCacheRequest, MetadataCacheResponse, PinFeedItemResponse, RealtimeConnectRequest, RealtimeConnectResponse, RealtimeSubscribeRequest, RealtimeSubscribeResponse, RefreshTokenRequest, RegisterDeviceRequest, RegisterDeviceResponse, RegisterRequest, RemoveReactionResponse, SearchFeedResponse, StandardErrorCode, StarFeedItemResponse, SubscribeResponse, UnpinFeedItemResponse, UnstarFeedItemResponse, UnsubscribeResponse, UpdateFeedItemResponse, UpdateManyRequest, UpdateViewResponse, WellKnownCapabilities, WorkflowApproveRequest, WorkflowApproveResponse, WorkflowRejectRequest, WorkflowRejectResponse, WorkflowTransitionRequest, WorkflowTransitionResponse } from '@objectstack/spec/api';
2
+ import { MetadataEvent, DataEvent, ApiRoutes, GetDiscoveryResponse, WellKnownCapabilities, GetMetaTypesResponse, GetMetaItemsResponse, MetadataCacheRequest, MetadataCacheResponse, LoginRequest, SessionResponse, RegisterRequest, FileUploadResponse, GetPresignedUrlRequest, PresignedUrlResponse, InitiateChunkedUploadRequest, InitiateChunkedUploadResponse, UploadChunkResponse, CompleteChunkedUploadRequest, CompleteChunkedUploadResponse, CheckPermissionRequest, CheckPermissionResponse, GetObjectPermissionsResponse, GetEffectivePermissionsResponse, RealtimeConnectRequest, RealtimeConnectResponse, RealtimeSubscribeRequest, RealtimeSubscribeResponse, SetPresenceRequest, GetPresenceResponse, GetWorkflowConfigResponse, GetWorkflowStateResponse, WorkflowTransitionRequest, WorkflowTransitionResponse, WorkflowApproveRequest, WorkflowApproveResponse, WorkflowRejectRequest, WorkflowRejectResponse, ListViewsResponse, GetViewResponse, CreateViewRequest, CreateViewResponse, UpdateViewRequest, UpdateViewResponse, DeleteViewResponse, RegisterDeviceRequest, RegisterDeviceResponse, UnregisterDeviceResponse, GetNotificationPreferencesResponse, UpdateNotificationPreferencesRequest, UpdateNotificationPreferencesResponse, ListNotificationsResponse, MarkNotificationsReadResponse, MarkAllNotificationsReadResponse, AiNlqRequest, AiNlqResponse, AiSuggestRequest, AiSuggestResponse, AiInsightsRequest, AiInsightsResponse, GetLocalesResponse, GetTranslationsResponse, GetFieldLabelsResponse, GetFeedResponse, CreateFeedItemResponse, UpdateFeedItemResponse, DeleteFeedItemResponse, AddReactionResponse, RemoveReactionResponse, PinFeedItemResponse, UnpinFeedItemResponse, StarFeedItemResponse, UnstarFeedItemResponse, SearchFeedResponse, GetChangelogResponse, SubscribeResponse, UnsubscribeResponse, BatchUpdateRequest, BatchUpdateResponse, BatchOptions, StandardErrorCode, ErrorCategory } from '@objectstack/spec/api';
3
+ export { AddReactionResponse, AiInsightsRequest, AiInsightsResponse, AiNlqRequest, AiNlqResponse, AiSuggestRequest, AiSuggestResponse, BatchOperationResult, BatchOptions, BatchRecord, BatchUpdateRequest, BatchUpdateResponse, CheckPermissionRequest, CheckPermissionResponse, CreateFeedItemResponse, CreateViewResponse, DeleteFeedItemResponse, DeleteManyRequest, DeleteViewResponse, ErrorCategory, GetChangelogResponse, GetDiscoveryResponse, GetEffectivePermissionsResponse, GetFeedResponse, GetFieldLabelsResponse, GetLocalesResponse, GetMetaItemsResponse, GetMetaTypesResponse, GetObjectPermissionsResponse, GetPresenceResponse, GetTranslationsResponse, GetViewResponse, GetWorkflowConfigResponse, GetWorkflowStateResponse, ListNotificationsResponse, ListViewsResponse, MetadataCacheRequest, MetadataCacheResponse, PinFeedItemResponse, RealtimeConnectRequest, RealtimeConnectResponse, RealtimeSubscribeRequest, RealtimeSubscribeResponse, RefreshTokenRequest, RegisterDeviceRequest, RegisterDeviceResponse, RegisterRequest, RemoveReactionResponse, SearchFeedResponse, StandardErrorCode, StarFeedItemResponse, SubscribeResponse, UnpinFeedItemResponse, UnstarFeedItemResponse, UnsubscribeResponse, UpdateFeedItemResponse, UpdateManyRequest, UpdateViewResponse, WellKnownCapabilities, WorkflowApproveRequest, WorkflowApproveResponse, WorkflowRejectRequest, WorkflowRejectResponse, WorkflowTransitionRequest, WorkflowTransitionResponse } from '@objectstack/spec/api';
4
4
  import { Logger } from '@objectstack/core';
5
+ import { RealtimeEventPayload } from '@objectstack/spec/contracts';
6
+
7
+ /**
8
+ * Realtime API Module for ObjectStackClient
9
+ *
10
+ * Provides real-time event subscription capabilities using long-polling.
11
+ * For production WebSocket/SSE support, extend with transport adapters.
12
+ */
13
+
14
+ interface RealtimeSubscriptionFilter {
15
+ /** Metadata/object type filter */
16
+ type?: string;
17
+ /** Package ID filter */
18
+ packageId?: string;
19
+ /** Event types to listen for */
20
+ eventTypes?: string[];
21
+ /** Record ID filter (for data events) */
22
+ recordId?: string;
23
+ }
24
+ type RealtimeEventHandler = (event: RealtimeEventPayload) => void;
25
+ /**
26
+ * Realtime API for subscribing to server events
27
+ *
28
+ * Note: Currently uses in-memory adapter. WebSocket/SSE transport planned for future.
29
+ */
30
+ declare class RealtimeAPI {
31
+ private _baseUrl;
32
+ private _token?;
33
+ private subscriptions;
34
+ private pollInterval?;
35
+ private eventBuffer;
36
+ constructor(baseUrl: string, token?: string);
37
+ /**
38
+ * Subscribe to metadata events
39
+ * Returns an unsubscribe function
40
+ */
41
+ subscribeMetadata(type: string, callback: (event: MetadataEvent) => void, options?: {
42
+ packageId?: string;
43
+ }): () => void;
44
+ /**
45
+ * Subscribe to data record events
46
+ * Returns an unsubscribe function
47
+ */
48
+ subscribeData(object: string, callback: (event: DataEvent) => void, options?: {
49
+ recordId?: string;
50
+ }): () => void;
51
+ /**
52
+ * Emit an event to all matching subscriptions (client-side only)
53
+ * This is used for in-process event delivery
54
+ */
55
+ private emitEvent;
56
+ /**
57
+ * Start polling for events (fallback mechanism)
58
+ * In production, this would be replaced with WebSocket/SSE
59
+ */
60
+ private startPolling;
61
+ /**
62
+ * Stop polling for events
63
+ */
64
+ private stopPolling;
65
+ /**
66
+ * Internal method to buffer events from server
67
+ * This would be called by WebSocket/SSE handlers in production
68
+ */
69
+ _bufferEvent(event: RealtimeEventPayload): void;
70
+ /**
71
+ * Disconnect and clean up all subscriptions
72
+ */
73
+ disconnect(): void;
74
+ }
5
75
 
6
76
  /**
7
77
  * Type-Safe Query Builder
@@ -299,6 +369,7 @@ declare class ObjectStackClient {
299
369
  private fetchImpl;
300
370
  private discoveryInfo?;
301
371
  private logger;
372
+ private realtimeAPI;
302
373
  constructor(config: ClientConfig);
303
374
  /**
304
375
  * Initialize the client by discovering server capabilities.
@@ -332,7 +403,8 @@ declare class ObjectStackClient {
332
403
  } | undefined;
333
404
  services?: Record<string, {
334
405
  enabled: boolean;
335
- status: "degraded" | "stub" | "available" | "unavailable";
406
+ status: "degraded" | "stub" | "available" | "registered" | "unavailable";
407
+ handlerReady?: boolean | undefined;
336
408
  route?: string | undefined;
337
409
  provider?: string | undefined;
338
410
  version?: string | undefined;
@@ -388,8 +460,11 @@ declare class ObjectStackClient {
388
460
  * Get a specific metadata item by type and name
389
461
  * @param type - Metadata type (e.g., 'object', 'plugin')
390
462
  * @param name - Item name (snake_case identifier)
463
+ * @param options - Optional filters (e.g., packageId to scope by package)
391
464
  */
392
- getItem: (type: string, name: string) => Promise<unknown>;
465
+ getItem: (type: string, name: string, options?: {
466
+ packageId?: string;
467
+ }) => Promise<unknown>;
393
468
  /**
394
469
  * Save a metadata item
395
470
  * @param type - Metadata type (e.g., 'object', 'plugin')
@@ -397,6 +472,16 @@ declare class ObjectStackClient {
397
472
  * @param item - The metadata content to save
398
473
  */
399
474
  saveItem: (type: string, name: string, item: any) => Promise<unknown>;
475
+ /**
476
+ * Delete a metadata item
477
+ * @param type - Metadata type (e.g., 'object', 'plugin')
478
+ * @param name - Item name (snake_case identifier)
479
+ */
480
+ deleteItem: (type: string, name: string) => Promise<{
481
+ type: string;
482
+ name: string;
483
+ deleted: boolean;
484
+ }>;
400
485
  /**
401
486
  * Get object metadata with cache support
402
487
  * Supports ETag-based conditional requests for efficient caching
@@ -600,6 +685,11 @@ declare class ObjectStackClient {
600
685
  get: (flowName: string, runId: string) => Promise<any>;
601
686
  };
602
687
  };
688
+ /**
689
+ * Event Subscription API
690
+ * Provides real-time event subscriptions for metadata and data changes
691
+ */
692
+ get events(): RealtimeAPI;
603
693
  /**
604
694
  * Permissions Services
605
695
  */
@@ -742,10 +832,6 @@ declare class ObjectStackClient {
742
832
  * Natural language query — converts natural language to structured query
743
833
  */
744
834
  nlq: (request: AiNlqRequest) => Promise<AiNlqResponse>;
745
- /**
746
- * Multi-turn AI chat
747
- */
748
- chat: (request: AiChatRequest) => Promise<AiChatResponse>;
749
835
  /**
750
836
  * AI-powered field value suggestions
751
837
  */
@@ -928,4 +1014,4 @@ declare class ObjectStackClient {
928
1014
  private getRoute;
929
1015
  }
930
1016
 
931
- export { type ApiRouteType, type ClientConfig, type CreateDataResult, type DeleteDataResult, type DiscoveryResult, FilterBuilder, type GetDataResult, ObjectStackClient, type PaginatedResult, QueryBuilder, type QueryOptions, type QueryOptionsV2, type StandardError, type UpdateDataResult, createFilter, createQuery };
1017
+ export { type ApiRouteType, type ClientConfig, type CreateDataResult, type DeleteDataResult, type DiscoveryResult, FilterBuilder, type GetDataResult, ObjectStackClient, type PaginatedResult, QueryBuilder, type QueryOptions, type QueryOptionsV2, RealtimeAPI, type RealtimeEventHandler, type RealtimeSubscriptionFilter, type StandardError, type UpdateDataResult, createFilter, createQuery };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,77 @@
1
1
  import { FilterCondition, QueryAST, SortNode, AggregationNode } from '@objectstack/spec/data';
2
- import { ApiRoutes, GetDiscoveryResponse, WellKnownCapabilities, GetMetaTypesResponse, GetMetaItemsResponse, MetadataCacheRequest, MetadataCacheResponse, LoginRequest, SessionResponse, RegisterRequest, FileUploadResponse, GetPresignedUrlRequest, PresignedUrlResponse, InitiateChunkedUploadRequest, InitiateChunkedUploadResponse, UploadChunkResponse, CompleteChunkedUploadRequest, CompleteChunkedUploadResponse, CheckPermissionRequest, CheckPermissionResponse, GetObjectPermissionsResponse, GetEffectivePermissionsResponse, RealtimeConnectRequest, RealtimeConnectResponse, RealtimeSubscribeRequest, RealtimeSubscribeResponse, SetPresenceRequest, GetPresenceResponse, GetWorkflowConfigResponse, GetWorkflowStateResponse, WorkflowTransitionRequest, WorkflowTransitionResponse, WorkflowApproveRequest, WorkflowApproveResponse, WorkflowRejectRequest, WorkflowRejectResponse, ListViewsResponse, GetViewResponse, CreateViewRequest, CreateViewResponse, UpdateViewRequest, UpdateViewResponse, DeleteViewResponse, RegisterDeviceRequest, RegisterDeviceResponse, UnregisterDeviceResponse, GetNotificationPreferencesResponse, UpdateNotificationPreferencesRequest, UpdateNotificationPreferencesResponse, ListNotificationsResponse, MarkNotificationsReadResponse, MarkAllNotificationsReadResponse, AiNlqRequest, AiNlqResponse, AiChatRequest, AiChatResponse, AiSuggestRequest, AiSuggestResponse, AiInsightsRequest, AiInsightsResponse, GetLocalesResponse, GetTranslationsResponse, GetFieldLabelsResponse, GetFeedResponse, CreateFeedItemResponse, UpdateFeedItemResponse, DeleteFeedItemResponse, AddReactionResponse, RemoveReactionResponse, PinFeedItemResponse, UnpinFeedItemResponse, StarFeedItemResponse, UnstarFeedItemResponse, SearchFeedResponse, GetChangelogResponse, SubscribeResponse, UnsubscribeResponse, BatchUpdateRequest, BatchUpdateResponse, BatchOptions, StandardErrorCode, ErrorCategory } from '@objectstack/spec/api';
3
- export { AddReactionResponse, AiChatRequest, AiChatResponse, AiInsightsRequest, AiInsightsResponse, AiNlqRequest, AiNlqResponse, AiSuggestRequest, AiSuggestResponse, BatchOperationResult, BatchOptions, BatchRecord, BatchUpdateRequest, BatchUpdateResponse, CheckPermissionRequest, CheckPermissionResponse, CreateFeedItemResponse, CreateViewResponse, DeleteFeedItemResponse, DeleteManyRequest, DeleteViewResponse, ErrorCategory, GetChangelogResponse, GetDiscoveryResponse, GetEffectivePermissionsResponse, GetFeedResponse, GetFieldLabelsResponse, GetLocalesResponse, GetMetaItemsResponse, GetMetaTypesResponse, GetObjectPermissionsResponse, GetPresenceResponse, GetTranslationsResponse, GetViewResponse, GetWorkflowConfigResponse, GetWorkflowStateResponse, ListNotificationsResponse, ListViewsResponse, MetadataCacheRequest, MetadataCacheResponse, PinFeedItemResponse, RealtimeConnectRequest, RealtimeConnectResponse, RealtimeSubscribeRequest, RealtimeSubscribeResponse, RefreshTokenRequest, RegisterDeviceRequest, RegisterDeviceResponse, RegisterRequest, RemoveReactionResponse, SearchFeedResponse, StandardErrorCode, StarFeedItemResponse, SubscribeResponse, UnpinFeedItemResponse, UnstarFeedItemResponse, UnsubscribeResponse, UpdateFeedItemResponse, UpdateManyRequest, UpdateViewResponse, WellKnownCapabilities, WorkflowApproveRequest, WorkflowApproveResponse, WorkflowRejectRequest, WorkflowRejectResponse, WorkflowTransitionRequest, WorkflowTransitionResponse } from '@objectstack/spec/api';
2
+ import { MetadataEvent, DataEvent, ApiRoutes, GetDiscoveryResponse, WellKnownCapabilities, GetMetaTypesResponse, GetMetaItemsResponse, MetadataCacheRequest, MetadataCacheResponse, LoginRequest, SessionResponse, RegisterRequest, FileUploadResponse, GetPresignedUrlRequest, PresignedUrlResponse, InitiateChunkedUploadRequest, InitiateChunkedUploadResponse, UploadChunkResponse, CompleteChunkedUploadRequest, CompleteChunkedUploadResponse, CheckPermissionRequest, CheckPermissionResponse, GetObjectPermissionsResponse, GetEffectivePermissionsResponse, RealtimeConnectRequest, RealtimeConnectResponse, RealtimeSubscribeRequest, RealtimeSubscribeResponse, SetPresenceRequest, GetPresenceResponse, GetWorkflowConfigResponse, GetWorkflowStateResponse, WorkflowTransitionRequest, WorkflowTransitionResponse, WorkflowApproveRequest, WorkflowApproveResponse, WorkflowRejectRequest, WorkflowRejectResponse, ListViewsResponse, GetViewResponse, CreateViewRequest, CreateViewResponse, UpdateViewRequest, UpdateViewResponse, DeleteViewResponse, RegisterDeviceRequest, RegisterDeviceResponse, UnregisterDeviceResponse, GetNotificationPreferencesResponse, UpdateNotificationPreferencesRequest, UpdateNotificationPreferencesResponse, ListNotificationsResponse, MarkNotificationsReadResponse, MarkAllNotificationsReadResponse, AiNlqRequest, AiNlqResponse, AiSuggestRequest, AiSuggestResponse, AiInsightsRequest, AiInsightsResponse, GetLocalesResponse, GetTranslationsResponse, GetFieldLabelsResponse, GetFeedResponse, CreateFeedItemResponse, UpdateFeedItemResponse, DeleteFeedItemResponse, AddReactionResponse, RemoveReactionResponse, PinFeedItemResponse, UnpinFeedItemResponse, StarFeedItemResponse, UnstarFeedItemResponse, SearchFeedResponse, GetChangelogResponse, SubscribeResponse, UnsubscribeResponse, BatchUpdateRequest, BatchUpdateResponse, BatchOptions, StandardErrorCode, ErrorCategory } from '@objectstack/spec/api';
3
+ export { AddReactionResponse, AiInsightsRequest, AiInsightsResponse, AiNlqRequest, AiNlqResponse, AiSuggestRequest, AiSuggestResponse, BatchOperationResult, BatchOptions, BatchRecord, BatchUpdateRequest, BatchUpdateResponse, CheckPermissionRequest, CheckPermissionResponse, CreateFeedItemResponse, CreateViewResponse, DeleteFeedItemResponse, DeleteManyRequest, DeleteViewResponse, ErrorCategory, GetChangelogResponse, GetDiscoveryResponse, GetEffectivePermissionsResponse, GetFeedResponse, GetFieldLabelsResponse, GetLocalesResponse, GetMetaItemsResponse, GetMetaTypesResponse, GetObjectPermissionsResponse, GetPresenceResponse, GetTranslationsResponse, GetViewResponse, GetWorkflowConfigResponse, GetWorkflowStateResponse, ListNotificationsResponse, ListViewsResponse, MetadataCacheRequest, MetadataCacheResponse, PinFeedItemResponse, RealtimeConnectRequest, RealtimeConnectResponse, RealtimeSubscribeRequest, RealtimeSubscribeResponse, RefreshTokenRequest, RegisterDeviceRequest, RegisterDeviceResponse, RegisterRequest, RemoveReactionResponse, SearchFeedResponse, StandardErrorCode, StarFeedItemResponse, SubscribeResponse, UnpinFeedItemResponse, UnstarFeedItemResponse, UnsubscribeResponse, UpdateFeedItemResponse, UpdateManyRequest, UpdateViewResponse, WellKnownCapabilities, WorkflowApproveRequest, WorkflowApproveResponse, WorkflowRejectRequest, WorkflowRejectResponse, WorkflowTransitionRequest, WorkflowTransitionResponse } from '@objectstack/spec/api';
4
4
  import { Logger } from '@objectstack/core';
5
+ import { RealtimeEventPayload } from '@objectstack/spec/contracts';
6
+
7
+ /**
8
+ * Realtime API Module for ObjectStackClient
9
+ *
10
+ * Provides real-time event subscription capabilities using long-polling.
11
+ * For production WebSocket/SSE support, extend with transport adapters.
12
+ */
13
+
14
+ interface RealtimeSubscriptionFilter {
15
+ /** Metadata/object type filter */
16
+ type?: string;
17
+ /** Package ID filter */
18
+ packageId?: string;
19
+ /** Event types to listen for */
20
+ eventTypes?: string[];
21
+ /** Record ID filter (for data events) */
22
+ recordId?: string;
23
+ }
24
+ type RealtimeEventHandler = (event: RealtimeEventPayload) => void;
25
+ /**
26
+ * Realtime API for subscribing to server events
27
+ *
28
+ * Note: Currently uses in-memory adapter. WebSocket/SSE transport planned for future.
29
+ */
30
+ declare class RealtimeAPI {
31
+ private _baseUrl;
32
+ private _token?;
33
+ private subscriptions;
34
+ private pollInterval?;
35
+ private eventBuffer;
36
+ constructor(baseUrl: string, token?: string);
37
+ /**
38
+ * Subscribe to metadata events
39
+ * Returns an unsubscribe function
40
+ */
41
+ subscribeMetadata(type: string, callback: (event: MetadataEvent) => void, options?: {
42
+ packageId?: string;
43
+ }): () => void;
44
+ /**
45
+ * Subscribe to data record events
46
+ * Returns an unsubscribe function
47
+ */
48
+ subscribeData(object: string, callback: (event: DataEvent) => void, options?: {
49
+ recordId?: string;
50
+ }): () => void;
51
+ /**
52
+ * Emit an event to all matching subscriptions (client-side only)
53
+ * This is used for in-process event delivery
54
+ */
55
+ private emitEvent;
56
+ /**
57
+ * Start polling for events (fallback mechanism)
58
+ * In production, this would be replaced with WebSocket/SSE
59
+ */
60
+ private startPolling;
61
+ /**
62
+ * Stop polling for events
63
+ */
64
+ private stopPolling;
65
+ /**
66
+ * Internal method to buffer events from server
67
+ * This would be called by WebSocket/SSE handlers in production
68
+ */
69
+ _bufferEvent(event: RealtimeEventPayload): void;
70
+ /**
71
+ * Disconnect and clean up all subscriptions
72
+ */
73
+ disconnect(): void;
74
+ }
5
75
 
6
76
  /**
7
77
  * Type-Safe Query Builder
@@ -299,6 +369,7 @@ declare class ObjectStackClient {
299
369
  private fetchImpl;
300
370
  private discoveryInfo?;
301
371
  private logger;
372
+ private realtimeAPI;
302
373
  constructor(config: ClientConfig);
303
374
  /**
304
375
  * Initialize the client by discovering server capabilities.
@@ -332,7 +403,8 @@ declare class ObjectStackClient {
332
403
  } | undefined;
333
404
  services?: Record<string, {
334
405
  enabled: boolean;
335
- status: "degraded" | "stub" | "available" | "unavailable";
406
+ status: "degraded" | "stub" | "available" | "registered" | "unavailable";
407
+ handlerReady?: boolean | undefined;
336
408
  route?: string | undefined;
337
409
  provider?: string | undefined;
338
410
  version?: string | undefined;
@@ -388,8 +460,11 @@ declare class ObjectStackClient {
388
460
  * Get a specific metadata item by type and name
389
461
  * @param type - Metadata type (e.g., 'object', 'plugin')
390
462
  * @param name - Item name (snake_case identifier)
463
+ * @param options - Optional filters (e.g., packageId to scope by package)
391
464
  */
392
- getItem: (type: string, name: string) => Promise<unknown>;
465
+ getItem: (type: string, name: string, options?: {
466
+ packageId?: string;
467
+ }) => Promise<unknown>;
393
468
  /**
394
469
  * Save a metadata item
395
470
  * @param type - Metadata type (e.g., 'object', 'plugin')
@@ -397,6 +472,16 @@ declare class ObjectStackClient {
397
472
  * @param item - The metadata content to save
398
473
  */
399
474
  saveItem: (type: string, name: string, item: any) => Promise<unknown>;
475
+ /**
476
+ * Delete a metadata item
477
+ * @param type - Metadata type (e.g., 'object', 'plugin')
478
+ * @param name - Item name (snake_case identifier)
479
+ */
480
+ deleteItem: (type: string, name: string) => Promise<{
481
+ type: string;
482
+ name: string;
483
+ deleted: boolean;
484
+ }>;
400
485
  /**
401
486
  * Get object metadata with cache support
402
487
  * Supports ETag-based conditional requests for efficient caching
@@ -600,6 +685,11 @@ declare class ObjectStackClient {
600
685
  get: (flowName: string, runId: string) => Promise<any>;
601
686
  };
602
687
  };
688
+ /**
689
+ * Event Subscription API
690
+ * Provides real-time event subscriptions for metadata and data changes
691
+ */
692
+ get events(): RealtimeAPI;
603
693
  /**
604
694
  * Permissions Services
605
695
  */
@@ -742,10 +832,6 @@ declare class ObjectStackClient {
742
832
  * Natural language query — converts natural language to structured query
743
833
  */
744
834
  nlq: (request: AiNlqRequest) => Promise<AiNlqResponse>;
745
- /**
746
- * Multi-turn AI chat
747
- */
748
- chat: (request: AiChatRequest) => Promise<AiChatResponse>;
749
835
  /**
750
836
  * AI-powered field value suggestions
751
837
  */
@@ -928,4 +1014,4 @@ declare class ObjectStackClient {
928
1014
  private getRoute;
929
1015
  }
930
1016
 
931
- export { type ApiRouteType, type ClientConfig, type CreateDataResult, type DeleteDataResult, type DiscoveryResult, FilterBuilder, type GetDataResult, ObjectStackClient, type PaginatedResult, QueryBuilder, type QueryOptions, type QueryOptionsV2, type StandardError, type UpdateDataResult, createFilter, createQuery };
1017
+ export { type ApiRouteType, type ClientConfig, type CreateDataResult, type DeleteDataResult, type DiscoveryResult, FilterBuilder, type GetDataResult, ObjectStackClient, type PaginatedResult, QueryBuilder, type QueryOptions, type QueryOptionsV2, RealtimeAPI, type RealtimeEventHandler, type RealtimeSubscriptionFilter, type StandardError, type UpdateDataResult, createFilter, createQuery };
package/dist/index.js CHANGED
@@ -23,6 +23,7 @@ __export(index_exports, {
23
23
  FilterBuilder: () => FilterBuilder,
24
24
  ObjectStackClient: () => ObjectStackClient,
25
25
  QueryBuilder: () => QueryBuilder,
26
+ RealtimeAPI: () => RealtimeAPI,
26
27
  createFilter: () => createFilter,
27
28
  createQuery: () => createQuery
28
29
  });
@@ -30,6 +31,135 @@ module.exports = __toCommonJS(index_exports);
30
31
  var import_data = require("@objectstack/spec/data");
31
32
  var import_core = require("@objectstack/core");
32
33
 
34
+ // src/realtime-api.ts
35
+ var RealtimeAPI = class {
36
+ constructor(baseUrl, token) {
37
+ this.subscriptions = /* @__PURE__ */ new Map();
38
+ this.eventBuffer = [];
39
+ this._baseUrl = baseUrl;
40
+ this._token = token;
41
+ }
42
+ /**
43
+ * Subscribe to metadata events
44
+ * Returns an unsubscribe function
45
+ */
46
+ subscribeMetadata(type, callback, options) {
47
+ const subscriptionId = `metadata-${type}-${Date.now()}`;
48
+ this.subscriptions.set(subscriptionId, {
49
+ filter: {
50
+ type,
51
+ packageId: options?.packageId,
52
+ eventTypes: [
53
+ `metadata.${type}.created`,
54
+ `metadata.${type}.updated`,
55
+ `metadata.${type}.deleted`
56
+ ]
57
+ },
58
+ handler: (event) => {
59
+ if (event.type.startsWith("metadata.")) {
60
+ callback(event);
61
+ }
62
+ }
63
+ });
64
+ this.startPolling();
65
+ return () => {
66
+ this.subscriptions.delete(subscriptionId);
67
+ if (this.subscriptions.size === 0) {
68
+ this.stopPolling();
69
+ }
70
+ };
71
+ }
72
+ /**
73
+ * Subscribe to data record events
74
+ * Returns an unsubscribe function
75
+ */
76
+ subscribeData(object, callback, options) {
77
+ const subscriptionId = `data-${object}-${Date.now()}`;
78
+ this.subscriptions.set(subscriptionId, {
79
+ filter: {
80
+ type: object,
81
+ recordId: options?.recordId,
82
+ eventTypes: [
83
+ "data.record.created",
84
+ "data.record.updated",
85
+ "data.record.deleted"
86
+ ]
87
+ },
88
+ handler: (event) => {
89
+ if (event.type.startsWith("data.") && event.object === object) {
90
+ if (!options?.recordId || event.payload?.recordId === options.recordId) {
91
+ callback(event);
92
+ }
93
+ }
94
+ }
95
+ });
96
+ this.startPolling();
97
+ return () => {
98
+ this.subscriptions.delete(subscriptionId);
99
+ if (this.subscriptions.size === 0) {
100
+ this.stopPolling();
101
+ }
102
+ };
103
+ }
104
+ /**
105
+ * Emit an event to all matching subscriptions (client-side only)
106
+ * This is used for in-process event delivery
107
+ */
108
+ emitEvent(event) {
109
+ for (const sub of this.subscriptions.values()) {
110
+ const matchesType = !sub.filter.type || event.type.includes(sub.filter.type) || event.object === sub.filter.type;
111
+ const matchesEventType = !sub.filter.eventTypes?.length || sub.filter.eventTypes.includes(event.type);
112
+ const matchesPackage = !sub.filter.packageId || event.payload?.packageId === sub.filter.packageId;
113
+ if (matchesType && matchesEventType && matchesPackage) {
114
+ try {
115
+ sub.handler(event);
116
+ } catch (error) {
117
+ console.error("Error in realtime event handler:", error);
118
+ }
119
+ }
120
+ }
121
+ }
122
+ /**
123
+ * Start polling for events (fallback mechanism)
124
+ * In production, this would be replaced with WebSocket/SSE
125
+ */
126
+ startPolling() {
127
+ if (this.pollInterval) return;
128
+ this.pollInterval = setInterval(() => {
129
+ while (this.eventBuffer.length > 0) {
130
+ const event = this.eventBuffer.shift();
131
+ if (event) {
132
+ this.emitEvent(event);
133
+ }
134
+ }
135
+ }, 2e3);
136
+ }
137
+ /**
138
+ * Stop polling for events
139
+ */
140
+ stopPolling() {
141
+ if (this.pollInterval) {
142
+ clearInterval(this.pollInterval);
143
+ this.pollInterval = void 0;
144
+ }
145
+ }
146
+ /**
147
+ * Internal method to buffer events from server
148
+ * This would be called by WebSocket/SSE handlers in production
149
+ */
150
+ _bufferEvent(event) {
151
+ this.eventBuffer.push(event);
152
+ }
153
+ /**
154
+ * Disconnect and clean up all subscriptions
155
+ */
156
+ disconnect() {
157
+ this.stopPolling();
158
+ this.subscriptions.clear();
159
+ this.eventBuffer = [];
160
+ }
161
+ };
162
+
33
163
  // src/query-builder.ts
34
164
  var FilterBuilder = class {
35
165
  constructor() {
@@ -338,10 +468,15 @@ var ObjectStackClient = class {
338
468
  * Get a specific metadata item by type and name
339
469
  * @param type - Metadata type (e.g., 'object', 'plugin')
340
470
  * @param name - Item name (snake_case identifier)
471
+ * @param options - Optional filters (e.g., packageId to scope by package)
341
472
  */
342
- getItem: async (type, name) => {
473
+ getItem: async (type, name, options) => {
343
474
  const route = this.getRoute("metadata");
344
- const res = await this.fetch(`${this.baseUrl}${route}/${type}/${name}`);
475
+ const params = new URLSearchParams();
476
+ if (options?.packageId) params.set("package", options.packageId);
477
+ const qs = params.toString();
478
+ const url = `${this.baseUrl}${route}/${type}/${name}${qs ? `?${qs}` : ""}`;
479
+ const res = await this.fetch(url);
345
480
  return this.unwrapResponse(res);
346
481
  },
347
482
  /**
@@ -358,6 +493,18 @@ var ObjectStackClient = class {
358
493
  });
359
494
  return this.unwrapResponse(res);
360
495
  },
496
+ /**
497
+ * Delete a metadata item
498
+ * @param type - Metadata type (e.g., 'object', 'plugin')
499
+ * @param name - Item name (snake_case identifier)
500
+ */
501
+ deleteItem: async (type, name) => {
502
+ const route = this.getRoute("metadata");
503
+ const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(type)}/${encodeURIComponent(name)}`, {
504
+ method: "DELETE"
505
+ });
506
+ return this.unwrapResponse(res);
507
+ },
361
508
  /**
362
509
  * Get object metadata with cache support
363
510
  * Supports ETag-based conditional requests for efficient caching
@@ -1101,17 +1248,7 @@ var ObjectStackClient = class {
1101
1248
  });
1102
1249
  return this.unwrapResponse(res);
1103
1250
  },
1104
- /**
1105
- * Multi-turn AI chat
1106
- */
1107
- chat: async (request) => {
1108
- const route = this.getRoute("ai");
1109
- const res = await this.fetch(`${this.baseUrl}${route}/chat`, {
1110
- method: "POST",
1111
- body: JSON.stringify(request)
1112
- });
1113
- return this.unwrapResponse(res);
1114
- },
1251
+ // AI chat method removed — use Vercel AI SDK `useChat()` / `@ai-sdk/react` directly.
1115
1252
  /**
1116
1253
  * AI-powered field value suggestions
1117
1254
  */
@@ -1493,6 +1630,7 @@ var ObjectStackClient = class {
1493
1630
  level: config.debug ? "debug" : "info",
1494
1631
  format: "pretty"
1495
1632
  });
1633
+ this.realtimeAPI = new RealtimeAPI(this.baseUrl, this.token);
1496
1634
  this.logger.debug("ObjectStack client created", { baseUrl: this.baseUrl });
1497
1635
  }
1498
1636
  /**
@@ -1563,6 +1701,13 @@ var ObjectStackClient = class {
1563
1701
  }
1564
1702
  return result;
1565
1703
  }
1704
+ /**
1705
+ * Event Subscription API
1706
+ * Provides real-time event subscriptions for metadata and data changes
1707
+ */
1708
+ get events() {
1709
+ return this.realtimeAPI;
1710
+ }
1566
1711
  /**
1567
1712
  * Private Helpers
1568
1713
  */
@@ -1667,6 +1812,7 @@ var ObjectStackClient = class {
1667
1812
  FilterBuilder,
1668
1813
  ObjectStackClient,
1669
1814
  QueryBuilder,
1815
+ RealtimeAPI,
1670
1816
  createFilter,
1671
1817
  createQuery
1672
1818
  });