Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 17 additions & 13 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -304,11 +304,13 @@ business/custom objects, aligning with industry best practices (e.g., ServiceNow
|:---|:---:|:---|:---|
| `II18nService` | **P1** | `@objectstack/service-i18n` | Map-backed translation with locale resolution |
| `IRealtimeService` | **P1** | `@objectstack/service-realtime` | WebSocket/SSE push (replaces Studio setTimeout hack) |
| `IFeedService` | **P1** | `@objectstack/service-feed` | ✅ Feed/Chatter with comments, reactions, subscriptions |
| `ISearchService` | **P1** | `@objectstack/service-search` | In-memory search first, then Meilisearch driver |
| `INotificationService` | **P2** | `@objectstack/service-notification` | Email adapter (console logger in dev mode) |

- [x] `service-i18n` — Implement `II18nService` with file-based locale loading
- [x] `service-realtime` — Implement `IRealtimeService` with WebSocket + in-memory pub/sub
- [x] `service-feed` — Implement `IFeedService` with in-memory adapter (Feed CRUD, Reactions, Subscriptions, Threading)
- [ ] `service-search` — Implement `ISearchService` with in-memory search + Meilisearch adapter
- [ ] `service-notification` — Implement `INotificationService` with email adapter

Expand Down Expand Up @@ -571,19 +573,20 @@ Final polish and advanced features.
| 12 | Job Service | `IJobService` | ✅ | `@objectstack/service-job` | Interval + cron skeleton |
| 13 | Storage Service | `IStorageService` | ✅ | `@objectstack/service-storage` | Local FS + S3 skeleton |
| 14 | Realtime Service | `IRealtimeService` | ✅ | `@objectstack/service-realtime` | In-memory pub/sub |
| 15 | Search Service | `ISearchService` | ❌ | `@objectstack/service-search` (planned) | Spec only |
| 16 | Notification Service | `INotificationService` | ❌ | `@objectstack/service-notification` (planned) | Spec only |
| 17 | AI Service | `IAIService` | ❌ | `@objectstack/service-ai` (planned) | Spec only |
| 18 | Automation Service | `IAutomationService` | ✅ | `@objectstack/service-automation` | Plugin-based DAG engine (MVP) |
| 19 | Workflow Service | `IWorkflowService` | ❌ | `@objectstack/service-workflow` (planned) | Spec only |
| 20 | GraphQL Service | `IGraphQLService` | ❌ | `@objectstack/service-graphql` (planned) | Spec only |
| 21 | i18n Service | `II18nService` | ✅ | `@objectstack/service-i18n` | File-based locale loading |
| 22 | UI Service | `IUIService` | ⚠️ | — | **Deprecated** — merged into `IMetadataService` |
| 23 | Schema Driver | `ISchemaDriver` | ❌ | — | Spec only |
| 24 | Startup Orchestrator | `IStartupOrchestrator` | ❌ | — | Kernel handles basics |
| 25 | Plugin Validator | `IPluginValidator` | ❌ | — | Spec only |

**Summary:** 13 fully implemented · 2 partially implemented · 10 specification only
| 15 | Feed Service | `IFeedService` | ✅ | `@objectstack/service-feed` | In-memory feed/chatter (comments, reactions, subscriptions) |
| 16 | Search Service | `ISearchService` | ❌ | `@objectstack/service-search` (planned) | Spec only |
| 17 | Notification Service | `INotificationService` | ❌ | `@objectstack/service-notification` (planned) | Spec only |
| 18 | AI Service | `IAIService` | ❌ | `@objectstack/service-ai` (planned) | Spec only |
| 19 | Automation Service | `IAutomationService` | ✅ | `@objectstack/service-automation` | Plugin-based DAG engine (MVP) |
| 20 | Workflow Service | `IWorkflowService` | ❌ | `@objectstack/service-workflow` (planned) | Spec only |
| 21 | GraphQL Service | `IGraphQLService` | ❌ | `@objectstack/service-graphql` (planned) | Spec only |
| 22 | i18n Service | `II18nService` | ✅ | `@objectstack/service-i18n` | File-based locale loading |
| 23 | UI Service | `IUIService` | ⚠️ | — | **Deprecated** — merged into `IMetadataService` |
| 24 | Schema Driver | `ISchemaDriver` | ❌ | — | Spec only |
| 25 | Startup Orchestrator | `IStartupOrchestrator` | ❌ | — | Kernel handles basics |
| 26 | Plugin Validator | `IPluginValidator` | ❌ | — | Spec only |

**Summary:** 14 fully implemented · 2 partially implemented · 10 specification only

---

Expand Down Expand Up @@ -612,6 +615,7 @@ Final polish and advanced features.
| `@objectstack/service-storage` | 3.0.6 | 8 | ✅ Stable | 7/10 |
| `@objectstack/service-i18n` | 3.0.7 | 20 | ✅ Stable | 7/10 |
| `@objectstack/service-realtime` | 3.0.7 | 14 | ✅ Stable | 7/10 |
| `@objectstack/service-feed` | 3.0.7 | 40 | ✅ Stable | 7/10 |
| `@objectstack/nextjs` | 3.0.2 | ✅ | ✅ Stable | 10/10 |
| `@objectstack/nestjs` | 3.0.2 | ✅ | ✅ Stable | 10/10 |
| `@objectstack/hono` | 3.0.2 | ✅ | ✅ Stable | 10/10 |
Expand Down
29 changes: 29 additions & 0 deletions packages/services/service-feed/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"name": "@objectstack/service-feed",
"version": "3.0.7",
"license": "Apache-2.0",
"description": "Feed/Chatter Service for ObjectStack — implements IFeedService with in-memory adapter for comments, reactions, field changes, and record subscriptions",
"type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.mjs",
"require": "./dist/index.js"
}
},
"scripts": {
"build": "tsup --config ../../../tsup.config.ts",
"test": "vitest run"
},
"dependencies": {
"@objectstack/core": "workspace:*",
"@objectstack/spec": "workspace:*"
},
"devDependencies": {
"typescript": "^5.0.0",
"vitest": "^4.0.18",
"@types/node": "^25.2.3"
}
}
58 changes: 58 additions & 0 deletions packages/services/service-feed/src/feed-service-plugin.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.

import type { Plugin, PluginContext } from '@objectstack/core';
import { InMemoryFeedAdapter } from './in-memory-feed-adapter.js';
import type { InMemoryFeedAdapterOptions } from './in-memory-feed-adapter.js';

/**
* Configuration options for the FeedServicePlugin.
*/
export interface FeedServicePluginOptions {
/** Feed adapter type (default: 'memory') */
adapter?: 'memory';
/** Options for the in-memory adapter */
memory?: InMemoryFeedAdapterOptions;
}

/**
* FeedServicePlugin — Production IFeedService implementation.
*
* Registers a Feed/Chatter service with the kernel during the init phase.
* Currently supports in-memory storage for single-process environments.
*
* @example
* ```ts
* import { ObjectKernel } from '@objectstack/core';
* import { FeedServicePlugin } from '@objectstack/service-feed';
*
* const kernel = new ObjectKernel();
* kernel.use(new FeedServicePlugin());
* await kernel.bootstrap();
*
* const feed = kernel.getService('feed');
* const item = await feed.createFeedItem({
* object: 'account',
* recordId: 'rec_123',
* type: 'comment',
* actor: { type: 'user', id: 'user_1', name: 'Alice' },
* body: 'Great progress!',
* });
* ```
*/
export class FeedServicePlugin implements Plugin {
name = 'com.objectstack.service.feed';
version = '1.0.0';
type = 'standard';

private readonly options: FeedServicePluginOptions;

constructor(options: FeedServicePluginOptions = {}) {
this.options = { adapter: 'memory', ...options };
}

async init(ctx: PluginContext): Promise<void> {
const feed = new InMemoryFeedAdapter(this.options.memory);
ctx.registerService('feed', feed);
ctx.logger.info('FeedServicePlugin: registered in-memory feed adapter');
}
}
Loading