@memberjunction/ng-conversations 6.1.0-edge.2 → 6.1.0-edge.4
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/LICENSE +180 -4
- package/README.md +32 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +159 -9
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +497 -106
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
- package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts +14 -2
- package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/pinned-messages-panel.component.js +37 -19
- package/dist/lib/components/conversation/pinned-messages-panel.component.js.map +1 -1
- package/dist/lib/components/message/message-input.component.d.ts +7 -3
- package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input.component.js +78 -159
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/message/message-list.component.d.ts +287 -7
- package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-list.component.js +850 -56
- package/dist/lib/components/message/message-list.component.js.map +1 -1
- package/dist/lib/services/conversation-agent.service.d.ts +98 -16
- package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-agent.service.js +218 -69
- package/dist/lib/services/conversation-agent.service.js.map +1 -1
- package/dist/lib/services/conversation-detail-window.store.d.ts +206 -0
- package/dist/lib/services/conversation-detail-window.store.d.ts.map +1 -0
- package/dist/lib/services/conversation-detail-window.store.js +503 -0
- package/dist/lib/services/conversation-detail-window.store.js.map +1 -0
- package/dist/lib/services/search.service.d.ts +10 -4
- package/dist/lib/services/search.service.d.ts.map +1 -1
- package/dist/lib/services/search.service.js +16 -11
- package/dist/lib/services/search.service.js.map +1 -1
- package/dist/lib/utils/agent-artifact-summary.d.ts +54 -0
- package/dist/lib/utils/agent-artifact-summary.d.ts.map +1 -0
- package/dist/lib/utils/agent-artifact-summary.js +49 -0
- package/dist/lib/utils/agent-artifact-summary.js.map +1 -0
- package/dist/lib/utils/conversation-detail-window.d.ts +49 -0
- package/dist/lib/utils/conversation-detail-window.d.ts.map +1 -0
- package/dist/lib/utils/conversation-detail-window.js +86 -0
- package/dist/lib/utils/conversation-detail-window.js.map +1 -0
- package/dist/lib/utils/date-jump.d.ts +65 -0
- package/dist/lib/utils/date-jump.d.ts.map +1 -0
- package/dist/lib/utils/date-jump.js +106 -0
- package/dist/lib/utils/date-jump.js.map +1 -0
- package/package.json +32 -32
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ceiling on older-page loads for one jump.
|
|
3
|
+
*
|
|
4
|
+
* A jump into a very old conversation would otherwise page the entire history back — the
|
|
5
|
+
* exact unbounded read windowing exists to prevent. On a miss the caller lands the user at
|
|
6
|
+
* the oldest loaded message instead, which is where paging left them anyway.
|
|
7
|
+
*/
|
|
8
|
+
export const DATE_JUMP_MAX_PAGES = 50;
|
|
9
|
+
/** Local midnight `daysAgo` days before `now`. */
|
|
10
|
+
function startOfDayBefore(now, daysAgo) {
|
|
11
|
+
const d = new Date(now.getFullYear(), now.getMonth(), now.getDate());
|
|
12
|
+
d.setDate(d.getDate() - daysAgo);
|
|
13
|
+
return d;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Inclusive lower bound for a period — the oldest instant a message may carry and still count
|
|
17
|
+
* as "in" that period. `today` is midnight today; the rest reach further back.
|
|
18
|
+
*/
|
|
19
|
+
export function ResolveDateJumpCutoff(period, now) {
|
|
20
|
+
switch (period) {
|
|
21
|
+
case 'today':
|
|
22
|
+
return startOfDayBefore(now, 0);
|
|
23
|
+
case 'yesterday':
|
|
24
|
+
return startOfDayBefore(now, 1);
|
|
25
|
+
case 'last-week':
|
|
26
|
+
return startOfDayBefore(now, 7);
|
|
27
|
+
case 'last-month':
|
|
28
|
+
return startOfDayBefore(now, 30);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** The timestamp a jump sorts on. Falsy/invalid stamps are skipped rather than treated as epoch. */
|
|
32
|
+
function detailTime(detail) {
|
|
33
|
+
const raw = detail.__mj_CreatedAt;
|
|
34
|
+
if (!raw) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
const ms = raw instanceof Date ? raw.getTime() : new Date(raw).getTime();
|
|
38
|
+
return Number.isNaN(ms) ? null : ms;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Resolves which loaded message a date jump should land on.
|
|
42
|
+
*
|
|
43
|
+
* The target is the OLDEST message at or after the cutoff — jumping to "last week" means the
|
|
44
|
+
* start of last week's conversation, not its end.
|
|
45
|
+
*
|
|
46
|
+
* `NeedsOlder` is the windowing-aware part. If every loaded message is in-period, the true
|
|
47
|
+
* start of the period may still be below the loaded window, so the caller pages and asks
|
|
48
|
+
* again. If any loaded message predates the cutoff, the boundary is already inside the loaded
|
|
49
|
+
* set and no amount of paging would improve the answer.
|
|
50
|
+
*/
|
|
51
|
+
export function ResolveDateJumpTarget(chronologicalDetails, period, now) {
|
|
52
|
+
const cutoff = ResolveDateJumpCutoff(period, now).getTime();
|
|
53
|
+
let target = null;
|
|
54
|
+
let sawOlderThanCutoff = false;
|
|
55
|
+
for (const detail of chronologicalDetails) {
|
|
56
|
+
const ms = detailTime(detail);
|
|
57
|
+
if (ms === null) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (ms < cutoff) {
|
|
61
|
+
sawOlderThanCutoff = true;
|
|
62
|
+
}
|
|
63
|
+
else if (target === null) {
|
|
64
|
+
target = detail;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Nothing in-period AND nothing older loaded => the whole window post-dates the cutoff
|
|
68
|
+
// only if we also found no target; that still means paging could help.
|
|
69
|
+
return { Detail: target, NeedsOlder: !sawOlderThanCutoff };
|
|
70
|
+
}
|
|
71
|
+
/** Human-readable result, for the caller to surface instead of failing silently. */
|
|
72
|
+
export function DescribeDateJumpOutcome(outcome, period) {
|
|
73
|
+
const label = period === 'last-week' ? 'last week'
|
|
74
|
+
: period === 'last-month' ? 'last month'
|
|
75
|
+
: period;
|
|
76
|
+
switch (outcome) {
|
|
77
|
+
case 'reached':
|
|
78
|
+
return `Jumped to ${label}.`;
|
|
79
|
+
case 'oldest':
|
|
80
|
+
return `No messages from ${label} — showing the start of the conversation.`;
|
|
81
|
+
case 'capped':
|
|
82
|
+
return `Stopped after loading ${DATE_JUMP_MAX_PAGES} pages — showing the oldest loaded message.`;
|
|
83
|
+
case 'empty':
|
|
84
|
+
return 'Nothing loaded to jump to.';
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Final outcome for a date jump.
|
|
89
|
+
*
|
|
90
|
+
* The paging loop and the scroll answer DIFFERENT questions: the loop knows only whether it
|
|
91
|
+
* ran out of history (or pages) to load, while the scroll knows whether an in-period message
|
|
92
|
+
* was actually found. Letting the loop's verdict win was a bug — a conversation whose oldest
|
|
93
|
+
* message is itself in-period never sees a pre-cutoff row, so the loop reports "ran out"
|
|
94
|
+
* even though the jump landed on a perfectly good target and the user was told no such
|
|
95
|
+
* messages exist.
|
|
96
|
+
*
|
|
97
|
+
* So: a successful scroll always wins. The cap only surfaces when the scroll did NOT reach,
|
|
98
|
+
* because that is the only case where "we stopped early" explains the miss.
|
|
99
|
+
*/
|
|
100
|
+
export function CombineDateJumpOutcome(scrollOutcome, hitPageCap) {
|
|
101
|
+
if (scrollOutcome === 'reached') {
|
|
102
|
+
return 'reached';
|
|
103
|
+
}
|
|
104
|
+
return hitPageCap ? 'capped' : scrollOutcome;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=date-jump.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-jump.js","sourceRoot":"","sources":["../../../src/lib/utils/date-jump.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RealtimeTimelineSourceDetail } from './realtime-session-timeline';\n\n/**\n * Periods the transcript's date navigator offers. Kept as a union rather than a string so a\n * new dropdown entry cannot silently fall through to \"no cutoff\".\n */\nexport type DateJumpPeriod = 'today' | 'yesterday' | 'last-week' | 'last-month';\n\n/**\n * How far back a jump had to page before it stopped.\n *\n * The plan's requirement is that a jump never silently no-ops, so every terminal state here is\n * something the caller can report: `reached` scrolled to a real message, `oldest` ran out of\n * history, `capped` hit {@link DATE_JUMP_MAX_PAGES}, `empty` had nothing loaded at all.\n */\nexport type DateJumpOutcome = 'reached' | 'oldest' | 'capped' | 'empty';\n\n/**\n * Ceiling on older-page loads for one jump.\n *\n * A jump into a very old conversation would otherwise page the entire history back — the\n * exact unbounded read windowing exists to prevent. On a miss the caller lands the user at\n * the oldest loaded message instead, which is where paging left them anyway.\n */\nexport const DATE_JUMP_MAX_PAGES = 50;\n\n/** Local midnight `daysAgo` days before `now`. */\nfunction startOfDayBefore(now: Date, daysAgo: number): Date {\n const d = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n d.setDate(d.getDate() - daysAgo);\n return d;\n}\n\n/**\n * Inclusive lower bound for a period — the oldest instant a message may carry and still count\n * as \"in\" that period. `today` is midnight today; the rest reach further back.\n */\nexport function ResolveDateJumpCutoff(period: DateJumpPeriod, now: Date): Date {\n switch (period) {\n case 'today':\n return startOfDayBefore(now, 0);\n case 'yesterday':\n return startOfDayBefore(now, 1);\n case 'last-week':\n return startOfDayBefore(now, 7);\n case 'last-month':\n return startOfDayBefore(now, 30);\n }\n}\n\n/** The timestamp a jump sorts on. Falsy/invalid stamps are skipped rather than treated as epoch. */\nfunction detailTime(detail: RealtimeTimelineSourceDetail): number | null {\n const raw = (detail as { __mj_CreatedAt?: Date | string | null }).__mj_CreatedAt;\n if (!raw) {\n return null;\n }\n const ms = raw instanceof Date ? raw.getTime() : new Date(raw).getTime();\n return Number.isNaN(ms) ? null : ms;\n}\n\nexport interface DateJumpTarget<T extends RealtimeTimelineSourceDetail> {\n /** Oldest loaded detail at or after the cutoff — the message to scroll to. */\n Detail: T | null;\n /**\n * True when the loaded set cannot yet answer the question: everything loaded is at or\n * after the cutoff, so an older page might contain a still-earlier message in-period.\n */\n NeedsOlder: boolean;\n}\n\n/**\n * Resolves which loaded message a date jump should land on.\n *\n * The target is the OLDEST message at or after the cutoff — jumping to \"last week\" means the\n * start of last week's conversation, not its end.\n *\n * `NeedsOlder` is the windowing-aware part. If every loaded message is in-period, the true\n * start of the period may still be below the loaded window, so the caller pages and asks\n * again. If any loaded message predates the cutoff, the boundary is already inside the loaded\n * set and no amount of paging would improve the answer.\n */\nexport function ResolveDateJumpTarget<T extends RealtimeTimelineSourceDetail>(\n chronologicalDetails: readonly T[],\n period: DateJumpPeriod,\n now: Date\n): DateJumpTarget<T> {\n const cutoff = ResolveDateJumpCutoff(period, now).getTime();\n\n let target: T | null = null;\n let sawOlderThanCutoff = false;\n\n for (const detail of chronologicalDetails) {\n const ms = detailTime(detail);\n if (ms === null) {\n continue;\n }\n if (ms < cutoff) {\n sawOlderThanCutoff = true;\n } else if (target === null) {\n target = detail;\n }\n }\n\n // Nothing in-period AND nothing older loaded => the whole window post-dates the cutoff\n // only if we also found no target; that still means paging could help.\n return { Detail: target, NeedsOlder: !sawOlderThanCutoff };\n}\n\n/** Human-readable result, for the caller to surface instead of failing silently. */\nexport function DescribeDateJumpOutcome(outcome: DateJumpOutcome, period: DateJumpPeriod): string {\n const label = period === 'last-week' ? 'last week'\n : period === 'last-month' ? 'last month'\n : period;\n switch (outcome) {\n case 'reached':\n return `Jumped to ${label}.`;\n case 'oldest':\n return `No messages from ${label} — showing the start of the conversation.`;\n case 'capped':\n return `Stopped after loading ${DATE_JUMP_MAX_PAGES} pages — showing the oldest loaded message.`;\n case 'empty':\n return 'Nothing loaded to jump to.';\n }\n}\n\n/**\n * Final outcome for a date jump.\n *\n * The paging loop and the scroll answer DIFFERENT questions: the loop knows only whether it\n * ran out of history (or pages) to load, while the scroll knows whether an in-period message\n * was actually found. Letting the loop's verdict win was a bug — a conversation whose oldest\n * message is itself in-period never sees a pre-cutoff row, so the loop reports \"ran out\"\n * even though the jump landed on a perfectly good target and the user was told no such\n * messages exist.\n *\n * So: a successful scroll always wins. The cap only surfaces when the scroll did NOT reach,\n * because that is the only case where \"we stopped early\" explains the miss.\n */\nexport function CombineDateJumpOutcome(\n scrollOutcome: DateJumpOutcome,\n hitPageCap: boolean\n): DateJumpOutcome {\n if (scrollOutcome === 'reached') {\n return 'reached';\n }\n return hitPageCap ? 'capped' : scrollOutcome;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-conversations",
|
|
3
|
-
"version": "6.1.0-edge.
|
|
3
|
+
"version": "6.1.0-edge.4",
|
|
4
4
|
"description": "MemberJunction: Conversation, Collection, and Artifact management components for any Angular application",
|
|
5
5
|
"main": "./dist/public-api.js",
|
|
6
6
|
"typings": "./dist/public-api.d.ts",
|
|
@@ -9,13 +9,13 @@
|
|
|
9
9
|
],
|
|
10
10
|
"keywords": [],
|
|
11
11
|
"author": "",
|
|
12
|
-
"license": "
|
|
12
|
+
"license": "BUSL-1.1",
|
|
13
13
|
"devDependencies": {
|
|
14
14
|
"@angular/compiler": "21.1.3",
|
|
15
15
|
"@angular/compiler-cli": "21.1.3",
|
|
16
16
|
"sass": "^1.97.3",
|
|
17
17
|
"vitest": "^4.0.18",
|
|
18
|
-
"@memberjunction/ng-test-utils": "6.1.0-edge.
|
|
18
|
+
"@memberjunction/ng-test-utils": "6.1.0-edge.4"
|
|
19
19
|
},
|
|
20
20
|
"peerDependencies": {
|
|
21
21
|
"@angular/common": "^21.1.3",
|
|
@@ -26,35 +26,35 @@
|
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"@angular/animations": "21.1.3",
|
|
28
28
|
"@angular/cdk": "21.1.3",
|
|
29
|
-
"@memberjunction/ai": "6.1.0-edge.
|
|
30
|
-
"@memberjunction/ai-agent-client": "6.1.0-edge.
|
|
31
|
-
"@memberjunction/ai-core-plus": "6.1.0-edge.
|
|
32
|
-
"@memberjunction/ai-engine-base": "6.1.0-edge.
|
|
33
|
-
"@memberjunction/ai-realtime-client": "6.1.0-edge.
|
|
34
|
-
"@memberjunction/conversations-runtime": "6.1.0-edge.
|
|
35
|
-
"@memberjunction/core": "6.1.0-edge.
|
|
36
|
-
"@memberjunction/core-entities": "6.1.0-edge.
|
|
37
|
-
"@memberjunction/global": "6.1.0-edge.
|
|
38
|
-
"@memberjunction/graphql-dataprovider": "6.1.0-edge.
|
|
39
|
-
"@memberjunction/interactive-component-types": "6.1.0-edge.
|
|
40
|
-
"@memberjunction/ng-agent-client": "6.1.0-edge.
|
|
41
|
-
"@memberjunction/ng-artifacts": "6.1.0-edge.
|
|
42
|
-
"@memberjunction/ng-base-types": "6.1.0-edge.
|
|
43
|
-
"@memberjunction/ng-code-editor": "6.1.0-edge.
|
|
44
|
-
"@memberjunction/ng-composer": "6.1.0-edge.
|
|
45
|
-
"@memberjunction/ng-container-directives": "6.1.0-edge.
|
|
46
|
-
"@memberjunction/ng-forms": "6.1.0-edge.
|
|
47
|
-
"@memberjunction/ng-markdown": "6.1.0-edge.
|
|
48
|
-
"@memberjunction/ng-media-player": "6.1.0-edge.
|
|
49
|
-
"@memberjunction/ng-notifications": "6.1.0-edge.
|
|
50
|
-
"@memberjunction/ng-resource-permissions": "6.1.0-edge.
|
|
51
|
-
"@memberjunction/ng-shared-generic": "6.1.0-edge.
|
|
52
|
-
"@memberjunction/ng-task-graph-editor": "6.1.0-edge.
|
|
53
|
-
"@memberjunction/ng-tasks": "6.1.0-edge.
|
|
54
|
-
"@memberjunction/ng-testing": "6.1.0-edge.
|
|
55
|
-
"@memberjunction/ng-ui-components": "6.1.0-edge.
|
|
56
|
-
"@memberjunction/ng-user-routines": "6.1.0-edge.
|
|
57
|
-
"@memberjunction/ng-whiteboard": "6.1.0-edge.
|
|
29
|
+
"@memberjunction/ai": "6.1.0-edge.4",
|
|
30
|
+
"@memberjunction/ai-agent-client": "6.1.0-edge.4",
|
|
31
|
+
"@memberjunction/ai-core-plus": "6.1.0-edge.4",
|
|
32
|
+
"@memberjunction/ai-engine-base": "6.1.0-edge.4",
|
|
33
|
+
"@memberjunction/ai-realtime-client": "6.1.0-edge.4",
|
|
34
|
+
"@memberjunction/conversations-runtime": "6.1.0-edge.4",
|
|
35
|
+
"@memberjunction/core": "6.1.0-edge.4",
|
|
36
|
+
"@memberjunction/core-entities": "6.1.0-edge.4",
|
|
37
|
+
"@memberjunction/global": "6.1.0-edge.4",
|
|
38
|
+
"@memberjunction/graphql-dataprovider": "6.1.0-edge.4",
|
|
39
|
+
"@memberjunction/interactive-component-types": "6.1.0-edge.4",
|
|
40
|
+
"@memberjunction/ng-agent-client": "6.1.0-edge.4",
|
|
41
|
+
"@memberjunction/ng-artifacts": "6.1.0-edge.4",
|
|
42
|
+
"@memberjunction/ng-base-types": "6.1.0-edge.4",
|
|
43
|
+
"@memberjunction/ng-code-editor": "6.1.0-edge.4",
|
|
44
|
+
"@memberjunction/ng-composer": "6.1.0-edge.4",
|
|
45
|
+
"@memberjunction/ng-container-directives": "6.1.0-edge.4",
|
|
46
|
+
"@memberjunction/ng-forms": "6.1.0-edge.4",
|
|
47
|
+
"@memberjunction/ng-markdown": "6.1.0-edge.4",
|
|
48
|
+
"@memberjunction/ng-media-player": "6.1.0-edge.4",
|
|
49
|
+
"@memberjunction/ng-notifications": "6.1.0-edge.4",
|
|
50
|
+
"@memberjunction/ng-resource-permissions": "6.1.0-edge.4",
|
|
51
|
+
"@memberjunction/ng-shared-generic": "6.1.0-edge.4",
|
|
52
|
+
"@memberjunction/ng-task-graph-editor": "6.1.0-edge.4",
|
|
53
|
+
"@memberjunction/ng-tasks": "6.1.0-edge.4",
|
|
54
|
+
"@memberjunction/ng-testing": "6.1.0-edge.4",
|
|
55
|
+
"@memberjunction/ng-ui-components": "6.1.0-edge.4",
|
|
56
|
+
"@memberjunction/ng-user-routines": "6.1.0-edge.4",
|
|
57
|
+
"@memberjunction/ng-whiteboard": "6.1.0-edge.4",
|
|
58
58
|
"angular-split": "^20.0.0",
|
|
59
59
|
"rxjs": "^7.8.2",
|
|
60
60
|
"tslib": "^2.8.1"
|