@critical-path/core 0.10.0 → 0.11.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.
- package/CHANGELOG.md +12 -0
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +6 -2
- package/dist/engine/index.js.map +1 -1
- package/dist/index.test.js +25 -0
- package/dist/index.test.js.map +1 -1
- package/dist/store/sqlite.d.ts.map +1 -1
- package/dist/store/sqlite.js +13 -4
- package/dist/store/sqlite.js.map +1 -1
- package/dist/store/sqlite.test.js +6 -1
- package/dist/store/sqlite.test.js.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/mentions.d.ts +24 -0
- package/dist/utils/mentions.d.ts.map +1 -0
- package/dist/utils/mentions.js +73 -0
- package/dist/utils/mentions.js.map +1 -0
- package/dist/utils/mentions.test.d.ts +2 -0
- package/dist/utils/mentions.test.d.ts.map +1 -0
- package/dist/utils/mentions.test.js +71 -0
- package/dist/utils/mentions.test.js.map +1 -0
- package/package.json +1 -1
- package/src/engine/index.ts +7 -2
- package/src/index.test.ts +30 -0
- package/src/store/sqlite.test.ts +6 -1
- package/src/store/sqlite.ts +13 -2
- package/src/types/index.ts +1 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/mentions.test.ts +82 -0
- package/src/utils/mentions.ts +89 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
|
package/dist/utils/index.js
CHANGED
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface MentionSegment {
|
|
2
|
+
type: 'text' | 'mention';
|
|
3
|
+
value: string;
|
|
4
|
+
handle?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Regex matching mentions:
|
|
8
|
+
* - Quoted mentions: @"Jane Doe"
|
|
9
|
+
* - Standard mentions: @jane_doe, @planner, @user-1, @john.smith
|
|
10
|
+
* Note: Does not match emails like foo@bar.com (requires word boundary or start of string before @).
|
|
11
|
+
*/
|
|
12
|
+
export declare const MENTION_REGEX: RegExp;
|
|
13
|
+
/**
|
|
14
|
+
* Extracts unique mention handles from a text string.
|
|
15
|
+
* Strips quotes and the leading '@' symbol.
|
|
16
|
+
* Preserves the order of their first appearance.
|
|
17
|
+
*/
|
|
18
|
+
export declare function extractMentions(content: string): string[];
|
|
19
|
+
/**
|
|
20
|
+
* Segments a text string into plain text parts and mention tokens.
|
|
21
|
+
* Useful for rendering highlighted mention badges or links in UI components.
|
|
22
|
+
*/
|
|
23
|
+
export declare function parseMentionSegments(content: string): MentionSegment[];
|
|
24
|
+
//# sourceMappingURL=mentions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mentions.d.ts","sourceRoot":"","sources":["../../src/utils/mentions.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,eAAO,MAAM,aAAa,QAA8C,CAAC;AAEzE;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAmBzD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,EAAE,CA4CtE"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regex matching mentions:
|
|
3
|
+
* - Quoted mentions: @"Jane Doe"
|
|
4
|
+
* - Standard mentions: @jane_doe, @planner, @user-1, @john.smith
|
|
5
|
+
* Note: Does not match emails like foo@bar.com (requires word boundary or start of string before @).
|
|
6
|
+
*/
|
|
7
|
+
export const MENTION_REGEX = /(?:^|\s)@(?:"([^"]+)"|([a-zA-Z0-9_.-]+))/g;
|
|
8
|
+
/**
|
|
9
|
+
* Extracts unique mention handles from a text string.
|
|
10
|
+
* Strips quotes and the leading '@' symbol.
|
|
11
|
+
* Preserves the order of their first appearance.
|
|
12
|
+
*/
|
|
13
|
+
export function extractMentions(content) {
|
|
14
|
+
if (!content || typeof content !== 'string')
|
|
15
|
+
return [];
|
|
16
|
+
const mentions = [];
|
|
17
|
+
const seen = new Set();
|
|
18
|
+
// Reset regex lastIndex
|
|
19
|
+
const regex = new RegExp(MENTION_REGEX.source, 'g');
|
|
20
|
+
let match;
|
|
21
|
+
while ((match = regex.exec(content)) !== null) {
|
|
22
|
+
const handle = match[1] ?? match[2];
|
|
23
|
+
if (handle && !seen.has(handle)) {
|
|
24
|
+
seen.add(handle);
|
|
25
|
+
mentions.push(handle);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return mentions;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Segments a text string into plain text parts and mention tokens.
|
|
32
|
+
* Useful for rendering highlighted mention badges or links in UI components.
|
|
33
|
+
*/
|
|
34
|
+
export function parseMentionSegments(content) {
|
|
35
|
+
if (!content)
|
|
36
|
+
return [];
|
|
37
|
+
const segments = [];
|
|
38
|
+
const regex = new RegExp(MENTION_REGEX.source, 'g');
|
|
39
|
+
let lastIndex = 0;
|
|
40
|
+
let match;
|
|
41
|
+
while ((match = regex.exec(content)) !== null) {
|
|
42
|
+
const fullMatch = match[0];
|
|
43
|
+
const leadingWhitespace = fullMatch.startsWith(' ') || fullMatch.startsWith('\t') || fullMatch.startsWith('\n')
|
|
44
|
+
? fullMatch[0]
|
|
45
|
+
: '';
|
|
46
|
+
const mentionToken = fullMatch.slice(leadingWhitespace.length);
|
|
47
|
+
const handle = match[1] ?? match[2];
|
|
48
|
+
const matchStart = match.index + leadingWhitespace.length;
|
|
49
|
+
// Push text before this mention if any
|
|
50
|
+
if (matchStart > lastIndex) {
|
|
51
|
+
segments.push({
|
|
52
|
+
type: 'text',
|
|
53
|
+
value: content.slice(lastIndex, matchStart)
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
// Push the mention token
|
|
57
|
+
segments.push({
|
|
58
|
+
type: 'mention',
|
|
59
|
+
value: mentionToken,
|
|
60
|
+
handle
|
|
61
|
+
});
|
|
62
|
+
lastIndex = match.index + fullMatch.length;
|
|
63
|
+
}
|
|
64
|
+
// Push any remaining text after the last match
|
|
65
|
+
if (lastIndex < content.length) {
|
|
66
|
+
segments.push({
|
|
67
|
+
type: 'text',
|
|
68
|
+
value: content.slice(lastIndex)
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return segments;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=mentions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mentions.js","sourceRoot":"","sources":["../../src/utils/mentions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mentions.test.d.ts","sourceRoot":"","sources":["../../src/utils/mentions.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { extractMentions, parseMentionSegments } from './mentions.js';
|
|
3
|
+
describe('mentions utility', () => {
|
|
4
|
+
describe('extractMentions', () => {
|
|
5
|
+
it('returns empty array for empty or non-string input', () => {
|
|
6
|
+
expect(extractMentions('')).toEqual([]);
|
|
7
|
+
expect(extractMentions(null)).toEqual([]);
|
|
8
|
+
expect(extractMentions(undefined)).toEqual([]);
|
|
9
|
+
});
|
|
10
|
+
it('extracts single mention', () => {
|
|
11
|
+
expect(extractMentions('Hello @planner, please review.')).toEqual(['planner']);
|
|
12
|
+
});
|
|
13
|
+
it('extracts multiple mentions and deduplicates them', () => {
|
|
14
|
+
const text = 'Hey @jane and @planner, can @jane check with @coordinator?';
|
|
15
|
+
expect(extractMentions(text)).toEqual(['jane', 'planner', 'coordinator']);
|
|
16
|
+
});
|
|
17
|
+
it('supports quoted handles with spaces', () => {
|
|
18
|
+
const text = 'Assigning to @"Agent Planner" and @"Jane Doe"';
|
|
19
|
+
expect(extractMentions(text)).toEqual(['Agent Planner', 'Jane Doe']);
|
|
20
|
+
});
|
|
21
|
+
it('ignores email addresses without leading space or boundary', () => {
|
|
22
|
+
const text = 'Send mail to user@example.com or ping @alex';
|
|
23
|
+
expect(extractMentions(text)).toEqual(['alex']);
|
|
24
|
+
});
|
|
25
|
+
it('handles mentions with dashes, underscores, and periods', () => {
|
|
26
|
+
const text = 'Call @agent-1, @super_user, and @john.doe';
|
|
27
|
+
expect(extractMentions(text)).toEqual(['agent-1', 'super_user', 'john.doe']);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
describe('parseMentionSegments', () => {
|
|
31
|
+
it('returns empty array for empty string', () => {
|
|
32
|
+
expect(parseMentionSegments('')).toEqual([]);
|
|
33
|
+
});
|
|
34
|
+
it('returns single text segment if no mentions', () => {
|
|
35
|
+
expect(parseMentionSegments('Just a normal comment without tags.')).toEqual([
|
|
36
|
+
{ type: 'text', value: 'Just a normal comment without tags.' }
|
|
37
|
+
]);
|
|
38
|
+
});
|
|
39
|
+
it('correctly segments text with single mention in the middle', () => {
|
|
40
|
+
const result = parseMentionSegments('Hello @planner, please check.');
|
|
41
|
+
expect(result).toEqual([
|
|
42
|
+
{ type: 'text', value: 'Hello ' },
|
|
43
|
+
{ type: 'mention', value: '@planner', handle: 'planner' },
|
|
44
|
+
{ type: 'text', value: ', please check.' }
|
|
45
|
+
]);
|
|
46
|
+
});
|
|
47
|
+
it('correctly segments text starting with a mention', () => {
|
|
48
|
+
const result = parseMentionSegments('@planner can you take a look?');
|
|
49
|
+
expect(result).toEqual([
|
|
50
|
+
{ type: 'mention', value: '@planner', handle: 'planner' },
|
|
51
|
+
{ type: 'text', value: ' can you take a look?' }
|
|
52
|
+
]);
|
|
53
|
+
});
|
|
54
|
+
it('correctly segments text ending with a mention', () => {
|
|
55
|
+
const result = parseMentionSegments('Assigned to @coordinator');
|
|
56
|
+
expect(result).toEqual([
|
|
57
|
+
{ type: 'text', value: 'Assigned to ' },
|
|
58
|
+
{ type: 'mention', value: '@coordinator', handle: 'coordinator' }
|
|
59
|
+
]);
|
|
60
|
+
});
|
|
61
|
+
it('correctly segments quoted mentions', () => {
|
|
62
|
+
const result = parseMentionSegments('Ping @"Agent Supervisor" ASAP');
|
|
63
|
+
expect(result).toEqual([
|
|
64
|
+
{ type: 'text', value: 'Ping ' },
|
|
65
|
+
{ type: 'mention', value: '@"Agent Supervisor"', handle: 'Agent Supervisor' },
|
|
66
|
+
{ type: 'text', value: ' ASAP' }
|
|
67
|
+
]);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=mentions.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mentions.test.js","sourceRoot":"","sources":["../../src/utils/mentions.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/engine/index.ts
CHANGED
|
@@ -28,6 +28,7 @@ import {
|
|
|
28
28
|
WorkflowValidationError,
|
|
29
29
|
DEFAULT_SOFTWARE_WORKFLOW
|
|
30
30
|
} from '../utils/workflow.js';
|
|
31
|
+
import { extractMentions } from '../utils/mentions.js';
|
|
31
32
|
import {
|
|
32
33
|
DomainEventBus,
|
|
33
34
|
TaskCreatedEvent,
|
|
@@ -624,7 +625,8 @@ export class CriticalPathEngine {
|
|
|
624
625
|
}
|
|
625
626
|
|
|
626
627
|
async addComment(comment: Omit<Comment, 'id' | 'createdAt' | 'updatedAt'>): Promise<Comment> {
|
|
627
|
-
const
|
|
628
|
+
const mentions = comment.mentions ?? extractMentions(comment.content);
|
|
629
|
+
const created = await this.store.addComment({ ...comment, mentions });
|
|
628
630
|
const now = new Date().toISOString();
|
|
629
631
|
|
|
630
632
|
const event: CommentAddedEvent = {
|
|
@@ -645,7 +647,10 @@ export class CriticalPathEngine {
|
|
|
645
647
|
const existing = await this.store.getComment(id);
|
|
646
648
|
if (!existing) return null;
|
|
647
649
|
|
|
648
|
-
const
|
|
650
|
+
const mentions = updates.mentions ?? (updates.content ? extractMentions(updates.content) : undefined);
|
|
651
|
+
const toUpdate = mentions !== undefined ? { ...updates, mentions } : updates;
|
|
652
|
+
|
|
653
|
+
const updated = await this.store.updateComment(id, toUpdate);
|
|
649
654
|
if (!updated) return null;
|
|
650
655
|
|
|
651
656
|
const now = new Date().toISOString();
|
package/src/index.test.ts
CHANGED
|
@@ -310,5 +310,35 @@ describe('CriticalPathEngine Core Tests', () => {
|
|
|
310
310
|
expect(afterRemoval?.reactions?.[0].emoji).toBe('🚀');
|
|
311
311
|
expect(receivedEvents).toContain('comment.reaction.removed');
|
|
312
312
|
});
|
|
313
|
+
|
|
314
|
+
it('supports mentions in comments with auto-extraction and explicit override', async () => {
|
|
315
|
+
const engine = new CriticalPathEngine();
|
|
316
|
+
const proj = await engine.createProject({ key: 'MNT', name: 'Mentions Project' });
|
|
317
|
+
const task = await engine.createTask({ projectId: proj.id, title: 'Mentions Task', status: 'todo' });
|
|
318
|
+
|
|
319
|
+
// Auto-extracted mentions
|
|
320
|
+
const comment1 = await engine.addComment({
|
|
321
|
+
taskId: task.id,
|
|
322
|
+
authorId: 'user_1',
|
|
323
|
+
content: 'Hey @planner and @user_2, please check with @"Supervisor Agent"!'
|
|
324
|
+
});
|
|
325
|
+
expect(comment1.mentions).toEqual(['planner', 'user_2', 'Supervisor Agent']);
|
|
326
|
+
|
|
327
|
+
// Explicit mentions passed
|
|
328
|
+
const comment2 = await engine.addComment({
|
|
329
|
+
taskId: task.id,
|
|
330
|
+
authorId: 'user_1',
|
|
331
|
+
content: 'Custom mention assignment',
|
|
332
|
+
mentions: ['custom_agent_id']
|
|
333
|
+
});
|
|
334
|
+
expect(comment2.mentions).toEqual(['custom_agent_id']);
|
|
335
|
+
|
|
336
|
+
// Update comment content updates mentions
|
|
337
|
+
const updated = await engine.updateComment(comment1.id, {
|
|
338
|
+
content: 'Now calling only @coordinator'
|
|
339
|
+
});
|
|
340
|
+
expect(updated?.mentions).toEqual(['coordinator']);
|
|
341
|
+
});
|
|
313
342
|
});
|
|
314
343
|
|
|
344
|
+
|
package/src/store/sqlite.test.ts
CHANGED
|
@@ -77,11 +77,16 @@ describe('SQLiteStore', () => {
|
|
|
77
77
|
const comments = await store.getComments('task_1');
|
|
78
78
|
expect(comments).toHaveLength(2);
|
|
79
79
|
|
|
80
|
-
const updatedComment = await store.updateComment(comment.id, {
|
|
80
|
+
const updatedComment = await store.updateComment(comment.id, {
|
|
81
|
+
content: 'Updated content',
|
|
82
|
+
mentions: ['planner', 'coordinator']
|
|
83
|
+
});
|
|
81
84
|
expect(updatedComment?.content).toBe('Updated content');
|
|
85
|
+
expect(updatedComment?.mentions).toEqual(['planner', 'coordinator']);
|
|
82
86
|
|
|
83
87
|
const fetchedComment = await store.getComment(comment.id);
|
|
84
88
|
expect(fetchedComment?.content).toBe('Updated content');
|
|
89
|
+
expect(fetchedComment?.mentions).toEqual(['planner', 'coordinator']);
|
|
85
90
|
|
|
86
91
|
const timeEntry = await store.logTime({
|
|
87
92
|
taskId: 'task_1',
|
package/src/store/sqlite.ts
CHANGED
|
@@ -154,6 +154,7 @@ export class SQLiteStore implements StorageAdapter {
|
|
|
154
154
|
authorType TEXT,
|
|
155
155
|
parentId TEXT,
|
|
156
156
|
content TEXT NOT NULL,
|
|
157
|
+
mentions TEXT,
|
|
157
158
|
reactions TEXT,
|
|
158
159
|
metadata TEXT,
|
|
159
160
|
createdAt TEXT NOT NULL,
|
|
@@ -219,6 +220,12 @@ export class SQLiteStore implements StorageAdapter {
|
|
|
219
220
|
} catch {
|
|
220
221
|
// Column may already exist
|
|
221
222
|
}
|
|
223
|
+
|
|
224
|
+
try {
|
|
225
|
+
this.db.exec('ALTER TABLE comments ADD COLUMN mentions TEXT');
|
|
226
|
+
} catch {
|
|
227
|
+
// Column may already exist
|
|
228
|
+
}
|
|
222
229
|
}
|
|
223
230
|
|
|
224
231
|
// --- Projects ---
|
|
@@ -697,6 +704,7 @@ export class SQLiteStore implements StorageAdapter {
|
|
|
697
704
|
authorType: row.authorType,
|
|
698
705
|
parentId: row.parentId || undefined,
|
|
699
706
|
content: row.content,
|
|
707
|
+
mentions: row.mentions ? JSON.parse(row.mentions) : undefined,
|
|
700
708
|
reactions: row.reactions ? JSON.parse(row.reactions) : undefined,
|
|
701
709
|
metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
|
|
702
710
|
createdAt: row.createdAt,
|
|
@@ -723,8 +731,8 @@ export class SQLiteStore implements StorageAdapter {
|
|
|
723
731
|
const newComment: Comment = { ...comment, id, createdAt: now, updatedAt: now };
|
|
724
732
|
|
|
725
733
|
const stmt = this.db.prepare(`
|
|
726
|
-
INSERT INTO comments (id, taskId, authorId, authorType, parentId, content, reactions, metadata, createdAt, updatedAt)
|
|
727
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
734
|
+
INSERT INTO comments (id, taskId, authorId, authorType, parentId, content, mentions, reactions, metadata, createdAt, updatedAt)
|
|
735
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
728
736
|
`);
|
|
729
737
|
stmt.run(
|
|
730
738
|
newComment.id,
|
|
@@ -733,6 +741,7 @@ export class SQLiteStore implements StorageAdapter {
|
|
|
733
741
|
newComment.authorType || 'user',
|
|
734
742
|
newComment.parentId || null,
|
|
735
743
|
newComment.content,
|
|
744
|
+
newComment.mentions ? JSON.stringify(newComment.mentions) : null,
|
|
736
745
|
newComment.reactions ? JSON.stringify(newComment.reactions) : null,
|
|
737
746
|
newComment.metadata ? JSON.stringify(newComment.metadata) : null,
|
|
738
747
|
newComment.createdAt,
|
|
@@ -757,6 +766,7 @@ export class SQLiteStore implements StorageAdapter {
|
|
|
757
766
|
authorType = ?,
|
|
758
767
|
parentId = ?,
|
|
759
768
|
content = ?,
|
|
769
|
+
mentions = ?,
|
|
760
770
|
reactions = ?,
|
|
761
771
|
metadata = ?,
|
|
762
772
|
updatedAt = ?
|
|
@@ -767,6 +777,7 @@ export class SQLiteStore implements StorageAdapter {
|
|
|
767
777
|
updated.authorType || 'user',
|
|
768
778
|
updated.parentId || null,
|
|
769
779
|
updated.content,
|
|
780
|
+
updated.mentions ? JSON.stringify(updated.mentions) : null,
|
|
770
781
|
updated.reactions ? JSON.stringify(updated.reactions) : null,
|
|
771
782
|
updated.metadata ? JSON.stringify(updated.metadata) : null,
|
|
772
783
|
updated.updatedAt,
|
package/src/types/index.ts
CHANGED
package/src/utils/index.ts
CHANGED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { extractMentions, parseMentionSegments } from './mentions.js';
|
|
3
|
+
|
|
4
|
+
describe('mentions utility', () => {
|
|
5
|
+
describe('extractMentions', () => {
|
|
6
|
+
it('returns empty array for empty or non-string input', () => {
|
|
7
|
+
expect(extractMentions('')).toEqual([]);
|
|
8
|
+
expect(extractMentions(null as any)).toEqual([]);
|
|
9
|
+
expect(extractMentions(undefined as any)).toEqual([]);
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it('extracts single mention', () => {
|
|
13
|
+
expect(extractMentions('Hello @planner, please review.')).toEqual(['planner']);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('extracts multiple mentions and deduplicates them', () => {
|
|
17
|
+
const text = 'Hey @jane and @planner, can @jane check with @coordinator?';
|
|
18
|
+
expect(extractMentions(text)).toEqual(['jane', 'planner', 'coordinator']);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('supports quoted handles with spaces', () => {
|
|
22
|
+
const text = 'Assigning to @"Agent Planner" and @"Jane Doe"';
|
|
23
|
+
expect(extractMentions(text)).toEqual(['Agent Planner', 'Jane Doe']);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('ignores email addresses without leading space or boundary', () => {
|
|
27
|
+
const text = 'Send mail to user@example.com or ping @alex';
|
|
28
|
+
expect(extractMentions(text)).toEqual(['alex']);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('handles mentions with dashes, underscores, and periods', () => {
|
|
32
|
+
const text = 'Call @agent-1, @super_user, and @john.doe';
|
|
33
|
+
expect(extractMentions(text)).toEqual(['agent-1', 'super_user', 'john.doe']);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
describe('parseMentionSegments', () => {
|
|
38
|
+
it('returns empty array for empty string', () => {
|
|
39
|
+
expect(parseMentionSegments('')).toEqual([]);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('returns single text segment if no mentions', () => {
|
|
43
|
+
expect(parseMentionSegments('Just a normal comment without tags.')).toEqual([
|
|
44
|
+
{ type: 'text', value: 'Just a normal comment without tags.' }
|
|
45
|
+
]);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('correctly segments text with single mention in the middle', () => {
|
|
49
|
+
const result = parseMentionSegments('Hello @planner, please check.');
|
|
50
|
+
expect(result).toEqual([
|
|
51
|
+
{ type: 'text', value: 'Hello ' },
|
|
52
|
+
{ type: 'mention', value: '@planner', handle: 'planner' },
|
|
53
|
+
{ type: 'text', value: ', please check.' }
|
|
54
|
+
]);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('correctly segments text starting with a mention', () => {
|
|
58
|
+
const result = parseMentionSegments('@planner can you take a look?');
|
|
59
|
+
expect(result).toEqual([
|
|
60
|
+
{ type: 'mention', value: '@planner', handle: 'planner' },
|
|
61
|
+
{ type: 'text', value: ' can you take a look?' }
|
|
62
|
+
]);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('correctly segments text ending with a mention', () => {
|
|
66
|
+
const result = parseMentionSegments('Assigned to @coordinator');
|
|
67
|
+
expect(result).toEqual([
|
|
68
|
+
{ type: 'text', value: 'Assigned to ' },
|
|
69
|
+
{ type: 'mention', value: '@coordinator', handle: 'coordinator' }
|
|
70
|
+
]);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('correctly segments quoted mentions', () => {
|
|
74
|
+
const result = parseMentionSegments('Ping @"Agent Supervisor" ASAP');
|
|
75
|
+
expect(result).toEqual([
|
|
76
|
+
{ type: 'text', value: 'Ping ' },
|
|
77
|
+
{ type: 'mention', value: '@"Agent Supervisor"', handle: 'Agent Supervisor' },
|
|
78
|
+
{ type: 'text', value: ' ASAP' }
|
|
79
|
+
]);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
});
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
export interface MentionSegment {
|
|
2
|
+
type: 'text' | 'mention';
|
|
3
|
+
value: string;
|
|
4
|
+
handle?: string;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Regex matching mentions:
|
|
9
|
+
* - Quoted mentions: @"Jane Doe"
|
|
10
|
+
* - Standard mentions: @jane_doe, @planner, @user-1, @john.smith
|
|
11
|
+
* Note: Does not match emails like foo@bar.com (requires word boundary or start of string before @).
|
|
12
|
+
*/
|
|
13
|
+
export const MENTION_REGEX = /(?:^|\s)@(?:"([^"]+)"|([a-zA-Z0-9_.-]+))/g;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Extracts unique mention handles from a text string.
|
|
17
|
+
* Strips quotes and the leading '@' symbol.
|
|
18
|
+
* Preserves the order of their first appearance.
|
|
19
|
+
*/
|
|
20
|
+
export function extractMentions(content: string): string[] {
|
|
21
|
+
if (!content || typeof content !== 'string') return [];
|
|
22
|
+
|
|
23
|
+
const mentions: string[] = [];
|
|
24
|
+
const seen = new Set<string>();
|
|
25
|
+
|
|
26
|
+
// Reset regex lastIndex
|
|
27
|
+
const regex = new RegExp(MENTION_REGEX.source, 'g');
|
|
28
|
+
let match: RegExpExecArray | null;
|
|
29
|
+
|
|
30
|
+
while ((match = regex.exec(content)) !== null) {
|
|
31
|
+
const handle = match[1] ?? match[2];
|
|
32
|
+
if (handle && !seen.has(handle)) {
|
|
33
|
+
seen.add(handle);
|
|
34
|
+
mentions.push(handle);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return mentions;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Segments a text string into plain text parts and mention tokens.
|
|
43
|
+
* Useful for rendering highlighted mention badges or links in UI components.
|
|
44
|
+
*/
|
|
45
|
+
export function parseMentionSegments(content: string): MentionSegment[] {
|
|
46
|
+
if (!content) return [];
|
|
47
|
+
|
|
48
|
+
const segments: MentionSegment[] = [];
|
|
49
|
+
const regex = new RegExp(MENTION_REGEX.source, 'g');
|
|
50
|
+
let lastIndex = 0;
|
|
51
|
+
let match: RegExpExecArray | null;
|
|
52
|
+
|
|
53
|
+
while ((match = regex.exec(content)) !== null) {
|
|
54
|
+
const fullMatch = match[0];
|
|
55
|
+
const leadingWhitespace = fullMatch.startsWith(' ') || fullMatch.startsWith('\t') || fullMatch.startsWith('\n')
|
|
56
|
+
? fullMatch[0]
|
|
57
|
+
: '';
|
|
58
|
+
const mentionToken = fullMatch.slice(leadingWhitespace.length);
|
|
59
|
+
const handle = match[1] ?? match[2];
|
|
60
|
+
const matchStart = match.index + leadingWhitespace.length;
|
|
61
|
+
|
|
62
|
+
// Push text before this mention if any
|
|
63
|
+
if (matchStart > lastIndex) {
|
|
64
|
+
segments.push({
|
|
65
|
+
type: 'text',
|
|
66
|
+
value: content.slice(lastIndex, matchStart)
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Push the mention token
|
|
71
|
+
segments.push({
|
|
72
|
+
type: 'mention',
|
|
73
|
+
value: mentionToken,
|
|
74
|
+
handle
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
lastIndex = match.index + fullMatch.length;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Push any remaining text after the last match
|
|
81
|
+
if (lastIndex < content.length) {
|
|
82
|
+
segments.push({
|
|
83
|
+
type: 'text',
|
|
84
|
+
value: content.slice(lastIndex)
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return segments;
|
|
89
|
+
}
|
package/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["./src/index.test.ts","./src/index.ts","./src/use-case-validation.test.ts","./src/domain/custom-fields.ts","./src/domain/ddd.test.ts","./src/domain/entities.ts","./src/domain/events.ts","./src/domain/graph.ts","./src/domain/index.ts","./src/engine/index.ts","./src/plugins/index.ts","./src/storage/file-storage.ts","./src/storage/firebase-storage.ts","./src/storage/index.ts","./src/storage/s3.ts","./src/storage/storage.test.ts","./src/store/firebase.test.ts","./src/store/firebase.ts","./src/store/index.ts","./src/store/sqlite.test.ts","./src/store/sqlite.ts","./src/types/index.ts","./src/utils/index.ts","./src/utils/key.test.ts","./src/utils/key.ts","./src/utils/status.ts","./src/utils/workflow.ts"],"version":"5.9.3"}
|
|
1
|
+
{"root":["./src/index.test.ts","./src/index.ts","./src/use-case-validation.test.ts","./src/domain/custom-fields.ts","./src/domain/ddd.test.ts","./src/domain/entities.ts","./src/domain/events.ts","./src/domain/graph.ts","./src/domain/index.ts","./src/engine/index.ts","./src/plugins/index.ts","./src/storage/file-storage.ts","./src/storage/firebase-storage.ts","./src/storage/index.ts","./src/storage/s3.ts","./src/storage/storage.test.ts","./src/store/firebase.test.ts","./src/store/firebase.ts","./src/store/index.ts","./src/store/sqlite.test.ts","./src/store/sqlite.ts","./src/types/index.ts","./src/utils/index.ts","./src/utils/key.test.ts","./src/utils/key.ts","./src/utils/mentions.test.ts","./src/utils/mentions.ts","./src/utils/status.ts","./src/utils/workflow.ts"],"version":"5.9.3"}
|