@memberjunction/ai-agents 6.2.0-edge.2 → 6.2.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/README.md +6 -0
- package/dist/AgentDecisionService.d.ts +8 -1
- package/dist/AgentDecisionService.d.ts.map +1 -1
- package/dist/AgentDecisionService.js +4 -0
- package/dist/AgentDecisionService.js.map +1 -1
- package/dist/AgentRunner.d.ts +51 -2
- package/dist/AgentRunner.d.ts.map +1 -1
- package/dist/AgentRunner.js +121 -23
- package/dist/AgentRunner.js.map +1 -1
- package/dist/ConversationCompactionManager.d.ts +9 -1
- package/dist/ConversationCompactionManager.d.ts.map +1 -1
- package/dist/ConversationCompactionManager.js +6 -3
- package/dist/ConversationCompactionManager.js.map +1 -1
- package/dist/ConversationToolManager.d.ts +13 -2
- package/dist/ConversationToolManager.d.ts.map +1 -1
- package/dist/ConversationToolManager.js +19 -3
- package/dist/ConversationToolManager.js.map +1 -1
- package/dist/KnowledgeAgent.d.ts.map +1 -1
- package/dist/KnowledgeAgent.js +6 -1
- package/dist/KnowledgeAgent.js.map +1 -1
- package/dist/MJAIAgentRequestEntityServer.d.ts +6 -0
- package/dist/MJAIAgentRequestEntityServer.d.ts.map +1 -1
- package/dist/MJAIAgentRequestEntityServer.js +26 -1
- package/dist/MJAIAgentRequestEntityServer.js.map +1 -1
- package/dist/PayloadFeedbackManager.d.ts +3 -0
- package/dist/PayloadFeedbackManager.d.ts.map +1 -1
- package/dist/PayloadFeedbackManager.js +2 -1
- package/dist/PayloadFeedbackManager.js.map +1 -1
- package/dist/agent-run-watchdog.d.ts +65 -5
- package/dist/agent-run-watchdog.d.ts.map +1 -1
- package/dist/agent-run-watchdog.js +143 -28
- package/dist/agent-run-watchdog.js.map +1 -1
- package/dist/agent-types/loop-agent-prompt-params.d.ts +7 -0
- package/dist/agent-types/loop-agent-prompt-params.d.ts.map +1 -1
- package/dist/agent-types/loop-agent-prompt-params.js +1 -0
- package/dist/agent-types/loop-agent-prompt-params.js.map +1 -1
- package/dist/agent-types/loop-agent-type.d.ts +20 -0
- package/dist/agent-types/loop-agent-type.d.ts.map +1 -1
- package/dist/agent-types/loop-agent-type.js +73 -2
- package/dist/agent-types/loop-agent-type.js.map +1 -1
- package/dist/artifact-tools/SearchResultSetToolLibrary.js +4 -4
- package/dist/artifact-tools/SearchResultSetToolLibrary.js.map +1 -1
- package/dist/base-agent.d.ts +310 -26
- package/dist/base-agent.d.ts.map +1 -1
- package/dist/base-agent.js +867 -244
- package/dist/base-agent.js.map +1 -1
- package/dist/client-tool-results.d.ts +45 -0
- package/dist/client-tool-results.d.ts.map +1 -0
- package/dist/client-tool-results.js +94 -0
- package/dist/client-tool-results.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/native-tools/action-tool-builder.d.ts +14 -0
- package/dist/native-tools/action-tool-builder.d.ts.map +1 -1
- package/dist/native-tools/action-tool-builder.js +62 -7
- package/dist/native-tools/action-tool-builder.js.map +1 -1
- package/dist/native-tools/control-tools.d.ts +17 -1
- package/dist/native-tools/control-tools.d.ts.map +1 -1
- package/dist/native-tools/control-tools.js +40 -3
- package/dist/native-tools/control-tools.js.map +1 -1
- package/dist/prior-turn-tool-result-cache.d.ts +31 -12
- package/dist/prior-turn-tool-result-cache.d.ts.map +1 -1
- package/dist/prior-turn-tool-result-cache.js +59 -16
- package/dist/prior-turn-tool-result-cache.js.map +1 -1
- package/dist/realtime/bridge-host-params.d.ts +22 -0
- package/dist/realtime/bridge-host-params.d.ts.map +1 -0
- package/dist/realtime/bridge-host-params.js +53 -0
- package/dist/realtime/bridge-host-params.js.map +1 -0
- package/dist/realtime/bridge-realtime-session-factory.d.ts +63 -3
- package/dist/realtime/bridge-realtime-session-factory.d.ts.map +1 -1
- package/dist/realtime/bridge-realtime-session-factory.js +83 -22
- package/dist/realtime/bridge-realtime-session-factory.js.map +1 -1
- package/dist/realtime/bridge-realtime-usage-recorder.d.ts +81 -0
- package/dist/realtime/bridge-realtime-usage-recorder.d.ts.map +1 -0
- package/dist/realtime/bridge-realtime-usage-recorder.js +194 -0
- package/dist/realtime/bridge-realtime-usage-recorder.js.map +1 -0
- package/dist/realtime/bridge-session-transcript-sink.d.ts +37 -0
- package/dist/realtime/bridge-session-transcript-sink.d.ts.map +1 -0
- package/dist/realtime/bridge-session-transcript-sink.js +58 -0
- package/dist/realtime/bridge-session-transcript-sink.js.map +1 -0
- package/dist/realtime/client-only-channel-server.d.ts +83 -0
- package/dist/realtime/client-only-channel-server.d.ts.map +1 -0
- package/dist/realtime/client-only-channel-server.js +107 -0
- package/dist/realtime/client-only-channel-server.js.map +1 -0
- package/dist/realtime/identity-verification-channel-server.d.ts +50 -0
- package/dist/realtime/identity-verification-channel-server.d.ts.map +1 -0
- package/dist/realtime/identity-verification-channel-server.js +66 -0
- package/dist/realtime/identity-verification-channel-server.js.map +1 -0
- package/dist/realtime/interactive-component-channel-server.d.ts +39 -0
- package/dist/realtime/interactive-component-channel-server.d.ts.map +1 -0
- package/dist/realtime/interactive-component-channel-server.js +55 -0
- package/dist/realtime/interactive-component-channel-server.js.map +1 -0
- package/dist/realtime/realtime-avatar-resolution.d.ts +194 -0
- package/dist/realtime/realtime-avatar-resolution.d.ts.map +1 -0
- package/dist/realtime/realtime-avatar-resolution.js +208 -0
- package/dist/realtime/realtime-avatar-resolution.js.map +1 -0
- package/dist/realtime/realtime-channel-policy.d.ts +81 -0
- package/dist/realtime/realtime-channel-policy.d.ts.map +1 -0
- package/dist/realtime/realtime-channel-policy.js +91 -0
- package/dist/realtime/realtime-channel-policy.js.map +1 -0
- package/dist/realtime/realtime-channel-server-host.d.ts +14 -0
- package/dist/realtime/realtime-channel-server-host.d.ts.map +1 -1
- package/dist/realtime/realtime-channel-server-host.js +35 -0
- package/dist/realtime/realtime-channel-server-host.js.map +1 -1
- package/dist/realtime/realtime-client-session-service.d.ts +493 -30
- package/dist/realtime/realtime-client-session-service.d.ts.map +1 -1
- package/dist/realtime/realtime-client-session-service.js +825 -98
- package/dist/realtime/realtime-client-session-service.js.map +1 -1
- package/dist/realtime/realtime-coagent-config.d.ts +94 -15
- package/dist/realtime/realtime-coagent-config.d.ts.map +1 -1
- package/dist/realtime/realtime-coagent-config.js +109 -4
- package/dist/realtime/realtime-coagent-config.js.map +1 -1
- package/dist/realtime/realtime-coagent-resolution.d.ts +90 -0
- package/dist/realtime/realtime-coagent-resolution.d.ts.map +1 -0
- package/dist/realtime/realtime-coagent-resolution.js +186 -0
- package/dist/realtime/realtime-coagent-resolution.js.map +1 -0
- package/dist/realtime/realtime-delegation-narrator.d.ts +97 -0
- package/dist/realtime/realtime-delegation-narrator.d.ts.map +1 -0
- package/dist/realtime/realtime-delegation-narrator.js +162 -0
- package/dist/realtime/realtime-delegation-narrator.js.map +1 -0
- package/dist/realtime/realtime-recording-store.d.ts +136 -16
- package/dist/realtime/realtime-recording-store.d.ts.map +1 -1
- package/dist/realtime/realtime-recording-store.js +505 -39
- package/dist/realtime/realtime-recording-store.js.map +1 -1
- package/dist/realtime/realtime-session-runner.d.ts +2 -82
- package/dist/realtime/realtime-session-runner.d.ts.map +1 -1
- package/dist/realtime/realtime-session-runner.js +16 -191
- package/dist/realtime/realtime-session-runner.js.map +1 -1
- package/dist/realtime/realtime-vendor-resolution.d.ts +9 -0
- package/dist/realtime/realtime-vendor-resolution.d.ts.map +1 -1
- package/dist/realtime/realtime-vendor-resolution.js +16 -5
- package/dist/realtime/realtime-vendor-resolution.js.map +1 -1
- package/dist/realtime/realtime-video-output-gate.d.ts +83 -0
- package/dist/realtime/realtime-video-output-gate.d.ts.map +1 -0
- package/dist/realtime/realtime-video-output-gate.js +79 -0
- package/dist/realtime/realtime-video-output-gate.js.map +1 -0
- package/dist/rubric-evaluation-agent-runner.js +17 -8
- package/dist/rubric-evaluation-agent-runner.js.map +1 -1
- package/dist/self-check.d.ts +6 -3
- package/dist/self-check.d.ts.map +1 -1
- package/dist/self-check.js +3 -3
- package/dist/self-check.js.map +1 -1
- package/dist/tool-result-format.d.ts +14 -0
- package/dist/tool-result-format.d.ts.map +1 -1
- package/dist/tool-result-format.js.map +1 -1
- package/package.json +19 -19
package/README.md
CHANGED
|
@@ -240,6 +240,12 @@ Key pieces in this package:
|
|
|
240
240
|
- **`MediaChannelServer`** (`src/realtime/media-channel-server.ts`, key `'MediaChannelServer'`) — the server channel plugin for the **Media** surface. Like the Whiteboard it canonicalizes the channel's persisted media state, and additionally resolves the agent's **media kit** at session start: it implements `IRealtimeChannelServerDataAware` to receive the session `contextUser`+`provider`, reads a per-session `mediaCollectionID` override out of `RealtimeChannelServerContext.AgentSessionConfig` (the persisted `AIAgentSession.Config_`), and feeds the model a manifest via `SendContextNote`. The kit-resolution logic is the pure, unit-tested `agent-media-library.ts` (`buildAgentMediaContextNote` / `resolveAgentMediaManifest` / `formatAgentMediaManifest`); precedence is `runtime override > AIAgent.DefaultMediaCollectionID > none`. The agent then surfaces items with the existing `Media_ShowMedia` client tool — no new client tool. `LoadMediaChannelServer()` is invoked from MJServer's `agentSessions` module. See the [Real-Time Co-Agents Guide](../../../guides/REALTIME_CO_AGENTS_GUIDE.md).
|
|
241
241
|
- **`AgentMemoryContextBuilder`** (`src/agent-memory-context-builder.ts`) — the memory/RAG injection orchestration extracted out of `BaseAgent` so the co-agent assembles the **same** notes/examples/context a loop agent does, with no duplicated logic.
|
|
242
242
|
|
|
243
|
+
- **`realtime-channel-policy.ts`** (`BuildSessionChannelPolicy`) — the **server half of channel scoping** for client-direct sessions, pure and unit-tested. At mint the browser reports its channel candidates (`channelCandidatesJson`); `RealtimeClientSessionService` matches each to its `MJ: AI Agent Channels` row *from the server's own registry* (the client's view is never trusted), folds the cascade's `realtime.channels` section (agent layers plus `Application.AgentSettings.Realtime.Channels`) through `ResolveRealtimeChannelScope`, and returns the resolved `RealtimeSessionClientPolicy` (`PrepareClientSession` → `ClientPolicy`; the resolver returns it as `ClientPolicyJson` and persists the in-scope channel keys on the session). The tools the model is told about are narrowed to match: a vetoed channel's native tools never reach the provider, an included `'opt-in'` channel's are added by name, an `'on-demand'` channel declares none (it is opened through `ContextTool`), and tools no candidate owns (the host's own) pass through. Server plugins start before the scope is known, so `RealtimeChannelServerHost.PruneSessionChannels` drops the excluded channels' server halves afterwards. Absent candidates (a client that predates scoping, or a host that mints through its own proxy) ⇒ tools used exactly as declared and no policy.
|
|
244
|
+
- **`ClientOnlyChannelServer`** (`src/realtime/client-only-channel-server.ts`, key `'ClientOnlyChannelServer'`) — the generic server half for any channel that runs entirely in the browser. `MJ: AI Agent Channels.ServerPluginClass` is `NOT NULL`, so a client-only channel (an Open App's form or game channel) sets its row's `ServerPluginClass` to this key instead of writing an empty plugin. It takes its channel name from the registry row it was resolved for (`BindChannelName`, called by `RealtimeChannelServerHost`), contributes no server tools and does not interpret or rewrite saves. It does not decide scope (resolved before any plugin exists) and cannot stop a save (the host persists whatever the client submits when a plugin returns `null`), so persistence is controlled by the client plugin's `SerializeState()`. `LoadClientOnlyChannelServer()` is invoked from MJServer's `agentSessions` module.
|
|
245
|
+
- **`InteractiveComponentChannelServer`** (`src/realtime/interactive-component-channel-server.ts`, key `'InteractiveComponentChannelServer'`) — the deliberately thin server half of the **Interactive Component** channel (`MJ: AI Agent Channels` row `InteractiveComponent`), a `ClientOnlyChannelServer` subclass that keeps its existing registry key: no server tools, and the client plugin saves no state of record, because the channel's actions are derived from the open component's spec and run in the browser. `LoadInteractiveComponentChannelServer()` is invoked from MJServer's `agentSessions` module.
|
|
246
|
+
- **Channel exposure and zero data retention.** `BuildSessionChannelPolicy` also resolves each channel's **exposure** (`min(channel ceiling, agent cap, zero-data-retention ceiling)`; the user's own choice is applied by the browser). The agent cap is `realtime.channels.config.<Key>.maxExposure`; `requireZeroDataRetentionFor: ['state' | 'pixels']` (in the realtime configuration cascade and in `Application.AgentSettings.Realtime.Channels.RequireZeroDataRetentionFor`) lowers exposure when the session model's effective configuration (`AIEngine.GetEffectiveModelConfiguration`) does not declare `Privacy.ZeroDataRetention: true`; a failed model lookup fails closed. The resolved exposure and the reasons for any downgrade ride back in `ClientPolicyJson`. Also in the realtime session tuning section: `session.unverifiedMaxSeconds` / `session.verifiedMaxSeconds` (positive integers, carried through the cascade for the session-deadline logic; never forwarded to the provider driver).
|
|
247
|
+
- **App client tools and the unified resolver.** `Application.AgentSettings.ClientTools` is now actually read by the realtime path: resolved against the tool-definition catalog and layered, through `ResolveClientTools` (`override → session → app → static`), beneath the live surface's manifest in the app-context snapshot the companion prompt renders. The agent's static `MJ: AI Agent Client Tools` junction tools ride the returned policy (so the browser can describe them) but are deliberately not added to the voice prompt — voice prompts are token-sensitive and a tool with no browser handler is noise. The app's `AgentSettings` column is parsed with `ParseAgentSettings` rather than the generated accessor.
|
|
248
|
+
|
|
243
249
|
Delegated runs link to the co-agent's run via `ParentRunID` and share the session's `AgentSessionID`, so the whole episode — session, co-agent run (with its prompt run + Timeline step), delegated runs, transcript (`ConversationDetail` rows), channel state, usage telemetry (checkpointed server-side, or relayed from the browser via `RelayRealtimeUsage`) — groups under one session record with full standard observability.
|
|
244
250
|
|
|
245
251
|
The browser-side driver layer lives in [`@memberjunction/ai-realtime-client`](../RealtimeClient/README.md); the model primitive (`BaseRealtimeModel` / `IRealtimeSession`) lives in `@memberjunction/ai`; the Angular UX (call overlay, interactive channels, the live whiteboard) lives in `@memberjunction/ng-conversations`. **The flagship guide — concept, triple-registry plugin architecture, topologies, session lifecycle, channels, narration, security — is [guides/REALTIME_CO_AGENTS_GUIDE.md](../../../guides/REALTIME_CO_AGENTS_GUIDE.md).**
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
import { UserInfo } from '@memberjunction/core';
|
|
11
11
|
import { DecisionQuestion, DecisionAnswer } from '@memberjunction/ai';
|
|
12
12
|
import { AIDecisionRunResult } from '@memberjunction/ai-prompts';
|
|
13
|
-
import { AgentDecisionAnswerSummary } from '@memberjunction/ai-core-plus';
|
|
13
|
+
import { AgentDecisionAnswerSummary, type AIPromptExecutionScope } from '@memberjunction/ai-core-plus';
|
|
14
14
|
/**
|
|
15
15
|
* Parameters for the AgentDecisionService.Ask method.
|
|
16
16
|
*/
|
|
@@ -35,6 +35,13 @@ export interface AgentDecisionAskParams {
|
|
|
35
35
|
* Optional prompt name to resolve from AIEngine. Defaults to 'Default Decision'.
|
|
36
36
|
*/
|
|
37
37
|
PromptName?: string;
|
|
38
|
+
/**
|
|
39
|
+
* The asking run's execution scope — its configuration, runtime API keys and credential scope.
|
|
40
|
+
* Without it a decision resolves no run key and, under the default scope, answers on the
|
|
41
|
+
* platform's keys inside a customer's run; under `'RuntimeOnly'` that is exactly what must not
|
|
42
|
+
* happen. `ContextUser` still names the user.
|
|
43
|
+
*/
|
|
44
|
+
ExecutionScope?: AIPromptExecutionScope;
|
|
38
45
|
/**
|
|
39
46
|
* Optional cancellation token to abort execution.
|
|
40
47
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentDecisionService.d.ts","sourceRoot":"","sources":["../src/AgentDecisionService.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAsC,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACrG,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"AgentDecisionService.d.ts","sourceRoot":"","sources":["../src/AgentDecisionService.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAsC,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACrG,OAAO,EAAE,0BAA0B,EAA4B,KAAK,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAEjI;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC;;OAEG;IACH,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAExC;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAE5C;;OAEG;IACH,WAAW,EAAE,QAAQ,CAAC;IAEtB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,sBAAsB,CAAC;IAExC;;OAEG;IACH,iBAAiB,CAAC,EAAE,WAAW,CAAC;CACnC;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACpC,gGAAgG;IAChG,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAE5C,4FAA4F;IAC5F,OAAO,EAAE,MAAM,EAAE,CAAC;CACrB;AAqBD;;GAEG;AACH,qBAAa,oBAAoB;IAC7B;;OAEG;IACH,gBAAuB,mBAAmB,sBAAsB;IAEhE;;;OAGG;IACU,GAAG,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAkC5E;;;;OAIG;WACW,mBAAmB,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,uBAAuB;IAa9F,uDAAuD;IACvD,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAmBjC,sFAAsF;IACtF,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAc/B,yEAAyE;IACzE,OAAO,CAAC,MAAM,CAAC,eAAe;IAO9B;;OAEG;WACW,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC;CAyBtH"}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { AIEngine } from '@memberjunction/aiengine';
|
|
11
11
|
import { AIDecisionRunner, AIDecisionParams } from '@memberjunction/ai-prompts';
|
|
12
|
+
import { PickPromptExecutionScope } from '@memberjunction/ai-core-plus';
|
|
12
13
|
/** A plain object, as opposed to null, an array or a primitive. */
|
|
13
14
|
function isPlainObject(value) {
|
|
14
15
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
@@ -49,6 +50,9 @@ export class AgentDecisionService {
|
|
|
49
50
|
};
|
|
50
51
|
}
|
|
51
52
|
const params = new AIDecisionParams();
|
|
53
|
+
if (args.ExecutionScope) {
|
|
54
|
+
Object.assign(params, PickPromptExecutionScope(args.ExecutionScope));
|
|
55
|
+
}
|
|
52
56
|
params.prompt = prompt;
|
|
53
57
|
params.contextUser = args.ContextUser;
|
|
54
58
|
params.State = args.State;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentDecisionService.js","sourceRoot":"","sources":["../src/AgentDecisionService.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAGpD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAuB,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"AgentDecisionService.js","sourceRoot":"","sources":["../src/AgentDecisionService.ts"],"names":[],"mappings":"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"}
|
package/dist/AgentRunner.d.ts
CHANGED
|
@@ -51,6 +51,18 @@ export declare function selectPrimaryArtifact(fileArtifacts: readonly CreatedArt
|
|
|
51
51
|
* ```
|
|
52
52
|
*/
|
|
53
53
|
export declare class AgentRunner {
|
|
54
|
+
/**
|
|
55
|
+
* The status and message the agent's reply detail ends with, from the run's result.
|
|
56
|
+
*
|
|
57
|
+
* A run the user stopped is not an error: its reply is marked Complete with a short "stopped"
|
|
58
|
+
* message, so the chat shows a quiet end rather than a red failure, and the run row (Cancelled,
|
|
59
|
+
* with its reason and the payload as it stood) carries the detail. Every other outcome keeps the
|
|
60
|
+
* long-standing mapping: the run's message when it wrote one, else Completed or the error.
|
|
61
|
+
*/
|
|
62
|
+
static ResolveFinalDetailState(agentResult: ExecuteAgentResult): {
|
|
63
|
+
Status: 'Complete' | 'Error';
|
|
64
|
+
Message: string;
|
|
65
|
+
};
|
|
54
66
|
/**
|
|
55
67
|
* Why a conversation-detail `Save()` returned false, for an error or log line. The owner gate in
|
|
56
68
|
* `MJConversationDetailEntityExtended` refuses a non-owner's write (e.g. the elevated System user
|
|
@@ -202,6 +214,34 @@ export declare class AgentRunner {
|
|
|
202
214
|
versionId: string;
|
|
203
215
|
versionNumber: number;
|
|
204
216
|
}>;
|
|
217
|
+
/**
|
|
218
|
+
* Gives the current reply an existing artifact version whose content equals the new payload.
|
|
219
|
+
* The reply gets an `Output` link to that version (unless it already has one), which makes the
|
|
220
|
+
* version visible on the reply's branch path, and the result is the same tuple the normal
|
|
221
|
+
* version-creation path returns. When the link-exists read fails, no link is written and the
|
|
222
|
+
* result is `undefined`, so a failed read never adds a second link for the same pair.
|
|
223
|
+
*
|
|
224
|
+
* @param versionId - The existing version with identical content
|
|
225
|
+
* @param conversationDetailId - The reply row to link the version to
|
|
226
|
+
* @param artifactId - The parent artifact ID
|
|
227
|
+
* @param versionNumber - The existing version's number
|
|
228
|
+
* @param contextUser - User context for the read and the save
|
|
229
|
+
* @param provider - Metadata provider for the read and the save
|
|
230
|
+
* @returns The standard artifact result tuple for the existing version, or `undefined` when
|
|
231
|
+
* the link-exists read failed
|
|
232
|
+
*/
|
|
233
|
+
private reuseVersionForReply;
|
|
234
|
+
/**
|
|
235
|
+
* Checks whether a conversation detail already has an `Output` link to an artifact version.
|
|
236
|
+
* A failed read is logged and returns `null`.
|
|
237
|
+
*
|
|
238
|
+
* @param conversationDetailId - The conversation detail to check
|
|
239
|
+
* @param versionId - The artifact version to look for
|
|
240
|
+
* @param contextUser - User context for the read
|
|
241
|
+
* @param provider - Metadata provider for the read
|
|
242
|
+
* @returns `true` when the link exists, `false` when it does not, `null` when the read failed
|
|
243
|
+
*/
|
|
244
|
+
private hasOutputLink;
|
|
205
245
|
/**
|
|
206
246
|
* Finds the most recent artifact for a conversation detail to determine versioning.
|
|
207
247
|
* Queries the junction table to locate artifacts linked to a specific conversation message.
|
|
@@ -240,6 +280,11 @@ export declare class AgentRunner {
|
|
|
240
280
|
* 3. If previous artifact exists, creates new version of it
|
|
241
281
|
* 4. If no previous artifact, creates entirely new artifact
|
|
242
282
|
*
|
|
283
|
+
* When the payload equals the version a new one would follow, no version is created. Inside a
|
|
284
|
+
* conversation that existing version is linked to the reply (an `Output` link, unless one
|
|
285
|
+
* exists) and returned; if the link-exists read fails, nothing is written and the method returns
|
|
286
|
+
* `undefined`. Outside a conversation the method returns `undefined`.
|
|
287
|
+
*
|
|
243
288
|
* Respects the agent's ArtifactCreationMode configuration:
|
|
244
289
|
* - "Never": Skips artifact creation entirely
|
|
245
290
|
* - "System Only": Creates artifact with Visibility='System Only'
|
|
@@ -402,6 +447,8 @@ export declare class AgentRunner {
|
|
|
402
447
|
*
|
|
403
448
|
* @param userMessage - The first user message to base the name on
|
|
404
449
|
* @param contextUser - User context for prompt execution
|
|
450
|
+
* @param credentials - The run's configuration, runtime keys and credential scope, so naming runs
|
|
451
|
+
* on the same credentials as the agent run it names
|
|
405
452
|
* @returns Generated conversation name and description, or null if generation failed
|
|
406
453
|
* @private
|
|
407
454
|
*/
|
|
@@ -578,12 +625,14 @@ export declare class AgentRunner {
|
|
|
578
625
|
*/
|
|
579
626
|
private resolveConversationId;
|
|
580
627
|
/**
|
|
581
|
-
* Gathers
|
|
582
|
-
* uploaded file attachments) so the ArtifactToolManager can make them available
|
|
628
|
+
* Gathers the artifacts on the run's branch path of a conversation (both artifact-system
|
|
629
|
+
* records and uploaded file attachments) so the ArtifactToolManager can make them available
|
|
583
630
|
* to the agent as input artifacts.
|
|
584
631
|
*
|
|
585
632
|
* @param historyFrom The run's history floor (`ExecuteAgentParams.ConversationHistoryFrom`).
|
|
586
633
|
* When set, only artifacts attached to messages written at or after it are gathered.
|
|
634
|
+
* @param branchId The run's branch; only artifacts of messages on its path that no rerun
|
|
635
|
+
* replaced are gathered.
|
|
587
636
|
*/
|
|
588
637
|
private gatherConversationArtifacts;
|
|
589
638
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentRunner.d.ts","sourceRoot":"","sources":["../src/AgentRunner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAsG,QAAQ,EAAE,iBAAiB,EAAsC,MAAM,sBAAsB,CAAC;AAG3M,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,WAAW,EAAE,aAAa,EAA4D,MAAM,8BAA8B,CAAC;AAC5K,OAAO,EAA+C,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAwBzG;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACjC,aAAa,EAAE,SAAS,mBAAmB,EAAE,GAAG,SAAS,EACzD,eAAe,EAAE,mBAAmB,GAAG,SAAS,GACjD,mBAAmB,GAAG,SAAS,CAEjC;AAED,qDAAqD;AACrD,wBAAgB,qBAAqB,CACjC,aAAa,EAAE,SAAS,mBAAmB,EAAE,GAAG,SAAS,EACzD,eAAe,EAAE,mBAAmB,GAAG,SAAS,GACjD,mBAAmB,GAAG,SAAS,CAEjC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,WAAW;IACpB;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAIhC,kGAAkG;IAClG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAA0C;IAEvF;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAO;IAEvD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoB;gBAElC,QAAQ,CAAC,EAAE,iBAAiB;IAKxC;;;;;;;;;;;;;;OAcG;IACU,QAAQ,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAoDtG;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACU,sBAAsB,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAChD,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAC7B,OAAO,EAAE;QACL,6FAA6F;QAC7F,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,gGAAgG;QAChG,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,yGAAyG;QACzG,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,2EAA2E;QAC3E,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,+EAA+E;QAC/E,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,4EAA4E;QAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,iGAAiG;QACjG,SAAS,CAAC,EAAE,MAAM,CAAC;KACtB,GACF,OAAO,CAAC;QACP,iCAAiC;QACjC,WAAW,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACnC,gDAAgD;QAChD,cAAc,EAAE,MAAM,CAAC;QACvB,sDAAsD;QACtD,mBAAmB,EAAE,MAAM,CAAC;QAC5B,4FAA4F;QAC5F,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAC/B;;;;;;;;WAQG;QACH,YAAY,CAAC,EAAE,mBAAmB,CAAC;KACtC,CAAC;
|
|
1
|
+
{"version":3,"file":"AgentRunner.d.ts","sourceRoot":"","sources":["../src/AgentRunner.ts"],"names":[],"mappings":"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"}
|
package/dist/AgentRunner.js
CHANGED
|
@@ -53,6 +53,28 @@ export function selectPrimaryArtifact(fileArtifacts, payloadArtifact) {
|
|
|
53
53
|
* ```
|
|
54
54
|
*/
|
|
55
55
|
export class AgentRunner {
|
|
56
|
+
/**
|
|
57
|
+
* The status and message the agent's reply detail ends with, from the run's result.
|
|
58
|
+
*
|
|
59
|
+
* A run the user stopped is not an error: its reply is marked Complete with a short "stopped"
|
|
60
|
+
* message, so the chat shows a quiet end rather than a red failure, and the run row (Cancelled,
|
|
61
|
+
* with its reason and the payload as it stood) carries the detail. Every other outcome keeps the
|
|
62
|
+
* long-standing mapping: the run's message when it wrote one, else Completed or the error.
|
|
63
|
+
*/
|
|
64
|
+
static ResolveFinalDetailState(agentResult) {
|
|
65
|
+
const run = agentResult.agentRun;
|
|
66
|
+
if (run?.Status === 'Cancelled') {
|
|
67
|
+
const byUser = run.CancellationReason === 'User Request';
|
|
68
|
+
return {
|
|
69
|
+
Status: 'Complete',
|
|
70
|
+
Message: byUser ? 'Stopped by user' : `Stopped: ${run.ErrorMessage || 'the run was cancelled'}`,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
Status: agentResult.success ? 'Complete' : 'Error',
|
|
75
|
+
Message: run?.Message || (agentResult.success ? '✅ Completed' : run?.ErrorMessage || '❌ Failed'),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
56
78
|
/**
|
|
57
79
|
* Why a conversation-detail `Save()` returned false, for an error or log line. The owner gate in
|
|
58
80
|
* `MJConversationDetailEntityExtended` refuses a non-owner's write (e.g. the elevated System user
|
|
@@ -225,7 +247,7 @@ export class AgentRunner {
|
|
|
225
247
|
let conversationDescription = null;
|
|
226
248
|
if (!conversationName && options.userMessage) {
|
|
227
249
|
// Try to generate a name using the "Name Conversation" prompt (same as UI)
|
|
228
|
-
const nameResult = await this.generateConversationName(options.userMessage, contextUser, md);
|
|
250
|
+
const nameResult = await this.generateConversationName(options.userMessage, contextUser, md, params);
|
|
229
251
|
if (nameResult) {
|
|
230
252
|
conversationName = nameResult.name;
|
|
231
253
|
conversationDescription = nameResult.description;
|
|
@@ -257,6 +279,7 @@ export class AgentRunner {
|
|
|
257
279
|
userMessageDetail.Role = 'User';
|
|
258
280
|
userMessageDetail.UserID = contextUser.ID;
|
|
259
281
|
userMessageDetail.HiddenToUser = false;
|
|
282
|
+
userMessageDetail.BranchID = params.ConversationBranchID ?? null;
|
|
260
283
|
// Link to test run if provided (for test execution traceability)
|
|
261
284
|
if (options.testRunId) {
|
|
262
285
|
userMessageDetail.TestRunID = options.testRunId;
|
|
@@ -275,6 +298,7 @@ export class AgentRunner {
|
|
|
275
298
|
agentResponseDetail.Status = 'In-Progress';
|
|
276
299
|
agentResponseDetail.HiddenToUser = false;
|
|
277
300
|
agentResponseDetail.AgentID = params.agent.ID;
|
|
301
|
+
agentResponseDetail.BranchID = params.ConversationBranchID ?? null;
|
|
278
302
|
// Link to test run if provided (for test execution traceability)
|
|
279
303
|
if (options.testRunId) {
|
|
280
304
|
agentResponseDetail.TestRunID = options.testRunId;
|
|
@@ -317,12 +341,14 @@ export class AgentRunner {
|
|
|
317
341
|
}
|
|
318
342
|
}
|
|
319
343
|
: originalOnProgress;
|
|
320
|
-
//
|
|
344
|
+
// The run reads the branch the caller named, else the branch its reply row carries. Undefined is Main.
|
|
345
|
+
const runBranchId = params.ConversationBranchID ?? agentResponseDetail?.BranchID ?? undefined;
|
|
346
|
+
// Gather all artifacts on the run's branch path of this conversation for the ArtifactToolManager.
|
|
321
347
|
// Per design doc Section 8.8: in the in-conversation flow, "the agent continues
|
|
322
348
|
// the conversation with the artifact already available." This means ALL artifacts
|
|
323
|
-
//
|
|
349
|
+
// on that path (both agent-produced Output and user-attached Input) should
|
|
324
350
|
// be available to the agent via artifact tools.
|
|
325
|
-
const inputArtifacts = await this.gatherConversationArtifacts(conversationId, contextUser, params.ConversationHistoryFrom);
|
|
351
|
+
const inputArtifacts = await this.gatherConversationArtifacts(conversationId, contextUser, params.ConversationHistoryFrom, runBranchId);
|
|
326
352
|
const modifiedParams = {
|
|
327
353
|
...params,
|
|
328
354
|
// First-class conversationId gates the cross-turn context features
|
|
@@ -339,6 +365,7 @@ export class AgentRunner {
|
|
|
339
365
|
// (BaseAgent tests `inputArtifacts?.length`, so [] and undefined behave identically there.)
|
|
340
366
|
inputArtifacts,
|
|
341
367
|
conversationDetailId: agentResponseDetailId,
|
|
368
|
+
...(runBranchId !== undefined ? { ConversationBranchID: runBranchId } : {}),
|
|
342
369
|
onProgress: wrappedOnProgress
|
|
343
370
|
};
|
|
344
371
|
// Returning-visitor memory (RV3): for a public web-widget guest with remembering on, derive the
|
|
@@ -379,11 +406,9 @@ export class AgentRunner {
|
|
|
379
406
|
if (!loaded) {
|
|
380
407
|
LogError(`Failed to reload agent response detail ${agentResponseDetailId}`);
|
|
381
408
|
}
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
: agentResult.agentRun?.ErrorMessage || '❌ Failed');
|
|
386
|
-
agentResponseDetail.Status = agentResult.success ? 'Complete' : 'Error';
|
|
409
|
+
const finalState = AgentRunner.ResolveFinalDetailState(agentResult);
|
|
410
|
+
agentResponseDetail.Message = finalState.Message;
|
|
411
|
+
agentResponseDetail.Status = finalState.Status;
|
|
387
412
|
// Set response form and command fields
|
|
388
413
|
if (agentResult.responseForm) {
|
|
389
414
|
agentResponseDetail.ResponseForm = JSON.stringify(agentResult.responseForm);
|
|
@@ -536,6 +561,7 @@ export class AgentRunner {
|
|
|
536
561
|
async GetMaxVersionForArtifact(artifactId, contextUser, provider) {
|
|
537
562
|
try {
|
|
538
563
|
const rv = RunView.FromMetadataProvider(provider || this._provider);
|
|
564
|
+
// conversation-scope: artifact-wide read; version numbers are unique per artifact across every path
|
|
539
565
|
const result = await rv.RunView({
|
|
540
566
|
EntityName: 'MJ: Artifact Versions',
|
|
541
567
|
ExtraFilter: `ArtifactID='${AgentRunner.filterId(artifactId, 'GetMaxVersionForArtifact artifactId')}'`,
|
|
@@ -582,6 +608,7 @@ export class AgentRunner {
|
|
|
582
608
|
return null;
|
|
583
609
|
}
|
|
584
610
|
const rv = RunView.FromMetadataProvider(provider || this._provider);
|
|
611
|
+
// conversation-scope: artifact-wide read; compares with the artifact's latest version number, which is global
|
|
585
612
|
const result = await rv.RunView({
|
|
586
613
|
EntityName: 'MJ: Artifact Versions',
|
|
587
614
|
ExtraFilter: `ArtifactID='${AgentRunner.filterId(artifactId, 'CheckForDuplicateVersion artifactId')}' AND VersionNumber=${latestVersion}`,
|
|
@@ -620,6 +647,60 @@ export class AgentRunner {
|
|
|
620
647
|
LogStatus(`Linked artifact to conversation detail ${conversationDetailId}`);
|
|
621
648
|
return { artifactId, versionId, versionNumber };
|
|
622
649
|
}
|
|
650
|
+
/**
|
|
651
|
+
* Gives the current reply an existing artifact version whose content equals the new payload.
|
|
652
|
+
* The reply gets an `Output` link to that version (unless it already has one), which makes the
|
|
653
|
+
* version visible on the reply's branch path, and the result is the same tuple the normal
|
|
654
|
+
* version-creation path returns. When the link-exists read fails, no link is written and the
|
|
655
|
+
* result is `undefined`, so a failed read never adds a second link for the same pair.
|
|
656
|
+
*
|
|
657
|
+
* @param versionId - The existing version with identical content
|
|
658
|
+
* @param conversationDetailId - The reply row to link the version to
|
|
659
|
+
* @param artifactId - The parent artifact ID
|
|
660
|
+
* @param versionNumber - The existing version's number
|
|
661
|
+
* @param contextUser - User context for the read and the save
|
|
662
|
+
* @param provider - Metadata provider for the read and the save
|
|
663
|
+
* @returns The standard artifact result tuple for the existing version, or `undefined` when
|
|
664
|
+
* the link-exists read failed
|
|
665
|
+
*/
|
|
666
|
+
async reuseVersionForReply(versionId, conversationDetailId, artifactId, versionNumber, contextUser, provider) {
|
|
667
|
+
LogStatus(`Reusing version ${versionNumber} of artifact ${artifactId} for this reply (identical content)`);
|
|
668
|
+
const linkExists = await this.hasOutputLink(conversationDetailId, versionId, contextUser, provider);
|
|
669
|
+
if (linkExists === null) {
|
|
670
|
+
return undefined;
|
|
671
|
+
}
|
|
672
|
+
if (linkExists) {
|
|
673
|
+
return { artifactId, versionId, versionNumber };
|
|
674
|
+
}
|
|
675
|
+
return this.LinkArtifactToConversationDetail(versionId, conversationDetailId, artifactId, versionNumber, contextUser, provider);
|
|
676
|
+
}
|
|
677
|
+
/**
|
|
678
|
+
* Checks whether a conversation detail already has an `Output` link to an artifact version.
|
|
679
|
+
* A failed read is logged and returns `null`.
|
|
680
|
+
*
|
|
681
|
+
* @param conversationDetailId - The conversation detail to check
|
|
682
|
+
* @param versionId - The artifact version to look for
|
|
683
|
+
* @param contextUser - User context for the read
|
|
684
|
+
* @param provider - Metadata provider for the read
|
|
685
|
+
* @returns `true` when the link exists, `false` when it does not, `null` when the read failed
|
|
686
|
+
*/
|
|
687
|
+
async hasOutputLink(conversationDetailId, versionId, contextUser, provider) {
|
|
688
|
+
const rv = RunView.FromMetadataProvider(provider);
|
|
689
|
+
const result = await rv.RunView({
|
|
690
|
+
EntityName: 'MJ: Conversation Detail Artifacts',
|
|
691
|
+
ExtraFilter: `ConversationDetailID='${AgentRunner.filterId(conversationDetailId, 'hasOutputLink conversationDetailId')}' ` +
|
|
692
|
+
`AND ArtifactVersionID='${AgentRunner.filterId(versionId, 'hasOutputLink versionId')}' AND Direction='Output'`,
|
|
693
|
+
Fields: ['ID'],
|
|
694
|
+
MaxRows: 1,
|
|
695
|
+
ResultType: 'simple'
|
|
696
|
+
}, contextUser);
|
|
697
|
+
if (!result.Success) {
|
|
698
|
+
LogError(`Could not check for an existing artifact link on conversation detail ${conversationDetailId} ` +
|
|
699
|
+
`(no link written): ${result.ErrorMessage}`);
|
|
700
|
+
return null;
|
|
701
|
+
}
|
|
702
|
+
return result.Results.length > 0;
|
|
703
|
+
}
|
|
623
704
|
/**
|
|
624
705
|
* Finds the most recent artifact for a conversation detail to determine versioning.
|
|
625
706
|
* Queries the junction table to locate artifacts linked to a specific conversation message.
|
|
@@ -683,6 +764,11 @@ export class AgentRunner {
|
|
|
683
764
|
* 3. If previous artifact exists, creates new version of it
|
|
684
765
|
* 4. If no previous artifact, creates entirely new artifact
|
|
685
766
|
*
|
|
767
|
+
* When the payload equals the version a new one would follow, no version is created. Inside a
|
|
768
|
+
* conversation that existing version is linked to the reply (an `Output` link, unless one
|
|
769
|
+
* exists) and returned; if the link-exists read fails, nothing is written and the method returns
|
|
770
|
+
* `undefined`. Outside a conversation the method returns `undefined`.
|
|
771
|
+
*
|
|
686
772
|
* Respects the agent's ArtifactCreationMode configuration:
|
|
687
773
|
* - "Never": Skips artifact creation entirely
|
|
688
774
|
* - "System Only": Creates artifact with Visibility='System Only'
|
|
@@ -809,12 +895,17 @@ export class AgentRunner {
|
|
|
809
895
|
}
|
|
810
896
|
// Serialize the payload once — used for both dedup check and version creation
|
|
811
897
|
const serializedContent = JSON.stringify(payload, null, 2);
|
|
812
|
-
//
|
|
898
|
+
// Identical content creates no new version. Inside a conversation the existing version
|
|
899
|
+
// is linked to this reply instead; outside one there is nothing to link.
|
|
813
900
|
if (!isNewArtifact && newVersionNumber > 1) {
|
|
814
|
-
const
|
|
901
|
+
const latestVersionNumber = newVersionNumber - 1;
|
|
902
|
+
const existingVersionId = await this.CheckForDuplicateVersion(artifactId, serializedContent, latestVersionNumber, contextUser, provider);
|
|
815
903
|
if (existingVersionId) {
|
|
816
|
-
|
|
817
|
-
|
|
904
|
+
if (!conversationDetailId) {
|
|
905
|
+
console.debug(`Skipping duplicate artifact version — content identical to version ${latestVersionNumber}`);
|
|
906
|
+
return undefined;
|
|
907
|
+
}
|
|
908
|
+
return await this.reuseVersionForReply(existingVersionId, conversationDetailId, artifactId, latestVersionNumber, contextUser, md);
|
|
818
909
|
}
|
|
819
910
|
}
|
|
820
911
|
// Create artifact version with content
|
|
@@ -1086,10 +1177,12 @@ export class AgentRunner {
|
|
|
1086
1177
|
*
|
|
1087
1178
|
* @param userMessage - The first user message to base the name on
|
|
1088
1179
|
* @param contextUser - User context for prompt execution
|
|
1180
|
+
* @param credentials - The run's configuration, runtime keys and credential scope, so naming runs
|
|
1181
|
+
* on the same credentials as the agent run it names
|
|
1089
1182
|
* @returns Generated conversation name and description, or null if generation failed
|
|
1090
1183
|
* @private
|
|
1091
1184
|
*/
|
|
1092
|
-
async generateConversationName(userMessage, contextUser, provider) {
|
|
1185
|
+
async generateConversationName(userMessage, contextUser, provider, credentials) {
|
|
1093
1186
|
try {
|
|
1094
1187
|
// Import AIPromptRunner, AIPromptParams, and AIEngine
|
|
1095
1188
|
const { AIPromptRunner } = await import('@memberjunction/ai-prompts');
|
|
@@ -1110,6 +1203,9 @@ export class AgentRunner {
|
|
|
1110
1203
|
promptParams.UserID = ResolvePromptRunUserID({ ContextUser: contextUser }) ?? undefined;
|
|
1111
1204
|
promptParams.conversationMessages = [{ role: 'user', content: userMessage }];
|
|
1112
1205
|
promptParams.provider = provider || this._provider;
|
|
1206
|
+
promptParams.configurationId = credentials?.configurationId;
|
|
1207
|
+
promptParams.apiKeys = credentials?.apiKeys;
|
|
1208
|
+
promptParams.CredentialScope = credentials?.CredentialScope;
|
|
1113
1209
|
const runner = new AIPromptRunner();
|
|
1114
1210
|
const result = await runner.ExecutePrompt(promptParams);
|
|
1115
1211
|
if (result && result.success && result.result) {
|
|
@@ -1660,7 +1756,7 @@ export class AgentRunner {
|
|
|
1660
1756
|
if (!conversationId) {
|
|
1661
1757
|
return params;
|
|
1662
1758
|
}
|
|
1663
|
-
const inputArtifacts = await this.gatherConversationArtifacts(conversationId, params.contextUser, params.ConversationHistoryFrom);
|
|
1759
|
+
const inputArtifacts = await this.gatherConversationArtifacts(conversationId, params.contextUser, params.ConversationHistoryFrom, params.ConversationBranchID);
|
|
1664
1760
|
return inputArtifacts.length > 0 ? { ...params, inputArtifacts } : params;
|
|
1665
1761
|
}
|
|
1666
1762
|
/**
|
|
@@ -1679,23 +1775,25 @@ export class AgentRunner {
|
|
|
1679
1775
|
return (await detail.Load(params.conversationDetailId)) ? detail.ConversationID : undefined;
|
|
1680
1776
|
}
|
|
1681
1777
|
/**
|
|
1682
|
-
* Gathers
|
|
1683
|
-
* uploaded file attachments) so the ArtifactToolManager can make them available
|
|
1778
|
+
* Gathers the artifacts on the run's branch path of a conversation (both artifact-system
|
|
1779
|
+
* records and uploaded file attachments) so the ArtifactToolManager can make them available
|
|
1684
1780
|
* to the agent as input artifacts.
|
|
1685
1781
|
*
|
|
1686
1782
|
* @param historyFrom The run's history floor (`ExecuteAgentParams.ConversationHistoryFrom`).
|
|
1687
1783
|
* When set, only artifacts attached to messages written at or after it are gathered.
|
|
1784
|
+
* @param branchId The run's branch; only artifacts of messages on its path that no rerun
|
|
1785
|
+
* replaced are gathered.
|
|
1688
1786
|
*/
|
|
1689
|
-
async gatherConversationArtifacts(conversationId, contextUser, historyFrom) {
|
|
1787
|
+
async gatherConversationArtifacts(conversationId, contextUser, historyFrom, branchId) {
|
|
1690
1788
|
try {
|
|
1691
1789
|
const rv = new RunView();
|
|
1692
|
-
const
|
|
1693
|
-
// Get
|
|
1790
|
+
const pathFilter = await ConversationEngine.BranchPathFilterFresh(conversationId, branchId, contextUser);
|
|
1791
|
+
// Get the IDs of the live conversation details on the run's branch path (from its floor, if the run has one)
|
|
1694
1792
|
const details = await rv.RunView({
|
|
1695
1793
|
EntityName: 'MJ: Conversation Details',
|
|
1696
|
-
ExtraFilter: historyFrom
|
|
1697
|
-
? `${
|
|
1698
|
-
:
|
|
1794
|
+
ExtraFilter: ConversationEngine.LiveRowsFilter(historyFrom
|
|
1795
|
+
? `${pathFilter} AND ${ConversationEngine.HistoryFromFilter(historyFrom)}`
|
|
1796
|
+
: pathFilter),
|
|
1699
1797
|
Fields: ['ID'],
|
|
1700
1798
|
ResultType: 'simple',
|
|
1701
1799
|
}, contextUser);
|