@memberjunction/server 6.2.0-edge.1 → 6.2.0-edge.2
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/dist/.tsbuildinfo +1 -1
- package/dist/generated/graphql-schemas/__mj.d.ts +1010 -0
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +5178 -3
- package/dist/generated/graphql-schemas/__mj.js.map +1 -1
- package/dist/generic/FireAndForgetHeartbeat.d.ts +15 -1
- package/dist/generic/FireAndForgetHeartbeat.d.ts.map +1 -1
- package/dist/generic/FireAndForgetHeartbeat.js +16 -2
- package/dist/generic/FireAndForgetHeartbeat.js.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.d.ts +31 -0
- package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -0
- package/dist/generic/OrphanedConversationDetailReconciler.js +215 -0
- package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -0
- package/dist/generic/PushStatusResolver.d.ts +38 -0
- package/dist/generic/PushStatusResolver.d.ts.map +1 -1
- package/dist/generic/PushStatusResolver.js +84 -1
- package/dist/generic/PushStatusResolver.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +13 -1
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +49 -47
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +90 -2
- package/dist/index.js.map +1 -1
- package/dist/resolvers/AgentRunStatusPublisher.d.ts +55 -0
- package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -0
- package/dist/resolvers/AgentRunStatusPublisher.js +141 -0
- package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -0
- package/dist/resolvers/ConversationRunEventsResolver.d.ts +90 -0
- package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -0
- package/dist/resolvers/ConversationRunEventsResolver.js +283 -0
- package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -0
- package/dist/resolvers/DuplicateEntryCheckResolver.d.ts +98 -0
- package/dist/resolvers/DuplicateEntryCheckResolver.d.ts.map +1 -0
- package/dist/resolvers/DuplicateEntryCheckResolver.js +227 -0
- package/dist/resolvers/DuplicateEntryCheckResolver.js.map +1 -0
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.js +2 -1
- package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.d.ts +7 -0
- package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.js +16 -2
- package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts +44 -6
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +90 -34
- package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts +0 -16
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +23 -153
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunDecisionResolver.d.ts +149 -0
- package/dist/resolvers/RunDecisionResolver.d.ts.map +1 -0
- package/dist/resolvers/RunDecisionResolver.js +396 -0
- package/dist/resolvers/RunDecisionResolver.js.map +1 -0
- package/dist/resolvers/VectorizeEntityResolver.d.ts +1 -1
- package/dist/resolvers/VectorizeEntityResolver.d.ts.map +1 -1
- package/dist/resolvers/VectorizeEntityResolver.js +14 -10
- package/dist/resolvers/VectorizeEntityResolver.js.map +1 -1
- package/package.json +94 -92
- package/src/__tests__/AgentRunStatusPublisher.test.ts +175 -0
- package/src/__tests__/DuplicateEntryCheckResolver.test.ts +300 -0
- package/src/__tests__/RealtimeClientSessionResolver.test.ts +216 -2
- package/src/__tests__/RemoteBrowserActionRecovery.test.ts +7 -1
- package/src/__tests__/RemoteBrowserAudioStream.test.ts +7 -1
- package/src/__tests__/RemoteBrowserSnapshot.test.ts +7 -1
- package/src/__tests__/ResolverBase.clientOldValues.test.ts +52 -0
- package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +182 -12
- package/src/__tests__/RunAIAgentResolver.streaming.test.ts +18 -27
- package/src/__tests__/RunDecisionResolver.test.ts +699 -0
- package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +2 -0
- package/src/__tests__/VectorizeEntityResolver.test.ts +106 -0
- package/src/__tests__/conversationRunEvents.test.ts +399 -0
- package/src/__tests__/orphanedConversationDetailReconciler.test.ts +283 -0
- package/src/__tests__/pushStatusFanOut.test.ts +206 -0
- package/src/auth/__tests__/backward-compatibility.test.ts +1 -0
- package/src/generated/graphql-schemas/__mj.ts +3637 -4
- package/src/generic/FireAndForgetHeartbeat.ts +16 -2
- package/src/generic/OrphanedConversationDetailReconciler.ts +267 -0
- package/src/generic/PushStatusResolver.ts +97 -1
- package/src/generic/ResolverBase.ts +49 -49
- package/src/index.ts +102 -2
- package/src/resolvers/AgentRunStatusPublisher.ts +175 -0
- package/src/resolvers/ConversationRunEventsResolver.ts +308 -0
- package/src/resolvers/DuplicateEntryCheckResolver.ts +232 -0
- package/src/resolvers/FetchEntityVectorsResolver.ts +2 -1
- package/src/resolvers/MergeRecordsResolver.ts +14 -2
- package/src/resolvers/RealtimeClientSessionResolver.ts +93 -35
- package/src/resolvers/RunAIAgentResolver.ts +28 -174
- package/src/resolvers/RunDecisionResolver.ts +435 -0
- package/src/resolvers/VectorizeEntityResolver.ts +16 -11
- package/src/resolvers/__tests__/MergeRecordsResolver.test.ts +93 -0
|
@@ -15,6 +15,7 @@ import { LogError, LogStatus, RunView } from '@memberjunction/core';
|
|
|
15
15
|
import { ResolverBase } from '../generic/ResolverBase.js';
|
|
16
16
|
import { GetAIAPIKey } from '@memberjunction/ai';
|
|
17
17
|
import { VectorDBBase } from '@memberjunction/ai-vectordb';
|
|
18
|
+
import { AIEngine } from '@memberjunction/aiengine';
|
|
18
19
|
import { EscapeSQLString, MJGlobal, UUIDsEqual } from '@memberjunction/global';
|
|
19
20
|
/* ───── GraphQL types ───── */
|
|
20
21
|
let EntityVectorItem = class EntityVectorItem {
|
|
@@ -99,7 +100,7 @@ let FetchEntityVectorsResolver = class FetchEntityVectorsResolver extends Resolv
|
|
|
99
100
|
const uniformVector = new Array(dimensions).fill(1.0 / Math.sqrt(dimensions));
|
|
100
101
|
const metadataFilter = { Entity: { $eq: entityName } };
|
|
101
102
|
const queryResponse = await vectorDBInstance.QueryIndex({
|
|
102
|
-
id:
|
|
103
|
+
id: AIEngine.Instance.GetProviderIndexName(vectorIndex),
|
|
103
104
|
vector: uniformVector,
|
|
104
105
|
topK: limit,
|
|
105
106
|
includeMetadata: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FetchEntityVectorsResolver.js","sourceRoot":"","sources":["../../src/resolvers/FetchEntityVectorsResolver.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAExF,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAY,OAAO,EAAY,MAAM,sBAAsB,CAAC;AAExF,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAE/E,+BAA+B;AAGxB,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;CAS5B,CAAA;AAPG;IADC,KAAK,EAAE;;4CACG;AAGX;IADC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;;gDACJ;AAGjB;IADC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC;;kDACH;AARR,gBAAgB;IAD5B,UAAU,EAAE;GACA,gBAAgB,CAS5B;;AAGM,IAAM,wBAAwB,GAA9B,MAAM,wBAAwB;CAepC,CAAA;AAbG;IADC,KAAK,EAAE;;yDACS;AAGjB;IADC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC;;yDACJ;AAG5B;IADC,KAAK,EAAE;;4DACW;AAGnB;IADC,KAAK,EAAE;;2DACU;AAGlB;IADC,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;8DACJ;AAdb,wBAAwB;IADpC,UAAU,EAAE;GACA,wBAAwB,CAepC;;AAED,0BAA0B;AAGnB,IAAM,0BAA0B,GAAhC,MAAM,0BAA2B,SAAQ,YAAY;IAGlD,AAAN,KAAK,CAAC,kBAAkB,CACK,gBAAwB,EACC,UAA8B,EAC7C,MAA0B,EACtD,EAAE,WAAW,KAAiB,EAAgB;QAErD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC;YACD,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YACzD,IAAI,CAAC,WAAW,EAAE,CAAC;gBACf,OAAO,IAAI,CAAC,WAAW,CAAC,kCAAkC,EAAE,SAAS,CAAC,CAAC;YAC3E,CAAC;YAED,MAAM,KAAK,GAAG,UAAU,IAAI,IAAI,CAAC;YAEjC,kCAAkC;YAClC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;YAC/E,IAAI,CAAC,SAAS,EAAE,CAAC;gBACb,OAAO,IAAI,CAAC,WAAW,CAAC,6BAA6B,gBAAgB,EAAE,EAAE,SAAS,CAAC,CAAC;YACxF,CAAC;YAED,kCAAkC;YAClC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAC1E,IAAI,CAAC,WAAW,EAAE,CAAC;gBACf,OAAO,IAAI,CAAC,WAAW,CACnB,qDAAqD,SAAS,CAAC,IAAI,GAAG,EACtE,SAAS,CACZ,CAAC;YACN,CAAC;YAED,4CAA4C;YAC5C,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YACrF,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACpB,OAAO,IAAI,CAAC,WAAW,CACnB,iDAAiD,WAAW,CAAC,IAAI,GAAG,EACpE,SAAS,CACZ,CAAC;YACN,CAAC;YAED,2DAA2D;YAC3D,0EAA0E;YAC1E,gFAAgF;YAChF,uEAAuE;YACvE,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC;YACpC,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,qCAAqC;YACxF,6EAA6E;YAC7E,8EAA8E;YAC9E,8EAA8E;YAC9E,6CAA6C;YAC7C,MAAM,aAAa,GAAG,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YAE9E,MAAM,cAAc,GAA4B,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,CAAC;YAEhF,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC;gBACpD,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"FetchEntityVectorsResolver.js","sourceRoot":"","sources":["../../src/resolvers/FetchEntityVectorsResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,14 +15,21 @@ export declare class RecordDependencyResult {
|
|
|
15
15
|
EntityName: string;
|
|
16
16
|
RelatedEntityName: string;
|
|
17
17
|
FieldName: string;
|
|
18
|
+
PrimaryKey: CompositeKey;
|
|
19
|
+
/** The same key under its pre-6.2 name, so older clients keep working. */
|
|
18
20
|
CompositeKey: CompositeKey;
|
|
21
|
+
IsSoftLink?: boolean;
|
|
22
|
+
EntityIDFieldName?: string;
|
|
19
23
|
}
|
|
20
24
|
export declare class RecordDependencyResolver {
|
|
21
25
|
GetRecordDependencies(entityName: string, ckInput: CompositeKeyInputType, { dataSource, userPayload, providers }: AppContext, pubSub: PubSubEngine): Promise<{
|
|
22
26
|
EntityName: string;
|
|
23
27
|
RelatedEntityName: string;
|
|
24
28
|
FieldName: string;
|
|
29
|
+
PrimaryKey: CompositeKey;
|
|
25
30
|
CompositeKey: CompositeKey;
|
|
31
|
+
IsSoftLink: boolean;
|
|
32
|
+
EntityIDFieldName: string;
|
|
26
33
|
}[]>;
|
|
27
34
|
}
|
|
28
35
|
declare class FieldMapping {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MergeRecordsResolver.d.ts","sourceRoot":"","sources":["../../src/resolvers/MergeRecordsResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAiE,YAAY,EAAmB,MAAM,cAAc,CAAC;AAC5H,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAGlG,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,qBACa,sBAAsB;IAEjC,UAAU,EAAE,MAAM,CAAC;IAGnB,iBAAiB,EAAE,MAAM,CAAC;IAG1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBACa,wBAAwB;IAE7B,qBAAqB,CACQ,UAAU,EAAE,MAAM,EAC5C,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,UAAU,EAC/C,MAAM,EAAE,YAAY;CAYjC;AAED,qBACa,sBAAsB;IAEjC,UAAU,EAAE,MAAM,CAAC;IAGnB,iBAAiB,EAAE,MAAM,CAAC;IAG1B,SAAS,EAAE,MAAM,CAAC;IAGlB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,qBACa,wBAAwB;IAE7B,qBAAqB,CACQ,UAAU,EAAE,MAAM,EACD,OAAO,EAAE,qBAAqB,EACzE,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,UAAU,EAC/C,MAAM,EAAE,YAAY
|
|
1
|
+
{"version":3,"file":"MergeRecordsResolver.d.ts","sourceRoot":"","sources":["../../src/resolvers/MergeRecordsResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAiE,YAAY,EAAmB,MAAM,cAAc,CAAC;AAC5H,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAGlG,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,qBACa,sBAAsB;IAEjC,UAAU,EAAE,MAAM,CAAC;IAGnB,iBAAiB,EAAE,MAAM,CAAC;IAG1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBACa,wBAAwB;IAE7B,qBAAqB,CACQ,UAAU,EAAE,MAAM,EAC5C,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,UAAU,EAC/C,MAAM,EAAE,YAAY;CAYjC;AAED,qBACa,sBAAsB;IAEjC,UAAU,EAAE,MAAM,CAAC;IAGnB,iBAAiB,EAAE,MAAM,CAAC;IAG1B,SAAS,EAAE,MAAM,CAAC;IAGlB,UAAU,EAAE,YAAY,CAAC;IAEzB,0EAA0E;IAE1E,YAAY,EAAE,YAAY,CAAC;IAG3B,UAAU,CAAC,EAAE,OAAO,CAAC;IAGrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qBACa,wBAAwB;IAE7B,qBAAqB,CACQ,UAAU,EAAE,MAAM,EACD,OAAO,EAAE,qBAAqB,EACzE,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,UAAU,EAC/C,MAAM,EAAE,YAAY;;;;;;;;;CAqBjC;AAED,cACM,YAAY;IAEhB,SAAS,EAAE,MAAM,CAAC;IAGlB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,cACM,kBAAkB;IAEtB,SAAS,EAAE,MAAM,CAAC;IAGlB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBACa,kBAAkB;IAE7B,UAAU,EAAE,MAAM,CAAC;IAGnB,2BAA2B,EAAE,YAAY,CAAC;IAG1C,cAAc,EAAE,YAAY,EAAE,CAAC;IAG/B,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED,qBACa,wBAAwB;IAEnC,UAAU,EAAE,MAAM,CAAC;IAGnB,iBAAiB,EAAE,MAAM,CAAC;IAG1B,cAAc,EAAE,MAAM,EAAE,CAAC;IAGzB,QAAQ,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACjC;AAED,qBACa,uBAAuB;IAElC,YAAY,EAAE,sBAAsB,CAAC;IAGrC,OAAO,EAAE,OAAO,CAAC;IAIjB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAGlC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBACa,iBAAiB;IAE5B,OAAO,EAAE,OAAO,CAAC;IAGjB,aAAa,EAAE,MAAM,CAAC;IAKtB,gBAAgB,EAAE,MAAM,CAAC;IAGzB,YAAY,EAAE,uBAAuB,EAAE,CAAC;IAGxC,OAAO,EAAE,wBAAwB,CAAC;CACnC;AAED,qBACa,mBAAoB,SAAQ,YAAY;IAE7C,YAAY,CAC0B,OAAO,EAAE,kBAAkB,EAC9D,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,UAAU,EAC/C,MAAM,EAAE,YAAY;CAyBjC;AAED,eAAe,wBAAwB,CAAC"}
|
|
@@ -77,7 +77,19 @@ __decorate([
|
|
|
77
77
|
__decorate([
|
|
78
78
|
Field(() => CompositeKeyOutputType),
|
|
79
79
|
__metadata("design:type", CompositeKey)
|
|
80
|
+
], RecordDependencyResult.prototype, "PrimaryKey", void 0);
|
|
81
|
+
__decorate([
|
|
82
|
+
Field(() => CompositeKeyOutputType, { deprecationReason: 'Use PrimaryKey. CompositeKey will be removed in a future release.' }),
|
|
83
|
+
__metadata("design:type", CompositeKey)
|
|
80
84
|
], RecordDependencyResult.prototype, "CompositeKey", void 0);
|
|
85
|
+
__decorate([
|
|
86
|
+
Field(() => Boolean, { nullable: true }),
|
|
87
|
+
__metadata("design:type", Boolean)
|
|
88
|
+
], RecordDependencyResult.prototype, "IsSoftLink", void 0);
|
|
89
|
+
__decorate([
|
|
90
|
+
Field(() => String, { nullable: true }),
|
|
91
|
+
__metadata("design:type", String)
|
|
92
|
+
], RecordDependencyResult.prototype, "EntityIDFieldName", void 0);
|
|
81
93
|
RecordDependencyResult = __decorate([
|
|
82
94
|
ObjectType()
|
|
83
95
|
], RecordDependencyResult);
|
|
@@ -88,12 +100,14 @@ let RecordDependencyResolver = class RecordDependencyResolver {
|
|
|
88
100
|
const md = GetReadOnlyProvider(providers);
|
|
89
101
|
const ck = new CompositeKey(ckInput.KeyValuePairs);
|
|
90
102
|
const result = await md.GetRecordDependencies(entityName, ck);
|
|
91
|
-
// Map PrimaryKey to CompositeKey for GraphQL response
|
|
92
103
|
return result.map(dep => ({
|
|
93
104
|
EntityName: dep.EntityName,
|
|
94
105
|
RelatedEntityName: dep.RelatedEntityName,
|
|
95
106
|
FieldName: dep.FieldName,
|
|
96
|
-
|
|
107
|
+
PrimaryKey: dep.PrimaryKey,
|
|
108
|
+
CompositeKey: dep.PrimaryKey,
|
|
109
|
+
IsSoftLink: dep.IsSoftLink,
|
|
110
|
+
EntityIDFieldName: dep.EntityIDFieldName,
|
|
97
111
|
}));
|
|
98
112
|
}
|
|
99
113
|
catch (e) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MergeRecordsResolver.js","sourceRoot":"","sources":["../../src/resolvers/MergeRecordsResolver.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAY,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE5H,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAClG,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAGnD,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;CASlC,CAAA;AAPC;IADC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC;;0DACD;AAGnB;IADC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC;;iEACM;AAG1B;IADC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC;;yDACF;AARP,sBAAsB;IADlC,UAAU,EAAE;GACA,sBAAsB,CASlC;;AAGM,IAAM,wBAAwB,GAA9B,MAAM,wBAAwB;IAE7B,AAAN,KAAK,CAAC,qBAAqB,CACQ,UAAkB,EAC5C,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAc,EAC/C,MAAoB;QAE9B,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;YAC1C,OAAO,EAAE,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,CAAC,CAAC;YACd,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAErG,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;CACF,CAAA;AAfO;IADL,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,sBAAsB,CAAC,CAAC;IAEnC,WAAA,GAAG,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAA;IAC/B,WAAA,GAAG,EAAE,CAAA;IACL,WAAA,MAAM,EAAE,CAAA;;qDAAS,YAAY;;qEAW/B;AAhBU,wBAAwB;IADpC,QAAQ,CAAC,sBAAsB,CAAC;GACpB,wBAAwB,CAiBpC;;AAGM,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;
|
|
1
|
+
{"version":3,"file":"MergeRecordsResolver.js","sourceRoot":"","sources":["../../src/resolvers/MergeRecordsResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -148,6 +148,18 @@ export declare class UploadRealtimeRecordingResult {
|
|
|
148
148
|
export declare class RealtimeClientSessionResolver extends ResolverBase {
|
|
149
149
|
private readonly clientSessionService;
|
|
150
150
|
private readonly sessionManager;
|
|
151
|
+
/**
|
|
152
|
+
* The reason a `Save()`/`Delete()` returned false, for a log line. `CompleteMessage` renders
|
|
153
|
+
* `Message`, `Error` and every `Errors[]` entry (validation errors included, since `Save()`
|
|
154
|
+
* runs `Validate()` and records its errors there), so there is no separate `Validate()` call.
|
|
155
|
+
* When a subclass refused the write without recording anything, say so explicitly instead of
|
|
156
|
+
* "unknown error", which is what hid MJ#4791.
|
|
157
|
+
*
|
|
158
|
+
* Only a NULL `LatestResult` proves the refusal happened before the provider (nothing was
|
|
159
|
+
* registered at all). A SUCCESS `LatestResult` is an earlier save on the same instance — the
|
|
160
|
+
* refusal registered nothing — so its text must never be reported as this failure's reason.
|
|
161
|
+
*/
|
|
162
|
+
private describeSaveFailure;
|
|
151
163
|
/**
|
|
152
164
|
* Start a client-direct realtime voice session targeting `targetAgentId`.
|
|
153
165
|
*
|
|
@@ -749,6 +761,14 @@ export declare class RealtimeClientSessionResolver extends ResolverBase {
|
|
|
749
761
|
* queries (which scan junctions across ALL details) still surface the artifact. This is the
|
|
750
762
|
* least-invasive correct anchor — no fake visible message, no orphaned artifact.
|
|
751
763
|
*
|
|
764
|
+
* TWO PRINCIPALS, deliberately: the lookup (`findLatestSessionDetailID`) and the junction row
|
|
765
|
+
* itself (`saveDetailArtifactJunction`, `MJ: Conversation Detail Artifacts`) run as `runUser`
|
|
766
|
+
* (elevated for a scoped-anonymous caller) — that junction entity is outside an anonymous
|
|
767
|
+
* caller's relay grants. The hidden ANCHOR `Conversation Detail` this may need to create runs as
|
|
768
|
+
* `callerUser` instead: like every other `MJ: Conversation Details` write, the System user is
|
|
769
|
+
* refused because it is not the conversation's owner (see {@link persistDirectActionTurn},
|
|
770
|
+
* issue #4791) — only the actual caller can create it.
|
|
771
|
+
*
|
|
752
772
|
* Strictly best-effort: every failure path logs and returns; a relayed tool call NEVER fails
|
|
753
773
|
* because history linking did.
|
|
754
774
|
*/
|
|
@@ -815,12 +835,6 @@ export declare class RealtimeClientSessionResolver extends ResolverBase {
|
|
|
815
835
|
* than blocking the start.
|
|
816
836
|
*/
|
|
817
837
|
private resolveWidgetVoiceCapSeconds;
|
|
818
|
-
/**
|
|
819
|
-
* Persists a single transcript turn as a `Conversation Detail` stamped with the session's
|
|
820
|
-
* conversation, the mapped role, the turn text, the session id, and the owning user.
|
|
821
|
-
*
|
|
822
|
-
* @returns The boolean save result (logs `CompleteMessage` on failure).
|
|
823
|
-
*/
|
|
824
838
|
/**
|
|
825
839
|
* Stamps `RecordingStartedAt` (the recording `t0` alignment origin) + `RecordingMedia` on a
|
|
826
840
|
* just-started session when the browser captured WITH consent. Best-effort: a parse/save failure
|
|
@@ -831,6 +845,13 @@ export declare class RealtimeClientSessionResolver extends ResolverBase {
|
|
|
831
845
|
* @param recordingStartedAt ISO-8601 recording start timestamp from the browser.
|
|
832
846
|
*/
|
|
833
847
|
private stampRecordingStart;
|
|
848
|
+
/**
|
|
849
|
+
* Persists a single transcript turn as a `Conversation Detail` stamped with the session's
|
|
850
|
+
* conversation, the mapped role, the turn text, the session id, and the owning user.
|
|
851
|
+
*
|
|
852
|
+
* @returns The boolean save result. On failure it logs the session, the write user and the
|
|
853
|
+
* reason from {@link describeSaveFailure}.
|
|
854
|
+
*/
|
|
834
855
|
private persistTranscriptTurn;
|
|
835
856
|
/**
|
|
836
857
|
* CORRECTION persistence (the client transcript's `ReplacesPrevious` marker — e.g.
|
|
@@ -851,6 +872,23 @@ export declare class RealtimeClientSessionResolver extends ResolverBase {
|
|
|
851
872
|
* Stored as stable facts (Role: 'AI', HiddenToUser: true, ExternalID: callId, CompletionTime: durationMs,
|
|
852
873
|
* Message: JSON-serialized tool facts) so that session review can reconstruct the action card dynamically
|
|
853
874
|
* on load (Option 1) without polluting user-facing speech chat bubbles.
|
|
875
|
+
*
|
|
876
|
+
* Writes as the CALLER, never the elevated run user (issue #4791). Owning the session
|
|
877
|
+
* (`loadOwnedActiveSession`'s gate has already run on every path here) does NOT imply owning
|
|
878
|
+
* the conversation: the conversation id was client-supplied at session start. What authorizes
|
|
879
|
+
* this write is the save itself, evaluated for the caller — the conversation owner gate in
|
|
880
|
+
* `MJConversationDetailEntityExtended`, plus the caller's own entity permission and Create RLS
|
|
881
|
+
* on `MJ: Conversation Details` (for the magic-link role that RLS scopes by the invite's
|
|
882
|
+
* `ScopeResourceID`, and the role belongs to a downstream app, not MJ core). That is why
|
|
883
|
+
* writing as the caller is safe even though the conversation id originated client-side.
|
|
884
|
+
* Elevating to the System user would bypass RLS entirely, and the owner gate refuses it anyway
|
|
885
|
+
* because the System user is not the conversation owner. Measured on MJ#4791 (before the
|
|
886
|
+
* core-entities fix that now records the denial): `Save()` returned `false` with a NULL `LatestResult` and an empty
|
|
887
|
+
* `ResultHistory` — indistinguishable from any other silent failure. Elevating this write is
|
|
888
|
+
* what silently dropped both hidden tool-execution turns of a real magic-link session; the
|
|
889
|
+
* denial itself still happens today, only its silence was fixed separately.
|
|
890
|
+
* `ResolveScopedAnonymousRunUser` elevates AI-**run**-entity writes only (prompt runs, agent
|
|
891
|
+
* runs, the relayed dispatch itself) — never this one.
|
|
854
892
|
*/
|
|
855
893
|
private persistDirectActionTurn;
|
|
856
894
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RealtimeClientSessionResolver.d.ts","sourceRoot":"","sources":["../../src/resolvers/RealtimeClientSessionResolver.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"RealtimeClientSessionResolver.d.ts","sourceRoot":"","sources":["../../src/resolvers/RealtimeClientSessionResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -270,6 +270,30 @@ let RealtimeClientSessionResolver = class RealtimeClientSessionResolver extends
|
|
|
270
270
|
this.clientSessionService = new RealtimeClientSessionService();
|
|
271
271
|
this.sessionManager = new SessionManager(this.clientSessionService);
|
|
272
272
|
}
|
|
273
|
+
/**
|
|
274
|
+
* The reason a `Save()`/`Delete()` returned false, for a log line. `CompleteMessage` renders
|
|
275
|
+
* `Message`, `Error` and every `Errors[]` entry (validation errors included, since `Save()`
|
|
276
|
+
* runs `Validate()` and records its errors there), so there is no separate `Validate()` call.
|
|
277
|
+
* When a subclass refused the write without recording anything, say so explicitly instead of
|
|
278
|
+
* "unknown error", which is what hid MJ#4791.
|
|
279
|
+
*
|
|
280
|
+
* Only a NULL `LatestResult` proves the refusal happened before the provider (nothing was
|
|
281
|
+
* registered at all). A SUCCESS `LatestResult` is an earlier save on the same instance — the
|
|
282
|
+
* refusal registered nothing — so its text must never be reported as this failure's reason.
|
|
283
|
+
*/
|
|
284
|
+
describeSaveFailure(entity) {
|
|
285
|
+
const latest = entity.LatestResult;
|
|
286
|
+
if (!latest) {
|
|
287
|
+
return `no failure detail recorded (LatestResult null; ResultHistory length ${entity.ResultHistory.length}) ` +
|
|
288
|
+
'— the write was refused before reaching the provider';
|
|
289
|
+
}
|
|
290
|
+
if (latest.Success) {
|
|
291
|
+
return 'no failure detail recorded (latest result entry is a prior success; ' +
|
|
292
|
+
`ResultHistory length ${entity.ResultHistory.length})`;
|
|
293
|
+
}
|
|
294
|
+
const detail = latest.CompleteMessage?.trim();
|
|
295
|
+
return detail || `no failure detail recorded (LatestResult empty; ResultHistory length ${entity.ResultHistory.length})`;
|
|
296
|
+
}
|
|
273
297
|
/**
|
|
274
298
|
* Start a client-direct realtime voice session targeting `targetAgentId`.
|
|
275
299
|
*
|
|
@@ -421,7 +445,9 @@ let RealtimeClientSessionResolver = class RealtimeClientSessionResolver extends
|
|
|
421
445
|
// Junction-link any artifacts the delegated run produced into the session's conversation
|
|
422
446
|
// history (best-effort) — so chat, session review, and resume carryover can all see them.
|
|
423
447
|
// Runs as `runUser`: the junction entity is not among an anonymous caller's relay grants.
|
|
424
|
-
|
|
448
|
+
// The hidden anchor detail it may need to create, though, is written by the CALLER (#4791)
|
|
449
|
+
// — same reason `persistDirectActionTurn` is: the System user is not the conversation owner.
|
|
450
|
+
await this.linkDelegatedArtifactsToConversation(session, Artifacts, runUser, contextUser, provider);
|
|
425
451
|
await this.sessionManager.Heartbeat(agentSessionId, contextUser, provider);
|
|
426
452
|
return ResultJson;
|
|
427
453
|
}
|
|
@@ -472,7 +498,7 @@ let RealtimeClientSessionResolver = class RealtimeClientSessionResolver extends
|
|
|
472
498
|
};
|
|
473
499
|
session.Config_ = JSON.stringify(next);
|
|
474
500
|
if (!(await session.Save())) {
|
|
475
|
-
LogError(`RealtimeClientSessionResolver.updatePendingFeedbackRunID save failed
|
|
501
|
+
LogError(`RealtimeClientSessionResolver.updatePendingFeedbackRunID save failed for session ${session.ID}: ${this.describeSaveFailure(session)}`);
|
|
476
502
|
}
|
|
477
503
|
}
|
|
478
504
|
/**
|
|
@@ -1378,7 +1404,7 @@ let RealtimeClientSessionResolver = class RealtimeClientSessionResolver extends
|
|
|
1378
1404
|
session.Config_ = JSON.stringify(config);
|
|
1379
1405
|
const saved = await session.Save();
|
|
1380
1406
|
if (!saved) {
|
|
1381
|
-
LogError(`RealtimeClientSessionResolver.persistObservabilityRunIDs save failed
|
|
1407
|
+
LogError(`RealtimeClientSessionResolver.persistObservabilityRunIDs save failed for session ${session.ID}: ${this.describeSaveFailure(session)}`);
|
|
1382
1408
|
}
|
|
1383
1409
|
}
|
|
1384
1410
|
/**
|
|
@@ -1462,7 +1488,7 @@ let RealtimeClientSessionResolver = class RealtimeClientSessionResolver extends
|
|
|
1462
1488
|
const saved = await row.Save();
|
|
1463
1489
|
if (!saved) {
|
|
1464
1490
|
LogError(`SaveSessionChannelState: save failed for session ${agentSessionID} / channel ${channelID}: ` +
|
|
1465
|
-
`${row
|
|
1491
|
+
`${this.describeSaveFailure(row)}`);
|
|
1466
1492
|
}
|
|
1467
1493
|
return saved;
|
|
1468
1494
|
}
|
|
@@ -1765,7 +1791,7 @@ let RealtimeClientSessionResolver = class RealtimeClientSessionResolver extends
|
|
|
1765
1791
|
artifact.UserID = contextUser.ID;
|
|
1766
1792
|
artifact.Visibility = 'Always';
|
|
1767
1793
|
if (!(await artifact.Save())) {
|
|
1768
|
-
const message = `SaveSessionChannelArtifact: artifact save failed: ${artifact
|
|
1794
|
+
const message = `SaveSessionChannelArtifact: artifact save failed for session ${session.ID}: ${this.describeSaveFailure(artifact)}`;
|
|
1769
1795
|
LogError(message);
|
|
1770
1796
|
return { Success: false, ErrorMessage: message, ConversationDetailLinked: false };
|
|
1771
1797
|
}
|
|
@@ -1776,7 +1802,7 @@ let RealtimeClientSessionResolver = class RealtimeClientSessionResolver extends
|
|
|
1776
1802
|
version.Content = contentJson;
|
|
1777
1803
|
version.UserID = contextUser.ID;
|
|
1778
1804
|
if (!(await version.Save())) {
|
|
1779
|
-
const message = `SaveSessionChannelArtifact: artifact version save failed
|
|
1805
|
+
const message = `SaveSessionChannelArtifact: artifact version save failed for session ${session.ID} (artifact ${artifact.ID}): ${this.describeSaveFailure(version)}`;
|
|
1780
1806
|
LogError(message);
|
|
1781
1807
|
return { Success: false, ErrorMessage: message, ArtifactID: artifact.ID, ConversationDetailLinked: false };
|
|
1782
1808
|
}
|
|
@@ -1826,21 +1852,29 @@ let RealtimeClientSessionResolver = class RealtimeClientSessionResolver extends
|
|
|
1826
1852
|
* queries (which scan junctions across ALL details) still surface the artifact. This is the
|
|
1827
1853
|
* least-invasive correct anchor — no fake visible message, no orphaned artifact.
|
|
1828
1854
|
*
|
|
1855
|
+
* TWO PRINCIPALS, deliberately: the lookup (`findLatestSessionDetailID`) and the junction row
|
|
1856
|
+
* itself (`saveDetailArtifactJunction`, `MJ: Conversation Detail Artifacts`) run as `runUser`
|
|
1857
|
+
* (elevated for a scoped-anonymous caller) — that junction entity is outside an anonymous
|
|
1858
|
+
* caller's relay grants. The hidden ANCHOR `Conversation Detail` this may need to create runs as
|
|
1859
|
+
* `callerUser` instead: like every other `MJ: Conversation Details` write, the System user is
|
|
1860
|
+
* refused because it is not the conversation's owner (see {@link persistDirectActionTurn},
|
|
1861
|
+
* issue #4791) — only the actual caller can create it.
|
|
1862
|
+
*
|
|
1829
1863
|
* Strictly best-effort: every failure path logs and returns; a relayed tool call NEVER fails
|
|
1830
1864
|
* because history linking did.
|
|
1831
1865
|
*/
|
|
1832
|
-
async linkDelegatedArtifactsToConversation(session, artifacts,
|
|
1866
|
+
async linkDelegatedArtifactsToConversation(session, artifacts, runUser, callerUser, provider) {
|
|
1833
1867
|
if (!artifacts || artifacts.length === 0 || !session.ConversationID) {
|
|
1834
1868
|
return;
|
|
1835
1869
|
}
|
|
1836
1870
|
try {
|
|
1837
|
-
const detailID = (await this.findLatestSessionDetailID(session,
|
|
1838
|
-
(await this.createHiddenSessionAnchorDetail(session,
|
|
1871
|
+
const detailID = (await this.findLatestSessionDetailID(session, runUser, provider)) ??
|
|
1872
|
+
(await this.createHiddenSessionAnchorDetail(session, callerUser, provider));
|
|
1839
1873
|
if (!detailID) {
|
|
1840
1874
|
return; // anchor unavailable — logged in the helpers
|
|
1841
1875
|
}
|
|
1842
1876
|
for (const artifact of artifacts) {
|
|
1843
|
-
await this.saveDetailArtifactJunction(detailID, artifact.ArtifactVersionID,
|
|
1877
|
+
await this.saveDetailArtifactJunction(detailID, artifact.ArtifactVersionID, runUser, provider);
|
|
1844
1878
|
}
|
|
1845
1879
|
}
|
|
1846
1880
|
catch (error) {
|
|
@@ -1871,22 +1905,22 @@ let RealtimeClientSessionResolver = class RealtimeClientSessionResolver extends
|
|
|
1871
1905
|
* {@link linkDelegatedArtifactsToConversation}). Returns the new detail's id, or `null`
|
|
1872
1906
|
* (logged) when the save fails.
|
|
1873
1907
|
*/
|
|
1874
|
-
async createHiddenSessionAnchorDetail(session,
|
|
1875
|
-
const detail = await provider.GetEntityObject(CONVERSATION_DETAIL_ENTITY,
|
|
1908
|
+
async createHiddenSessionAnchorDetail(session, callerUser, provider) {
|
|
1909
|
+
const detail = await provider.GetEntityObject(CONVERSATION_DETAIL_ENTITY, callerUser);
|
|
1876
1910
|
detail.NewRecord();
|
|
1877
1911
|
detail.ConversationID = session.ConversationID;
|
|
1878
1912
|
detail.Role = 'AI';
|
|
1879
1913
|
detail.HiddenToUser = true;
|
|
1880
1914
|
detail.Message = 'Artifacts produced during a realtime session (system anchor).';
|
|
1881
1915
|
detail.AgentSessionID = session.ID;
|
|
1882
|
-
// Attribute
|
|
1883
|
-
//
|
|
1916
|
+
// Attribute to the SESSION owner — the caller writing this row, whose ownership
|
|
1917
|
+
// `loadOwnedActiveSession` already proved.
|
|
1884
1918
|
detail.UserID = session.UserID;
|
|
1885
1919
|
if (await detail.Save()) {
|
|
1886
1920
|
return detail.ID;
|
|
1887
1921
|
}
|
|
1888
1922
|
LogError(`ExecuteRealtimeSessionTool: hidden anchor detail save failed for session ${session.ID}: ` +
|
|
1889
|
-
`${detail
|
|
1923
|
+
`${this.describeSaveFailure(detail)}`);
|
|
1890
1924
|
return null;
|
|
1891
1925
|
}
|
|
1892
1926
|
/**
|
|
@@ -1902,7 +1936,7 @@ let RealtimeClientSessionResolver = class RealtimeClientSessionResolver extends
|
|
|
1902
1936
|
const saved = await junction.Save();
|
|
1903
1937
|
if (!saved) {
|
|
1904
1938
|
LogError(`RealtimeClientSessionResolver: artifact junction save failed for detail ${conversationDetailID} / version ${artifactVersionID}: ` +
|
|
1905
|
-
`${junction
|
|
1939
|
+
`${this.describeSaveFailure(junction)}`);
|
|
1906
1940
|
}
|
|
1907
1941
|
return saved;
|
|
1908
1942
|
}
|
|
@@ -1931,7 +1965,7 @@ let RealtimeClientSessionResolver = class RealtimeClientSessionResolver extends
|
|
|
1931
1965
|
row.LastActiveAt = new Date();
|
|
1932
1966
|
if (!(await row.Save())) {
|
|
1933
1967
|
LogError(`SaveSessionChannelArtifact: LastActiveAt stamp failed for session ${agentSessionID} / channel ${channelID}: ` +
|
|
1934
|
-
`${row
|
|
1968
|
+
`${this.describeSaveFailure(row)}`);
|
|
1935
1969
|
}
|
|
1936
1970
|
}
|
|
1937
1971
|
catch (error) {
|
|
@@ -2064,12 +2098,6 @@ let RealtimeClientSessionResolver = class RealtimeClientSessionResolver extends
|
|
|
2064
2098
|
const minutes = elevation?.Widget.VoiceMaxSessionMinutes;
|
|
2065
2099
|
return minutes && minutes > 0 ? minutes * 60 : undefined;
|
|
2066
2100
|
}
|
|
2067
|
-
/**
|
|
2068
|
-
* Persists a single transcript turn as a `Conversation Detail` stamped with the session's
|
|
2069
|
-
* conversation, the mapped role, the turn text, the session id, and the owning user.
|
|
2070
|
-
*
|
|
2071
|
-
* @returns The boolean save result (logs `CompleteMessage` on failure).
|
|
2072
|
-
*/
|
|
2073
2101
|
/**
|
|
2074
2102
|
* Stamps `RecordingStartedAt` (the recording `t0` alignment origin) + `RecordingMedia` on a
|
|
2075
2103
|
* just-started session when the browser captured WITH consent. Best-effort: a parse/save failure
|
|
@@ -2091,9 +2119,16 @@ let RealtimeClientSessionResolver = class RealtimeClientSessionResolver extends
|
|
|
2091
2119
|
session.RecordingStartedAt = startedAt;
|
|
2092
2120
|
session.RecordingMedia = 'Audio';
|
|
2093
2121
|
if (!(await session.Save())) {
|
|
2094
|
-
LogError(`RealtimeClientSessionResolver.stampRecordingStart save failed
|
|
2122
|
+
LogError(`RealtimeClientSessionResolver.stampRecordingStart save failed for session ${session.ID}: ${this.describeSaveFailure(session)}`);
|
|
2095
2123
|
}
|
|
2096
2124
|
}
|
|
2125
|
+
/**
|
|
2126
|
+
* Persists a single transcript turn as a `Conversation Detail` stamped with the session's
|
|
2127
|
+
* conversation, the mapped role, the turn text, the session id, and the owning user.
|
|
2128
|
+
*
|
|
2129
|
+
* @returns The boolean save result. On failure it logs the session, the write user and the
|
|
2130
|
+
* reason from {@link describeSaveFailure}.
|
|
2131
|
+
*/
|
|
2097
2132
|
async persistTranscriptTurn(session, role, text, contextUser, provider, utteranceStartMs, utteranceEndMs) {
|
|
2098
2133
|
const detail = await provider.GetEntityObject(CONVERSATION_DETAIL_ENTITY, contextUser);
|
|
2099
2134
|
detail.NewRecord();
|
|
@@ -2110,7 +2145,7 @@ let RealtimeClientSessionResolver = class RealtimeClientSessionResolver extends
|
|
|
2110
2145
|
}
|
|
2111
2146
|
const saved = await detail.Save();
|
|
2112
2147
|
if (!saved) {
|
|
2113
|
-
LogError(`RealtimeClientSessionResolver.persistTranscriptTurn save failed
|
|
2148
|
+
LogError(`RealtimeClientSessionResolver.persistTranscriptTurn save failed for session ${session.ID} (write user ${contextUser.ID}): ${this.describeSaveFailure(detail)}`);
|
|
2114
2149
|
}
|
|
2115
2150
|
return saved;
|
|
2116
2151
|
}
|
|
@@ -2141,8 +2176,13 @@ let RealtimeClientSessionResolver = class RealtimeClientSessionResolver extends
|
|
|
2141
2176
|
// ⚠️ ELEVATING INSTEAD WAS TRIED AND IS A TRAP. `ResolveScopedAnonymousRunUser` returns
|
|
2142
2177
|
// `UserCache.GetSystemUser()`, which on this deployment resolves to the unconfigured
|
|
2143
2178
|
// placeholder `not.set@nowhere.com` ("Configured provisioning user not found; falling back
|
|
2144
|
-
// to an Owner").
|
|
2145
|
-
//
|
|
2179
|
+
// to an Owner"). That user EXISTS — it is not a missing/invalid principal — and even carries
|
|
2180
|
+
// full CRUD on `MJ: Conversation Details`. It is refused anyway:
|
|
2181
|
+
// `MJConversationDetailEntityExtended`'s owner gate accepts only the conversation's OWNER or
|
|
2182
|
+
// an Edit/Owner Resource Permission grantee, and the System user is neither. Measured on
|
|
2183
|
+
// MJ#4791 (before the core-entities fix that now records the denial): `Save()` → `false`,
|
|
2184
|
+
// `LatestResult` null — indistinguishable from a permission denial, and just as silent. The
|
|
2185
|
+
// denial itself still happens; that fix only made it stop being silent.
|
|
2146
2186
|
const writeUser = contextUser;
|
|
2147
2187
|
const rv = RunView.FromMetadataProvider(provider);
|
|
2148
2188
|
const result = await rv.RunView({
|
|
@@ -2160,8 +2200,8 @@ let RealtimeClientSessionResolver = class RealtimeClientSessionResolver extends
|
|
|
2160
2200
|
//
|
|
2161
2201
|
// `ResultType: 'entity_object'` hands back hydrated entities, but they do not carry the
|
|
2162
2202
|
// context user the way `GetEntityObject(entity, user)` does — so `Save()` ran with no
|
|
2163
|
-
// principal and failed with an EMPTY message ("unknown error"), which is what
|
|
2164
|
-
//
|
|
2203
|
+
// principal and failed with an EMPTY message ("unknown error"), which is what an empty-message
|
|
2204
|
+
// failure here looked like before the re-load. The insert path beside this one has
|
|
2165
2205
|
// always used `GetEntityObject`; this now matches it, which is also why they now succeed
|
|
2166
2206
|
// and fail for the same reasons.
|
|
2167
2207
|
const previous = await provider.GetEntityObject(CONVERSATION_DETAIL_ENTITY, writeUser);
|
|
@@ -2187,7 +2227,7 @@ let RealtimeClientSessionResolver = class RealtimeClientSessionResolver extends
|
|
|
2187
2227
|
LogError(`RealtimeClientSessionResolver.replacePreviousTranscriptTurn save failed for session `
|
|
2188
2228
|
+ `${session.ID} — the ${mappedRole} turn keeps its PREVIOUS, shorter text and the `
|
|
2189
2229
|
+ `transcript now understates what was said: `
|
|
2190
|
-
+ `${
|
|
2230
|
+
+ `${this.describeSaveFailure(previous)}`);
|
|
2191
2231
|
}
|
|
2192
2232
|
return saved;
|
|
2193
2233
|
}
|
|
@@ -2204,14 +2244,30 @@ let RealtimeClientSessionResolver = class RealtimeClientSessionResolver extends
|
|
|
2204
2244
|
* Stored as stable facts (Role: 'AI', HiddenToUser: true, ExternalID: callId, CompletionTime: durationMs,
|
|
2205
2245
|
* Message: JSON-serialized tool facts) so that session review can reconstruct the action card dynamically
|
|
2206
2246
|
* on load (Option 1) without polluting user-facing speech chat bubbles.
|
|
2247
|
+
*
|
|
2248
|
+
* Writes as the CALLER, never the elevated run user (issue #4791). Owning the session
|
|
2249
|
+
* (`loadOwnedActiveSession`'s gate has already run on every path here) does NOT imply owning
|
|
2250
|
+
* the conversation: the conversation id was client-supplied at session start. What authorizes
|
|
2251
|
+
* this write is the save itself, evaluated for the caller — the conversation owner gate in
|
|
2252
|
+
* `MJConversationDetailEntityExtended`, plus the caller's own entity permission and Create RLS
|
|
2253
|
+
* on `MJ: Conversation Details` (for the magic-link role that RLS scopes by the invite's
|
|
2254
|
+
* `ScopeResourceID`, and the role belongs to a downstream app, not MJ core). That is why
|
|
2255
|
+
* writing as the caller is safe even though the conversation id originated client-side.
|
|
2256
|
+
* Elevating to the System user would bypass RLS entirely, and the owner gate refuses it anyway
|
|
2257
|
+
* because the System user is not the conversation owner. Measured on MJ#4791 (before the
|
|
2258
|
+
* core-entities fix that now records the denial): `Save()` returned `false` with a NULL `LatestResult` and an empty
|
|
2259
|
+
* `ResultHistory` — indistinguishable from any other silent failure. Elevating this write is
|
|
2260
|
+
* what silently dropped both hidden tool-execution turns of a real magic-link session; the
|
|
2261
|
+
* denial itself still happens today, only its silence was fixed separately.
|
|
2262
|
+
* `ResolveScopedAnonymousRunUser` elevates AI-**run**-entity writes only (prompt runs, agent
|
|
2263
|
+
* runs, the relayed dispatch itself) — never this one.
|
|
2207
2264
|
*/
|
|
2208
2265
|
async persistDirectActionTurn(session, callId, toolName, argsJson, resultJson, durationMs, contextUser, provider) {
|
|
2209
2266
|
if (!session.ConversationID) {
|
|
2210
2267
|
return false;
|
|
2211
2268
|
}
|
|
2212
2269
|
try {
|
|
2213
|
-
const
|
|
2214
|
-
const detail = await provider.GetEntityObject(CONVERSATION_DETAIL_ENTITY, writeUser);
|
|
2270
|
+
const detail = await provider.GetEntityObject(CONVERSATION_DETAIL_ENTITY, contextUser);
|
|
2215
2271
|
detail.NewRecord();
|
|
2216
2272
|
detail.ConversationID = session.ConversationID;
|
|
2217
2273
|
detail.Role = 'AI';
|
|
@@ -2249,13 +2305,13 @@ let RealtimeClientSessionResolver = class RealtimeClientSessionResolver extends
|
|
|
2249
2305
|
detail.Message = JSON.stringify(factPayload);
|
|
2250
2306
|
const saved = await detail.Save();
|
|
2251
2307
|
if (!saved) {
|
|
2252
|
-
LogError(`RealtimeClientSessionResolver.persistDirectActionTurn save failed
|
|
2308
|
+
LogError(`RealtimeClientSessionResolver.persistDirectActionTurn save failed for session ${session.ID} (tool '${toolName}', call ${callId ?? 'n/a'}, write user ${contextUser.ID}): ${this.describeSaveFailure(detail)}`);
|
|
2253
2309
|
}
|
|
2254
2310
|
return saved;
|
|
2255
2311
|
}
|
|
2256
2312
|
catch (error) {
|
|
2257
2313
|
const message = error instanceof Error ? error.message : String(error);
|
|
2258
|
-
LogError(`RealtimeClientSessionResolver.persistDirectActionTurn unexpected error: ${message}`);
|
|
2314
|
+
LogError(`RealtimeClientSessionResolver.persistDirectActionTurn unexpected error for session ${session.ID}: ${message}`);
|
|
2259
2315
|
return false;
|
|
2260
2316
|
}
|
|
2261
2317
|
}
|