@memberjunction/ng-conversations 6.2.0-edge.6 → 6.2.0-edge.7
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/lib/components/collection/collection-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-view.component.js +1 -0
- package/dist/lib/components/collection/collection-view.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +174 -2
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +1266 -443
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-mode-picker.component.js +2 -2
- package/dist/lib/components/conversation/conversation-mode-picker.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-remote-browser-controller.d.ts +109 -0
- package/dist/lib/components/conversation/conversation-remote-browser-controller.d.ts.map +1 -0
- package/dist/lib/components/conversation/conversation-remote-browser-controller.js +298 -0
- package/dist/lib/components/conversation/conversation-remote-browser-controller.js.map +1 -0
- package/dist/lib/components/message/agent-handoff-card.component.d.ts +102 -0
- package/dist/lib/components/message/agent-handoff-card.component.d.ts.map +1 -0
- package/dist/lib/components/message/agent-handoff-card.component.js +439 -0
- package/dist/lib/components/message/agent-handoff-card.component.js.map +1 -0
- package/dist/lib/components/message/message-input.component.d.ts +80 -53
- package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input.component.js +381 -277
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/message/message-item.component.d.ts +18 -1
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-item.component.js +548 -426
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/components/message/message-list.component.d.ts +8 -1
- package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-list.component.js +40 -2
- package/dist/lib/components/message/message-list.component.js.map +1 -1
- package/dist/lib/components/realtime/interactive-component/run-view-component-artifact-source.js +1 -1
- package/dist/lib/components/realtime/interactive-component/run-view-component-artifact-source.js.map +1 -1
- package/dist/lib/components/realtime/media/media-channel-state.d.ts +5 -0
- package/dist/lib/components/realtime/media/media-channel-state.d.ts.map +1 -1
- package/dist/lib/components/realtime/media/media-channel-state.js +27 -1
- package/dist/lib/components/realtime/media/media-channel-state.js.map +1 -1
- package/dist/lib/components/realtime/media/media-channel.d.ts.map +1 -1
- package/dist/lib/components/realtime/media/media-channel.js +7 -2
- package/dist/lib/components/realtime/media/media-channel.js.map +1 -1
- package/dist/lib/components/realtime/media/realtime-media-surface.component.d.ts +19 -2
- package/dist/lib/components/realtime/media/realtime-media-surface.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/media/realtime-media-surface.component.js +59 -10
- package/dist/lib/components/realtime/media/realtime-media-surface.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +17 -6
- package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-agent-banner.component.js +61 -27
- package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-composer.component.d.ts +26 -3
- package/dist/lib/components/realtime/realtime-composer.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-composer.component.js +196 -102
- package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +53 -15
- package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-session-overlay.component.js +125 -51
- package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-ui-config.d.ts +9 -12
- package/dist/lib/components/realtime/realtime-ui-config.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-ui-config.js +38 -18
- package/dist/lib/components/realtime/realtime-ui-config.js.map +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts.map +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js +27 -4
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js.map +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-tools.d.ts +8 -2
- package/dist/lib/components/realtime/remote-browser/remote-browser-tools.d.ts.map +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-tools.js +51 -10
- package/dist/lib/components/realtime/remote-browser/remote-browser-tools.js.map +1 -1
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel-config.d.ts +46 -0
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel-config.d.ts.map +1 -0
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel-config.js +64 -0
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel-config.js.map +1 -0
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts +131 -9
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -1
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +347 -38
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js.map +1 -1
- package/dist/lib/conversations.module.d.ts +2 -1
- package/dist/lib/conversations.module.d.ts.map +1 -1
- package/dist/lib/conversations.module.js +9 -4
- package/dist/lib/conversations.module.js.map +1 -1
- package/dist/lib/events/chat-events.d.ts +5 -4
- package/dist/lib/events/chat-events.d.ts.map +1 -1
- package/dist/lib/events/chat-events.js +2 -2
- package/dist/lib/events/chat-events.js.map +1 -1
- package/dist/lib/models/agent-turn.model.d.ts +11 -7
- package/dist/lib/models/agent-turn.model.d.ts.map +1 -1
- package/dist/lib/models/agent-turn.model.js.map +1 -1
- package/dist/lib/services/active-tasks.service.d.ts +5 -0
- package/dist/lib/services/active-tasks.service.d.ts.map +1 -1
- package/dist/lib/services/active-tasks.service.js +16 -0
- package/dist/lib/services/active-tasks.service.js.map +1 -1
- package/dist/lib/services/agent-state.service.d.ts.map +1 -1
- package/dist/lib/services/agent-state.service.js +7 -1
- package/dist/lib/services/agent-state.service.js.map +1 -1
- package/dist/lib/services/artifact-permission.service.d.ts.map +1 -1
- package/dist/lib/services/artifact-permission.service.js +2 -0
- package/dist/lib/services/artifact-permission.service.js.map +1 -1
- package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
- package/dist/lib/services/artifact-state.service.js +1 -0
- package/dist/lib/services/artifact-state.service.js.map +1 -1
- package/dist/lib/services/collection-permission.service.d.ts.map +1 -1
- package/dist/lib/services/collection-permission.service.js +1 -0
- package/dist/lib/services/collection-permission.service.js.map +1 -1
- package/dist/lib/services/conversation-agent.service.d.ts +1 -4
- package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-agent.service.js +7 -45
- package/dist/lib/services/conversation-agent.service.js.map +1 -1
- package/dist/lib/services/realtime-session-review.service.d.ts +2 -1
- package/dist/lib/services/realtime-session-review.service.d.ts.map +1 -1
- package/dist/lib/services/realtime-session-review.service.js.map +1 -1
- package/dist/lib/services/search.service.d.ts.map +1 -1
- package/dist/lib/services/search.service.js +1 -0
- package/dist/lib/services/search.service.js.map +1 -1
- package/dist/lib/utils/agent-handoff-map.d.ts +52 -0
- package/dist/lib/utils/agent-handoff-map.d.ts.map +1 -0
- package/dist/lib/utils/agent-handoff-map.js +270 -0
- package/dist/lib/utils/agent-handoff-map.js.map +1 -0
- package/dist/lib/utils/agent-turn-routing.d.ts +62 -7
- package/dist/lib/utils/agent-turn-routing.d.ts.map +1 -1
- package/dist/lib/utils/agent-turn-routing.js +147 -6
- package/dist/lib/utils/agent-turn-routing.js.map +1 -1
- package/dist/lib/utils/decision-routing.d.ts +17 -9
- package/dist/lib/utils/decision-routing.d.ts.map +1 -1
- package/dist/lib/utils/decision-routing.js +23 -14
- package/dist/lib/utils/decision-routing.js.map +1 -1
- package/dist/lib/utils/thread-replies.d.ts +34 -0
- package/dist/lib/utils/thread-replies.d.ts.map +1 -0
- package/dist/lib/utils/thread-replies.js +49 -0
- package/dist/lib/utils/thread-replies.js.map +1 -0
- package/dist/public-api.d.ts +5 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +5 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +36 -36
|
@@ -12,27 +12,31 @@ import type { ExecuteAgentResult } from '@memberjunction/ai-core-plus';
|
|
|
12
12
|
/**
|
|
13
13
|
* When a message starts an agent turn.
|
|
14
14
|
*
|
|
15
|
-
* - `Always` (the default): every message
|
|
16
|
-
*
|
|
17
|
-
*
|
|
15
|
+
* - `Always` (the default): every message starts a turn unless it is addressed to another person
|
|
16
|
+
* (`@Person`, a `ParentID` reply to another person's message, or a `NoAgent` routing decision).
|
|
17
|
+
* - `MentionOnly`: a message starts a turn only when it tags an agent (`Mention`), replies
|
|
18
|
+
* (`ParentID`) directly to an agent's message (`ThreadReply`), or is sent to an active agent by a
|
|
19
|
+
* confident routing decision (`DecisionRouted`, when `EnableDecisionRouting` is on). Any other
|
|
20
|
+
* message is posted with no turn at all: no reply row, no placeholder and no turn events.
|
|
18
21
|
*/
|
|
19
22
|
export type AgentReplyMode = 'Always' | 'MentionOnly';
|
|
20
23
|
/**
|
|
21
24
|
* How the turn's agent was chosen. MJ tries the routes in this order and takes the first that
|
|
22
|
-
* applies; under `MentionOnly`, only `Mention`
|
|
25
|
+
* applies; under `MentionOnly`, only `Mention`, `ThreadReply`, and `DecisionRouted` apply.
|
|
23
26
|
*
|
|
24
27
|
* - `Mention`: the message tags the agent.
|
|
28
|
+
* - `ThreadReply`: the message replies (`ParentID`) directly to an earlier message from the agent.
|
|
25
29
|
* - `Continuity`: the last agent that answered in the conversation, other than the
|
|
26
30
|
* conversation manager.
|
|
27
|
-
* - `DecisionRouted`:
|
|
28
|
-
*
|
|
31
|
+
* - `DecisionRouted`: an agent in the conversation that a confident routing decision chose for an
|
|
32
|
+
* unmentioned follow-up message. Only with the chat's `EnableDecisionRouting` on.
|
|
29
33
|
* - `ConversationDefault`: the agent pinned on the conversation (`Conversation.DefaultAgentID`).
|
|
30
34
|
* - `HostDefault`: the host's `DefaultAgentId` input.
|
|
31
35
|
* - `ConversationManager`: MJ's conversation manager agent (Sage unless configured otherwise),
|
|
32
36
|
* which may delegate to another agent.
|
|
33
37
|
* - `Redirect`: a `BeforeAgentTurn` listener sent the turn to a different agent.
|
|
34
38
|
*/
|
|
35
|
-
export type AgentTurnRoute = 'Mention' | 'Continuity' | 'DecisionRouted' | 'ConversationDefault' | 'HostDefault' | 'ConversationManager' | 'Redirect';
|
|
39
|
+
export type AgentTurnRoute = 'Mention' | 'ThreadReply' | 'Continuity' | 'DecisionRouted' | 'ConversationDefault' | 'HostDefault' | 'ConversationManager' | 'Redirect';
|
|
36
40
|
/** The agent a turn resolved to, and the route that chose it. */
|
|
37
41
|
export interface AgentTurnTarget {
|
|
38
42
|
/** The agent that takes the turn. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-turn.model.d.ts","sourceRoot":"","sources":["../../../src/lib/models/agent-turn.model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAEvE
|
|
1
|
+
{"version":3,"file":"agent-turn.model.d.ts","sourceRoot":"","sources":["../../../src/lib/models/agent-turn.model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAEvE;;;;;;;;;GASG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,aAAa,CAAC;AAEtD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,cAAc,GACpB,SAAS,GACT,aAAa,GACb,YAAY,GACZ,gBAAgB,GAChB,qBAAqB,GACrB,aAAa,GACb,qBAAqB,GACrB,UAAU,CAAC;AAEjB,iEAAiE;AACjE,MAAM,WAAW,eAAe;IAC5B,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,KAAK,EAAE,cAAc,CAAC;CACzB;AAED,8EAA8E;AAC9E,MAAM,WAAW,aAAc,SAAQ,eAAe;IAClD,0CAA0C;IAC1C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,wDAAwD;IACxD,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC7B,kDAAkD;IAClD,cAAc,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,4EAA4E;IAC5E,aAAa,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gCAAgC;IAChC,KAAK,EAAE,cAAc,CAAC;IACtB,6CAA6C;IAC7C,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC3C,wGAAwG;IACxG,gBAAgB,EAAE,IAAI,GAAG,IAAI,CAAC;IAC9B;;;OAGG;IACH,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,iEAAiE;IACjE,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,oDAAoD;IACpD,QAAQ,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1C;AAED,sEAAsE;AACtE,MAAM,WAAW,eAAe;IAC5B,+FAA+F;IAC/F,OAAO,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gGAAgG;IAChG,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC/B;AAED;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-turn.model.js","sourceRoot":"","sources":["../../../src/lib/models/agent-turn.model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG","sourcesContent":["/**\n * @fileoverview The host-facing contract for an agent turn in `mj-conversation-chat-area`.\n *\n * An agent turn is what may follow a person's saved message. The chat area picks one agent by a\n * fixed order of routes, announces the turn with `BeforeAgentTurn` (which a host can cancel or\n * redirect), and then runs it: on MJ's own path, or on the host's server through an\n * {@link AgentTurnHandler}. These types are what a host reads and writes along the way.\n *\n * @module @memberjunction/ng-conversations\n */\n\nimport type { ExecuteAgentResult } from '@memberjunction/ai-core-plus';\n\n/**\n * When a message starts an agent turn.\n *\n * - `Always` (the default): every message
|
|
1
|
+
{"version":3,"file":"agent-turn.model.js","sourceRoot":"","sources":["../../../src/lib/models/agent-turn.model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG","sourcesContent":["/**\n * @fileoverview The host-facing contract for an agent turn in `mj-conversation-chat-area`.\n *\n * An agent turn is what may follow a person's saved message. The chat area picks one agent by a\n * fixed order of routes, announces the turn with `BeforeAgentTurn` (which a host can cancel or\n * redirect), and then runs it: on MJ's own path, or on the host's server through an\n * {@link AgentTurnHandler}. These types are what a host reads and writes along the way.\n *\n * @module @memberjunction/ng-conversations\n */\n\nimport type { ExecuteAgentResult } from '@memberjunction/ai-core-plus';\n\n/**\n * When a message starts an agent turn.\n *\n * - `Always` (the default): every message starts a turn unless it is addressed to another person\n * (`@Person`, a `ParentID` reply to another person's message, or a `NoAgent` routing decision).\n * - `MentionOnly`: a message starts a turn only when it tags an agent (`Mention`), replies\n * (`ParentID`) directly to an agent's message (`ThreadReply`), or is sent to an active agent by a\n * confident routing decision (`DecisionRouted`, when `EnableDecisionRouting` is on). Any other\n * message is posted with no turn at all: no reply row, no placeholder and no turn events.\n */\nexport type AgentReplyMode = 'Always' | 'MentionOnly';\n\n/**\n * How the turn's agent was chosen. MJ tries the routes in this order and takes the first that\n * applies; under `MentionOnly`, only `Mention`, `ThreadReply`, and `DecisionRouted` apply.\n *\n * - `Mention`: the message tags the agent.\n * - `ThreadReply`: the message replies (`ParentID`) directly to an earlier message from the agent.\n * - `Continuity`: the last agent that answered in the conversation, other than the\n * conversation manager.\n * - `DecisionRouted`: an agent in the conversation that a confident routing decision chose for an\n * unmentioned follow-up message. Only with the chat's `EnableDecisionRouting` on.\n * - `ConversationDefault`: the agent pinned on the conversation (`Conversation.DefaultAgentID`).\n * - `HostDefault`: the host's `DefaultAgentId` input.\n * - `ConversationManager`: MJ's conversation manager agent (Sage unless configured otherwise),\n * which may delegate to another agent.\n * - `Redirect`: a `BeforeAgentTurn` listener sent the turn to a different agent.\n */\nexport type AgentTurnRoute =\n | 'Mention'\n | 'ThreadReply'\n | 'Continuity'\n | 'DecisionRouted'\n | 'ConversationDefault'\n | 'HostDefault'\n | 'ConversationManager'\n | 'Redirect';\n\n/** The agent a turn resolved to, and the route that chose it. */\nexport interface AgentTurnTarget {\n /** The agent that takes the turn. */\n AgentId: string;\n /** How the agent was chosen. */\n Route: AgentTurnRoute;\n}\n\n/** What `BeforeAgentTurn` tells its listeners about the turn it announces. */\nexport interface AgentTurnInfo extends AgentTurnTarget {\n /** The agent's name, when MJ knows it. */\n AgentName: string | null;\n /** The person's saved message that the turn answers. */\n UserMessageId: string | null;\n}\n\n/**\n * Everything the chat area knows about a turn it hands to an {@link AgentTurnHandler}.\n * No reply row exists yet when the handler is called.\n */\nexport interface AgentTurnRequest {\n /** The conversation the message was posted in. */\n ConversationId: string;\n /**\n * The fork the turn's rows go to; null is Main. A handler that writes conversation rows sets this\n * BranchID on them.\n */\n BranchID: string | null;\n /** The person's saved message (`MJ: Conversation Details`, Role `User`). */\n UserMessageId: string;\n /** The message text, with mentions in their stored JSON form. */\n MessageText: string;\n /** The agent the turn resolved to, after any redirect. */\n AgentId: string;\n /** The agent's name, when MJ knows it. */\n AgentName: string | null;\n /** How the agent was chosen. */\n Route: AgentTurnRoute;\n /** The chat area's `ApplicationId` input. */\n ApplicationId: string | null;\n /** The chat area's `AppContext` input. */\n AppContext: Record<string, unknown> | null;\n /** The chat area's `AgentHistoryFrom` input: the first moment of the conversation the turn may read. */\n AgentHistoryFrom: Date | null;\n /**\n * The agent configuration preset (`MJ: AI Agent Configurations.ID`) the person chose: the one\n * on the mention for a `Mention` turn, otherwise the header mode picker's selection.\n */\n ConfigurationPresetId: string | null;\n /** Skills the person asked for with `/skill` in this message. */\n RequestedSkillIDs: string[];\n /** Whether Plan Mode is on for the conversation. */\n PlanMode: boolean;\n /**\n * The artifact version (`MJ: Artifact Versions.ID`) the message modifies, when the chat's\n * routing decision (`EnableDecisionRouting`) confidently named one this agent produced. MJ's\n * own path continues from that version instead of the agent's latest output. Null otherwise.\n */\n TargetArtifactVersionId: string | null;\n}\n\n/** What an {@link AgentTurnHandler} reports back to the chat area. */\nexport interface AgentTurnResult {\n /** False when the turn failed. The chat area shows {@link ErrorMessage} and writes nothing. */\n Success: boolean;\n /** Why the turn failed, shown to the person. */\n ErrorMessage?: string;\n /**\n * The rows the host wrote for the turn, oldest first: the agent's reply and any status rows.\n * The chat area loads and shows them. A row still `In-Progress` is followed like any other\n * in-progress reply. The host reports that row's live status through `AgentRunStatusPublisher`\n * (`@memberjunction/server`) on the caller's session: significant-step progress, streamed text,\n * the partial result, and the completion. The completion's `conversationDetailId` is the reply row.\n */\n ReplyDetailIds?: string[];\n /** The agent run, when the host has one. Carried on `AfterAgentTurn`. */\n AgentRunId?: string;\n /** The agent's result, when the host has one. `AfterAgentTurn` fires only when it's present. */\n Result?: ExecuteAgentResult;\n}\n\n/**\n * Runs an agent turn on the host's server instead of MJ's own path. The chat area calls it once\n * per turn, after `BeforeAgentTurn` and before any reply row exists, and shows the rows it reports.\n */\nexport type AgentTurnHandler = (request: AgentTurnRequest) => Promise<AgentTurnResult>;\n"]}
|
|
@@ -117,6 +117,11 @@ export declare class ActiveTasksService {
|
|
|
117
117
|
RemoveByAgentRunId(agentRunId: string): boolean;
|
|
118
118
|
/** @deprecated Use {@link RemoveByAgentRunId}. */
|
|
119
119
|
removeByAgentRunId(agentRunId: string): boolean;
|
|
120
|
+
/**
|
|
121
|
+
* True when at least one active task is currently tracked for `conversationId`
|
|
122
|
+
* (case-insensitive UUID comparison).
|
|
123
|
+
*/
|
|
124
|
+
HasActiveTasksForConversation(conversationId: string | null | undefined): boolean;
|
|
120
125
|
/**
|
|
121
126
|
* Clear all active tasks
|
|
122
127
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"active-tasks.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/active-tasks.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,UAAU,EAAE,MAAM,MAAM,CAAC;AAEnD,OAAO,EAAW,QAAQ,EAAY,iBAAiB,EAAe,MAAM,sBAAsB,CAAC;;
|
|
1
|
+
{"version":3,"file":"active-tasks.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/active-tasks.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { Injectable } from '@angular/core';
|
|
|
2
2
|
import { BehaviorSubject } from 'rxjs';
|
|
3
3
|
import { map } from 'rxjs/operators';
|
|
4
4
|
import { RunView, Metadata, LogStatusEx } from '@memberjunction/core';
|
|
5
|
+
import { UUIDsEqual } from '@memberjunction/global';
|
|
5
6
|
import { ConversationEngine } from '@memberjunction/core-entities';
|
|
6
7
|
import * as i0 from "@angular/core";
|
|
7
8
|
/**
|
|
@@ -211,6 +212,21 @@ export class ActiveTasksService {
|
|
|
211
212
|
removeByAgentRunId(agentRunId) {
|
|
212
213
|
return this.RemoveByAgentRunId(agentRunId);
|
|
213
214
|
}
|
|
215
|
+
/**
|
|
216
|
+
* True when at least one active task is currently tracked for `conversationId`
|
|
217
|
+
* (case-insensitive UUID comparison).
|
|
218
|
+
*/
|
|
219
|
+
HasActiveTasksForConversation(conversationId) {
|
|
220
|
+
if (!conversationId) {
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
for (const task of this._tasks$.value.values()) {
|
|
224
|
+
if (UUIDsEqual(task.conversationId, conversationId)) {
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
214
230
|
/**
|
|
215
231
|
* Clear all active tasks
|
|
216
232
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"active-tasks.service.js","sourceRoot":"","sources":["../../../src/lib/services/active-tasks.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { RunView, UserInfo, Metadata, IMetadataProvider, LogStatusEx } from '@memberjunction/core';\nimport { MJAIAgentRunEntity } from '@memberjunction/core-entities';\nimport { ConversationEngine } from '@memberjunction/core-entities';\n\n/**\n * Represents an active agent task that is currently running\n */\nexport interface ActiveTask {\n id: string;\n agentName: string;\n agentId?: string; // The agent ID for looking up icon/metadata\n agentRunId?: string; // The AIAgentRun ID for finding task on completion\n status: string;\n relatedMessageId: string;\n conversationDetailId?: string; // The ConversationDetail that tracks this task\n conversationId?: string; // The conversation this task belongs to\n conversationName?: string | null; // Display name of the conversation\n startTime: number;\n}\n\n/**\n * Service for tracking active agent tasks across the application.\n * Maintains a live list of running agents and their status.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ActiveTasksService {\n private _tasks$ = new BehaviorSubject<Map<string, ActiveTask>>(new Map());\n private _conversationIdsWithTasks$ = new BehaviorSubject<Set<string>>(new Set());\n private engine = ConversationEngine.Instance;\n private _provider: IMetadataProvider | null = null;\n\n /**\n * Set the metadata provider this service should use. When unset, falls back to Metadata.Provider.\n */\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n\n /**\n * Observable of all active tasks as an array\n */\n public readonly Tasks$: Observable<ActiveTask[]> = this._tasks$.pipe(\n map(taskMap => Array.from(taskMap.values()))\n );\n\n /** @deprecated Use {@link Tasks$}. */\n public get tasks$(): Observable<ActiveTask[]> {\n return this.Tasks$;\n }\n\n /**\n * Observable of the count of active tasks\n */\n public readonly TaskCount$: Observable<number> = this.Tasks$.pipe(\n map(tasks => tasks.length)\n );\n\n /** @deprecated Use {@link TaskCount$}. */\n public get taskCount$(): Observable<number> {\n return this.TaskCount$;\n }\n\n /**\n * Observable of conversation IDs that have 1+ active tasks\n * Use this for quick lookups in conversation lists\n */\n public readonly ConversationIdsWithTasks$: Observable<Set<string>> = this._conversationIdsWithTasks$.asObservable();\n\n /** @deprecated Use {@link ConversationIdsWithTasks$}. */\n public get conversationIdsWithTasks$(): Observable<Set<string>> {\n return this.ConversationIdsWithTasks$;\n }\n\n /**\n * Observable of tasks grouped by conversation ID\n * Returns Map<conversationId, ActiveTask[]>\n */\n public readonly TasksByConversationId$: Observable<Map<string, ActiveTask[]>> = this.Tasks$.pipe(\n map(tasks => {\n const grouped = new Map<string, ActiveTask[]>();\n for (const task of tasks) {\n if (task.conversationId) {\n const existing = grouped.get(task.conversationId) || [];\n existing.push(task);\n grouped.set(task.conversationId, existing);\n }\n }\n return grouped;\n })\n );\n\n /** @deprecated Use {@link TasksByConversationId$}. */\n public get tasksByConversationId$(): Observable<Map<string, ActiveTask[]>> {\n return this.TasksByConversationId$;\n }\n\n /**\n * Add a new active task\n * @param task Task details (without id and startTime)\n * @returns The generated task ID\n */\n Add(task: Omit<ActiveTask, 'id' | 'startTime'>): string {\n const id = `task-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n const fullTask = {\n ...task,\n id,\n startTime: Date.now()\n };\n const current = this._tasks$.value;\n current.set(id, fullTask);\n this._tasks$.next(new Map(current));\n\n // Update conversation IDs set\n if (fullTask.conversationId) {\n this.updateConversationIdsSet();\n }\n\n // verboseOnly: three lines per add()/remove() is a lot of console for \"a Map changed size\", but\n // it is genuinely useful when tracing task lifecycle, so it stays available rather than going.\n LogStatusEx({ message: `➕ Task added:`, additionalArgs: [{id, conversationId: fullTask.conversationId, agentName: fullTask.agentName}], verboseOnly: true });\n LogStatusEx({ message: `📊 Total tasks:`, additionalArgs: [this._tasks$.value.size], verboseOnly: true });\n LogStatusEx({ message: `🗂️ Conversation IDs with tasks:`, additionalArgs: [Array.from(this._conversationIdsWithTasks$.value)], verboseOnly: true });\n\n return id;\n }\n\n /** @deprecated Use {@link Add}. */\n add(task: Omit<ActiveTask, 'id' | 'startTime'>): string {\n return this.Add(task);\n }\n\n /**\n * Remove an active task\n * @param id The task ID to remove\n */\n Remove(id: string): void {\n const current = this._tasks$.value;\n const task = current.get(id);\n current.delete(id);\n this._tasks$.next(new Map(current));\n\n // Update conversation IDs set if this was the last task for a conversation\n if (task?.conversationId) {\n this.updateConversationIdsSet();\n }\n\n LogStatusEx({ message: `➖ Task removed:`, additionalArgs: [{id, conversationId: task?.conversationId, agentName: task?.agentName}], verboseOnly: true });\n LogStatusEx({ message: `📊 Total tasks remaining:`, additionalArgs: [this._tasks$.value.size], verboseOnly: true });\n LogStatusEx({ message: `🗂️ Conversation IDs with tasks:`, additionalArgs: [Array.from(this._conversationIdsWithTasks$.value)], verboseOnly: true });\n }\n\n /** @deprecated Use {@link Remove}. */\n remove(id: string): void {\n return this.Remove(id);\n }\n\n /**\n * Update the set of conversation IDs with active tasks\n * @private\n */\n private updateConversationIdsSet(): void {\n const conversationIds = new Set<string>();\n for (const task of this._tasks$.value.values()) {\n if (task.conversationId) {\n conversationIds.add(task.conversationId);\n }\n }\n this._conversationIdsWithTasks$.next(conversationIds);\n }\n\n /**\n * Update the status of an active task\n * @param id The task ID\n * @param status The new status text\n */\n UpdateStatus(id: string, status: string): void {\n const current = this._tasks$.value;\n const task = current.get(id);\n // Same-value updates are no-ops so high-frequency callers (e.g. the streamed\n // final-response render path, which fires per content delta) don't re-emit\n // the whole task map to every subscriber on each token.\n if (task && task.status !== status) {\n task.status = status;\n this._tasks$.next(new Map(current));\n }\n }\n\n /** @deprecated Use {@link UpdateStatus}. */\n updateStatus(id: string, status: string): void {\n return this.UpdateStatus(id, status);\n }\n\n /**\n * Get an active task by its conversation detail ID\n * @param conversationDetailId The conversation detail ID\n * @returns The task if found, undefined otherwise\n */\n GetByConversationDetailId(conversationDetailId: string): ActiveTask | undefined {\n const tasks = Array.from(this._tasks$.value.values());\n return tasks.find(task => task.conversationDetailId === conversationDetailId);\n }\n\n /** @deprecated Use {@link GetByConversationDetailId}. */\n getByConversationDetailId(conversationDetailId: string): ActiveTask | undefined {\n return this.GetByConversationDetailId(conversationDetailId);\n }\n\n /**\n * Update the status of a task by its conversation detail ID\n * @param conversationDetailId The conversation detail ID\n * @param status The new status text\n * @returns true if task was found and updated, false otherwise\n */\n UpdateStatusByConversationDetailId(conversationDetailId: string, status: string): boolean {\n const task = this.GetByConversationDetailId(conversationDetailId);\n if (task) {\n this.UpdateStatus(task.id, status);\n return true;\n }\n return false;\n }\n\n /** @deprecated Use {@link UpdateStatusByConversationDetailId}. */\n updateStatusByConversationDetailId(conversationDetailId: string, status: string): boolean {\n return this.UpdateStatusByConversationDetailId(conversationDetailId, status);\n }\n\n /**\n * Get an active task by its agent run ID\n * @param agentRunId The AIAgentRun ID\n * @returns The task if found, undefined otherwise\n */\n GetByAgentRunId(agentRunId: string): ActiveTask | undefined {\n const tasks = Array.from(this._tasks$.value.values());\n return tasks.find(task => task.agentRunId === agentRunId);\n }\n\n /** @deprecated Use {@link GetByAgentRunId}. */\n getByAgentRunId(agentRunId: string): ActiveTask | undefined {\n return this.GetByAgentRunId(agentRunId);\n }\n\n /**\n * Remove a task by its agent run ID\n * @param agentRunId The AIAgentRun ID\n * @returns true if task was found and removed, false otherwise\n */\n RemoveByAgentRunId(agentRunId: string): boolean {\n const task = this.GetByAgentRunId(agentRunId);\n if (task) {\n this.Remove(task.id);\n return true;\n }\n return false;\n }\n\n /** @deprecated Use {@link RemoveByAgentRunId}. */\n removeByAgentRunId(agentRunId: string): boolean {\n return this.RemoveByAgentRunId(agentRunId);\n }\n\n /**\n * Clear all active tasks\n */\n Clear(): void {\n this._tasks$.next(new Map());\n }\n\n /** @deprecated Use {@link Clear}. */\n clear(): void {\n return this.Clear();\n }\n\n /**\n * Restore active tasks from database by querying running agent runs.\n * Call this on app initialization to restore state after browser refresh.\n * @param currentUser The current user to filter agent runs by\n */\n async RestoreFromDatabase(currentUser: UserInfo): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Query for running agent runs owned by this user\n // Only restore parent agents (those with ConversationDetailID) - child agents don't have one\n // This matches normal behavior where we only track parent agents, not child agents\n const result = await rv.RunView<MJAIAgentRunEntity>({\n EntityName: 'MJ: AI Agent Runs',\n Fields: [\"ID\", \"ConversationID\", \"AgentID\", \"Agent\", \"ConversationDetailID\"], // narrow field scope to not pull back JSON blobs - much faster\n ExtraFilter: `Status='Running' AND UserID='${currentUser.ID}' AND ConversationDetailID IS NOT NULL`,\n ResultType: 'simple' // no need for entity-object here we aren't mutating\n }, currentUser);\n\n if (!result.Success || !result.Results || result.Results.length === 0) {\n // No running tasks or query failed - nothing to restore\n return;\n }\n\n // Get conversation names from cached ConversationEngine\n const conversationNames = new Map<string, string>();\n for (const agentRun of result.Results) {\n if (agentRun.ConversationID) {\n const conv = this.engine.GetConversation(agentRun.ConversationID);\n if (conv?.Name) {\n conversationNames.set(agentRun.ConversationID, conv.Name);\n }\n }\n }\n\n // Add each running agent to ActiveTasksService\n let restoredCount = 0;\n for (const agentRun of result.Results) {\n // Skip if already tracked (prevents duplicates)\n if (agentRun.ConversationDetailID &&\n this.GetByConversationDetailId(agentRun.ConversationDetailID)) {\n continue;\n }\n\n this.Add({\n agentName: agentRun.Agent || 'Unknown Agent',\n agentId: agentRun.AgentID,\n agentRunId: agentRun.ID, // For finding task on completion\n status: 'Reconnecting...',\n relatedMessageId: agentRun.ConversationDetailID || agentRun.ID,\n conversationDetailId: agentRun.ConversationDetailID || undefined,\n conversationId: agentRun.ConversationID || undefined,\n conversationName: agentRun.ConversationID\n ? conversationNames.get(agentRun.ConversationID) || null\n : null\n });\n restoredCount++;\n }\n\n if (restoredCount > 0) {\n console.log(`✅ Restored ${restoredCount} active task(s) from database`);\n }\n } catch (error) {\n console.error('Failed to restore active tasks from database:', error);\n }\n }\n\n /** @deprecated Use {@link RestoreFromDatabase}. */\n async restoreFromDatabase(currentUser: UserInfo): Promise<void> {\n return this.RestoreFromDatabase(currentUser);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"active-tasks.service.js","sourceRoot":"","sources":["../../../src/lib/services/active-tasks.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { RunView, UserInfo, Metadata, IMetadataProvider, LogStatusEx } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { MJAIAgentRunEntity } from '@memberjunction/core-entities';\nimport { ConversationEngine } from '@memberjunction/core-entities';\n\n/**\n * Represents an active agent task that is currently running\n */\nexport interface ActiveTask {\n id: string;\n agentName: string;\n agentId?: string; // The agent ID for looking up icon/metadata\n agentRunId?: string; // The AIAgentRun ID for finding task on completion\n status: string;\n relatedMessageId: string;\n conversationDetailId?: string; // The ConversationDetail that tracks this task\n conversationId?: string; // The conversation this task belongs to\n conversationName?: string | null; // Display name of the conversation\n startTime: number;\n}\n\n/**\n * Service for tracking active agent tasks across the application.\n * Maintains a live list of running agents and their status.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ActiveTasksService {\n private _tasks$ = new BehaviorSubject<Map<string, ActiveTask>>(new Map());\n private _conversationIdsWithTasks$ = new BehaviorSubject<Set<string>>(new Set());\n private engine = ConversationEngine.Instance;\n private _provider: IMetadataProvider | null = null;\n\n /**\n * Set the metadata provider this service should use. When unset, falls back to Metadata.Provider.\n */\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n\n /**\n * Observable of all active tasks as an array\n */\n public readonly Tasks$: Observable<ActiveTask[]> = this._tasks$.pipe(\n map(taskMap => Array.from(taskMap.values()))\n );\n\n /** @deprecated Use {@link Tasks$}. */\n public get tasks$(): Observable<ActiveTask[]> {\n return this.Tasks$;\n }\n\n /**\n * Observable of the count of active tasks\n */\n public readonly TaskCount$: Observable<number> = this.Tasks$.pipe(\n map(tasks => tasks.length)\n );\n\n /** @deprecated Use {@link TaskCount$}. */\n public get taskCount$(): Observable<number> {\n return this.TaskCount$;\n }\n\n /**\n * Observable of conversation IDs that have 1+ active tasks\n * Use this for quick lookups in conversation lists\n */\n public readonly ConversationIdsWithTasks$: Observable<Set<string>> = this._conversationIdsWithTasks$.asObservable();\n\n /** @deprecated Use {@link ConversationIdsWithTasks$}. */\n public get conversationIdsWithTasks$(): Observable<Set<string>> {\n return this.ConversationIdsWithTasks$;\n }\n\n /**\n * Observable of tasks grouped by conversation ID\n * Returns Map<conversationId, ActiveTask[]>\n */\n public readonly TasksByConversationId$: Observable<Map<string, ActiveTask[]>> = this.Tasks$.pipe(\n map(tasks => {\n const grouped = new Map<string, ActiveTask[]>();\n for (const task of tasks) {\n if (task.conversationId) {\n const existing = grouped.get(task.conversationId) || [];\n existing.push(task);\n grouped.set(task.conversationId, existing);\n }\n }\n return grouped;\n })\n );\n\n /** @deprecated Use {@link TasksByConversationId$}. */\n public get tasksByConversationId$(): Observable<Map<string, ActiveTask[]>> {\n return this.TasksByConversationId$;\n }\n\n /**\n * Add a new active task\n * @param task Task details (without id and startTime)\n * @returns The generated task ID\n */\n Add(task: Omit<ActiveTask, 'id' | 'startTime'>): string {\n const id = `task-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n const fullTask = {\n ...task,\n id,\n startTime: Date.now()\n };\n const current = this._tasks$.value;\n current.set(id, fullTask);\n this._tasks$.next(new Map(current));\n\n // Update conversation IDs set\n if (fullTask.conversationId) {\n this.updateConversationIdsSet();\n }\n\n // verboseOnly: three lines per add()/remove() is a lot of console for \"a Map changed size\", but\n // it is genuinely useful when tracing task lifecycle, so it stays available rather than going.\n LogStatusEx({ message: `➕ Task added:`, additionalArgs: [{id, conversationId: fullTask.conversationId, agentName: fullTask.agentName}], verboseOnly: true });\n LogStatusEx({ message: `📊 Total tasks:`, additionalArgs: [this._tasks$.value.size], verboseOnly: true });\n LogStatusEx({ message: `🗂️ Conversation IDs with tasks:`, additionalArgs: [Array.from(this._conversationIdsWithTasks$.value)], verboseOnly: true });\n\n return id;\n }\n\n /** @deprecated Use {@link Add}. */\n add(task: Omit<ActiveTask, 'id' | 'startTime'>): string {\n return this.Add(task);\n }\n\n /**\n * Remove an active task\n * @param id The task ID to remove\n */\n Remove(id: string): void {\n const current = this._tasks$.value;\n const task = current.get(id);\n current.delete(id);\n this._tasks$.next(new Map(current));\n\n // Update conversation IDs set if this was the last task for a conversation\n if (task?.conversationId) {\n this.updateConversationIdsSet();\n }\n\n LogStatusEx({ message: `➖ Task removed:`, additionalArgs: [{id, conversationId: task?.conversationId, agentName: task?.agentName}], verboseOnly: true });\n LogStatusEx({ message: `📊 Total tasks remaining:`, additionalArgs: [this._tasks$.value.size], verboseOnly: true });\n LogStatusEx({ message: `🗂️ Conversation IDs with tasks:`, additionalArgs: [Array.from(this._conversationIdsWithTasks$.value)], verboseOnly: true });\n }\n\n /** @deprecated Use {@link Remove}. */\n remove(id: string): void {\n return this.Remove(id);\n }\n\n /**\n * Update the set of conversation IDs with active tasks\n * @private\n */\n private updateConversationIdsSet(): void {\n const conversationIds = new Set<string>();\n for (const task of this._tasks$.value.values()) {\n if (task.conversationId) {\n conversationIds.add(task.conversationId);\n }\n }\n this._conversationIdsWithTasks$.next(conversationIds);\n }\n\n /**\n * Update the status of an active task\n * @param id The task ID\n * @param status The new status text\n */\n UpdateStatus(id: string, status: string): void {\n const current = this._tasks$.value;\n const task = current.get(id);\n // Same-value updates are no-ops so high-frequency callers (e.g. the streamed\n // final-response render path, which fires per content delta) don't re-emit\n // the whole task map to every subscriber on each token.\n if (task && task.status !== status) {\n task.status = status;\n this._tasks$.next(new Map(current));\n }\n }\n\n /** @deprecated Use {@link UpdateStatus}. */\n updateStatus(id: string, status: string): void {\n return this.UpdateStatus(id, status);\n }\n\n /**\n * Get an active task by its conversation detail ID\n * @param conversationDetailId The conversation detail ID\n * @returns The task if found, undefined otherwise\n */\n GetByConversationDetailId(conversationDetailId: string): ActiveTask | undefined {\n const tasks = Array.from(this._tasks$.value.values());\n return tasks.find(task => task.conversationDetailId === conversationDetailId);\n }\n\n /** @deprecated Use {@link GetByConversationDetailId}. */\n getByConversationDetailId(conversationDetailId: string): ActiveTask | undefined {\n return this.GetByConversationDetailId(conversationDetailId);\n }\n\n /**\n * Update the status of a task by its conversation detail ID\n * @param conversationDetailId The conversation detail ID\n * @param status The new status text\n * @returns true if task was found and updated, false otherwise\n */\n UpdateStatusByConversationDetailId(conversationDetailId: string, status: string): boolean {\n const task = this.GetByConversationDetailId(conversationDetailId);\n if (task) {\n this.UpdateStatus(task.id, status);\n return true;\n }\n return false;\n }\n\n /** @deprecated Use {@link UpdateStatusByConversationDetailId}. */\n updateStatusByConversationDetailId(conversationDetailId: string, status: string): boolean {\n return this.UpdateStatusByConversationDetailId(conversationDetailId, status);\n }\n\n /**\n * Get an active task by its agent run ID\n * @param agentRunId The AIAgentRun ID\n * @returns The task if found, undefined otherwise\n */\n GetByAgentRunId(agentRunId: string): ActiveTask | undefined {\n const tasks = Array.from(this._tasks$.value.values());\n return tasks.find(task => task.agentRunId === agentRunId);\n }\n\n /** @deprecated Use {@link GetByAgentRunId}. */\n getByAgentRunId(agentRunId: string): ActiveTask | undefined {\n return this.GetByAgentRunId(agentRunId);\n }\n\n /**\n * Remove a task by its agent run ID\n * @param agentRunId The AIAgentRun ID\n * @returns true if task was found and removed, false otherwise\n */\n RemoveByAgentRunId(agentRunId: string): boolean {\n const task = this.GetByAgentRunId(agentRunId);\n if (task) {\n this.Remove(task.id);\n return true;\n }\n return false;\n }\n\n /** @deprecated Use {@link RemoveByAgentRunId}. */\n removeByAgentRunId(agentRunId: string): boolean {\n return this.RemoveByAgentRunId(agentRunId);\n }\n\n /**\n * True when at least one active task is currently tracked for `conversationId`\n * (case-insensitive UUID comparison).\n */\n public HasActiveTasksForConversation(conversationId: string | null | undefined): boolean {\n if (!conversationId) {\n return false;\n }\n for (const task of this._tasks$.value.values()) {\n if (UUIDsEqual(task.conversationId, conversationId)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Clear all active tasks\n */\n Clear(): void {\n this._tasks$.next(new Map());\n }\n\n /** @deprecated Use {@link Clear}. */\n clear(): void {\n return this.Clear();\n }\n\n /**\n * Restore active tasks from database by querying running agent runs.\n * Call this on app initialization to restore state after browser refresh.\n * @param currentUser The current user to filter agent runs by\n */\n async RestoreFromDatabase(currentUser: UserInfo): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Query for running agent runs owned by this user\n // Only restore parent agents (those with ConversationDetailID) - child agents don't have one\n // This matches normal behavior where we only track parent agents, not child agents\n const result = await rv.RunView<MJAIAgentRunEntity>({\n EntityName: 'MJ: AI Agent Runs',\n Fields: [\"ID\", \"ConversationID\", \"AgentID\", \"Agent\", \"ConversationDetailID\"], // narrow field scope to not pull back JSON blobs - much faster\n ExtraFilter: `Status='Running' AND UserID='${currentUser.ID}' AND ConversationDetailID IS NOT NULL`,\n ResultType: 'simple' // no need for entity-object here we aren't mutating\n }, currentUser);\n\n if (!result.Success || !result.Results || result.Results.length === 0) {\n // No running tasks or query failed - nothing to restore\n return;\n }\n\n // Get conversation names from cached ConversationEngine\n const conversationNames = new Map<string, string>();\n for (const agentRun of result.Results) {\n if (agentRun.ConversationID) {\n const conv = this.engine.GetConversation(agentRun.ConversationID);\n if (conv?.Name) {\n conversationNames.set(agentRun.ConversationID, conv.Name);\n }\n }\n }\n\n // Add each running agent to ActiveTasksService\n let restoredCount = 0;\n for (const agentRun of result.Results) {\n // Skip if already tracked (prevents duplicates)\n if (agentRun.ConversationDetailID &&\n this.GetByConversationDetailId(agentRun.ConversationDetailID)) {\n continue;\n }\n\n this.Add({\n agentName: agentRun.Agent || 'Unknown Agent',\n agentId: agentRun.AgentID,\n agentRunId: agentRun.ID, // For finding task on completion\n status: 'Reconnecting...',\n relatedMessageId: agentRun.ConversationDetailID || agentRun.ID,\n conversationDetailId: agentRun.ConversationDetailID || undefined,\n conversationId: agentRun.ConversationID || undefined,\n conversationName: agentRun.ConversationID\n ? conversationNames.get(agentRun.ConversationID) || null\n : null\n });\n restoredCount++;\n }\n\n if (restoredCount > 0) {\n console.log(`✅ Restored ${restoredCount} active task(s) from database`);\n }\n } catch (error) {\n console.error('Failed to restore active tasks from database:', error);\n }\n }\n\n /** @deprecated Use {@link RestoreFromDatabase}. */\n async restoreFromDatabase(currentUser: UserInfo): Promise<void> {\n return this.RestoreFromDatabase(currentUser);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-state.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/agent-state.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,SAAS,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAmB,UAAU,EAA0B,MAAM,MAAM,CAAC;AAE3E,OAAO,EAAwB,QAAQ,EAAY,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEnG,OAAO,EAAsB,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;;AAE/G,MAAM,MAAM,WAAW,GAAG,eAAe,GAAG,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC;AAE7F,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,kBAAkB,CAAC;IACxB,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;;GAGG;AACH,qBAGa,iBAAkB,YAAW,SAAS;IACjD,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,gBAAgB,CAAC,CAAe;IACxC,OAAO,CAAC,WAAW,CAAC,CAAW;IAC/B,sGAAsG;IACtG,OAAO,CAAC,kBAAkB,CAAC,CAAS;IACpC,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,YAAY,CAAiB;IACrC,OAAO,CAAC,cAAc,CAAK;IAC3B;2FACuF;IACvF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAK;IAGvC,SAAgB,aAAa,gCAAsC;IAEnE,6CAA6C;IAC7C,IAAW,aAAa,kCAEvB;IAED,OAAO,CAAC,SAAS,CAAkC;;IAInD;;OAEG;IACH,IAAW,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,EAElD;IAED,IAAW,QAAQ,IAAI,iBAAiB,CAEvC;IAED,WAAW,IAAI,IAAI;IAInB;;;;;OAKG;IACH,YAAY,CAAC,WAAW,EAAE,QAAQ,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,KAAK,GAAE,iBAAiB,GAAG,IAAW,GAAG,IAAI;IAgB1G,4CAA4C;IAC5C,YAAY,CAAC,WAAW,EAAE,QAAQ,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,KAAK,GAAE,iBAAiB,GAAG,IAAW,GAAG,IAAI;IAI1G;;OAEG;IACH,WAAW,IAAI,IAAI;IAOnB,2CAA2C;IAC3C,WAAW,IAAI,IAAI;IAInB;;;OAGG;IACH,eAAe,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,eAAe,EAAE,CAAC;IAUvE,+CAA+C;IAC/C,eAAe,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,eAAe,EAAE,CAAC;IAIvE;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIzD,wCAAwC;IACxC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIzD;;;;OAIG;IACG,OAAO,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,KAAK,GAAE,iBAAiB,GAAG,IAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7F,uCAAuC;IACjC,OAAO,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,KAAK,GAAE,iBAAiB,GAAG,IAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7F;;;;OAIG;YACW,gBAAgB;
|
|
1
|
+
{"version":3,"file":"agent-state.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/agent-state.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -128,7 +128,12 @@ export class AgentStateService {
|
|
|
128
128
|
LogStatusEx({ message: `[${timestamp}] 🤖 AgentStateService.loadActiveAgents - Polling for active agents (conversation: ${conversationId || 'ALL'}, cycle: ${this.pollCycleCount})`, verboseOnly: true });
|
|
129
129
|
try {
|
|
130
130
|
const rv = RunView.FromMetadataProvider(this.Provider);
|
|
131
|
-
// Valid statuses: Running,
|
|
131
|
+
// Valid statuses: Running, Paused, AwaitingFeedback, Completed, Failed, Cancelled.
|
|
132
|
+
//
|
|
133
|
+
// AwaitingFeedback is NOT live: a Chat final step ends the run with CompletedAt stamped,
|
|
134
|
+
// so it is how a conversational turn normally finishes. Counting it here kept every past
|
|
135
|
+
// turn in the active set and polling never stopped. A reply that resumes the run sets it
|
|
136
|
+
// back to Running; a run parked on a workflow is Paused. Both are read below.
|
|
132
137
|
let filter = `Status IN ('Running', 'Paused')`;
|
|
133
138
|
if (conversationId) {
|
|
134
139
|
const inScope = ConversationEngine.ScopeSubquery(scope ?? ConversationEngine.TrunkScope(conversationId));
|
|
@@ -277,6 +282,7 @@ export class AgentStateService {
|
|
|
277
282
|
ExtraFilter: `ConversationDetailID='${conversationDetailId}' AND Status IN ('Running', 'Paused')`,
|
|
278
283
|
OrderBy: 'StartedAt DESC',
|
|
279
284
|
MaxRows: 1,
|
|
285
|
+
SkipTotalRowCount: true,
|
|
280
286
|
Fields: ['ID'],
|
|
281
287
|
ResultType: 'simple'
|
|
282
288
|
}, this.currentUser);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-state.service.js","sourceRoot":"","sources":["../../../src/lib/services/agent-state.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,eAAe,EAAc,QAAQ,EAAgB,MAAM,MAAM,CAAC;AAC3E,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,OAAO,EAAY,QAAQ,EAAqB,MAAM,sBAAsB,CAAC;AACnG,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAA8C,MAAM,+BAA+B,CAAC;;AAU/G;;;GAGG;AAIH,MAAM,OAAO,iBAAiB;IACpB,cAAc,GAAG,IAAI,eAAe,CAAoB,EAAE,CAAC,CAAC;IAC5D,gBAAgB,CAAgB;IAChC,WAAW,CAAY;IAC/B,sGAAsG;IAC9F,kBAAkB,CAAU;IAC5B,SAAS,GAA6B,IAAI,CAAC;IAC3C,YAAY,GAAW,KAAK,CAAC,CAAC,8DAA8D;IAC5F,cAAc,GAAG,CAAC,CAAC;IAC3B;2FACuF;IACtE,iBAAiB,GAAG,CAAC,CAAC;IAEvC,4BAA4B;IACZ,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;IAEnE,6CAA6C;IAC7C,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAEO,SAAS,GAA6B,IAAI,CAAC;IAEnD,gBAAe,CAAC;IAEhB;;OAEG;IACH,IAAW,QAAQ,CAAC,KAA+B;QAC/C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,SAAS,IAAI,QAAQ,CAAC,QAAQ,CAAC;IAC/C,CAAC;IAED,WAAW;QACT,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,WAAqB,EAAE,cAAuB,EAAE,QAAkC,IAAI;QACjG,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,kBAAkB,GAAG,cAAc,CAAC;QACzC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;QAExB,eAAe;QACf,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QAE7C,gBAAgB;QAChB,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC;aAChD,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC;aACnE,SAAS,EAAE,CAAC;IACjB,CAAC;IAED,4CAA4C;IAC5C,YAAY,CAAC,WAAqB,EAAE,cAAuB,EAAE,QAAkC,IAAI;QACjG,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,WAAW;QACT,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC;YACpC,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;QACpC,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,WAAW;QACT,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,cAAuB;QACrC,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAC5B,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC,EACnF,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,+CAA+C;IAC/C,eAAe,CAAC,cAAuB;QACrC,OAAO,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;IAC9C,CAAC;IAED;;;OAGG;IACH,QAAQ,CAAC,UAAkB;QACzB,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/E,CAAC;IAED,wCAAwC;IACxC,QAAQ,CAAC,UAAkB;QACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,cAAuB,EAAE,QAAkC,IAAI;QAC3E,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;IAED,uCAAuC;IACvC,KAAK,CAAC,OAAO,CAAC,cAAuB,EAAE,QAAkC,IAAI;QAC3E,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,gBAAgB,CAAC,cAAuB,EAAE,QAAkC,IAAI;QAC5F,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,WAAW,CAAC,EAAC,OAAO,EAAE,IAAI,SAAS,sFAAsF,cAAc,IAAI,KAAK,YAAY,IAAI,CAAC,cAAc,GAAG,EAAE,WAAW,EAAE,IAAI,EAAC,CAAC,CAAC;QAExM,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvD,gEAAgE;YAChE,IAAI,MAAM,GAAG,iCAAiC,CAAC;YAE/C,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,OAAO,GAAG,kBAAkB,CAAC,aAAa,CAAC,KAAK,IAAI,kBAAkB,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;gBACzG,MAAM,IAAI,SAAS,OAAO,0BAA0B,eAAe,CAAC,cAAc,CAAC,wCAAwC,CAAC;YAC9H,CAAC;YAED,WAAW,CAAC,EAAC,OAAO,EAAE,IAAI,SAAS,8DAA8D,EAAE,WAAW,EAAE,IAAI,EAAC,CAAC,CAAC;YACvH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAC7B;gBACE,UAAU,EAAE,mBAAmB;gBAC/B,WAAW,EAAE,MAAM;gBACnB,OAAO,EAAE,gBAAgB;gBACzB,OAAO,EAAE,EAAE;gBACX,UAAU,EAAE,eAAe;aAC5B,EACD,IAAI,CAAC,WAAW,CACjB,CAAC;YAEF,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;gBAClC,WAAW,CAAC,EAAC,OAAO,EAAE,IAAI,SAAS,kCAAkC,IAAI,CAAC,MAAM,kBAAkB,EAAE,WAAW,EAAE,IAAI,EAAC,CAAC,CAAC;gBACxH,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC5E,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBAE3C,4FAA4F;gBAC5F,mFAAmF;gBACnF,sDAAsD;gBACtD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBAChG,WAAW,CAAC,EAAC,OAAO,EAAE,IAAI,SAAS,mDAAmD,IAAI,CAAC,cAAc,2BAA2B,EAAE,WAAW,EAAE,IAAI,EAAC,CAAC,CAAC;oBAC1J,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED;;OAEG;IACK,uBAAuB,CAAC,GAAuB;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAE/C,OAAO;YACL,GAAG;YACH,MAAM;YACN,UAAU;SACX,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,oBAAoB,CAAC,GAAuB;QAClD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,SAAS,CAAC;QAEtD,mBAAmB;QACnB,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC9C,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,uBAAuB;QACvB,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC5E,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,oDAAoD;QACpD,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAClB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;YAC/D,MAAM,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC;YAE/B,iCAAiC;YACjC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,OAAO,eAAe,CAAC;YACzB,CAAC;YAED,8DAA8D;YAC9D,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC7B,OAAO,YAAY,CAAC;YACtB,CAAC;YAED,qBAAqB;YACrB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,2CAA2C;QAC3C,OAAO,eAAe,CAAC;IACzB,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,GAAuB;QAC/C,uFAAuF;QACvF,gEAAgE;QAChE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,MAAM,CAAC;YAC/C,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,MAAM,GAA4C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC5E,IAAI,MAAM,EAAE,UAAU,IAAI,IAAI,EAAE,CAAC;oBAC/B,OAAO,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;gBAC/C,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,WAAW,CAAC,UAAkB;QAClC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAqB,mBAAmB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAC3G,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBAChC,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACxD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,GAAG,CAAC,MAAM,GAAG,WAAW,CAAC;YACzB,GAAG,CAAC,kBAAkB,GAAG,cAAc,CAAC;YACxC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,4BAA4B,UAAU,KAAK,GAAG,CAAC,YAAY,EAAE,eAAe,IAAI,eAAe,EAAE,CAAC,CAAC;gBACjH,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;YAChD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,oBAAoB,CAAC,oBAA4B;QACrD,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAC7B;gBACE,UAAU,EAAE,mBAAmB;gBAC/B,WAAW,EAAE,yBAAyB,oBAAoB,uCAAuC;gBACjG,OAAO,EAAE,gBAAgB;gBACzB,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,CAAC,IAAI,CAAC;gBACd,UAAU,EAAE,QAAQ;aACrB,EACD,IAAI,CAAC,WAAW,CACjB,CAAC;YACF,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACnE,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;YAChE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,KAAK,CAAC,WAAW,CAAC,UAAkB;QAClC,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,YAAoB;QAClC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QAEjC,0EAA0E;QAC1E,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC9C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,eAAe,CAAC,YAAoB;QAClC,OAAO,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;IAC5C,CAAC;2GA/VU,iBAAiB;gEAAjB,iBAAiB,WAAjB,iBAAiB,mBAFhB,MAAM;;iFAEP,iBAAiB;cAH7B,UAAU;eAAC;gBACV,UAAU,EAAE,MAAM;aACnB","sourcesContent":["import { Injectable, OnDestroy } from '@angular/core';\nimport { BehaviorSubject, Observable, interval, Subscription } from 'rxjs';\nimport { map, shareReplay, switchMap } from 'rxjs/operators';\nimport { LogStatusEx, RunView, UserInfo, Metadata, IMetadataProvider } from '@memberjunction/core';\nimport { EscapeSQLString, UUIDsEqual } from '@memberjunction/global';\nimport { ConversationEngine, MJAIAgentRunEntity, type ConversationScope } from '@memberjunction/core-entities';\n\nexport type AgentStatus = 'acknowledging' | 'working' | 'completing' | 'completed' | 'error';\n\nexport interface AgentWithStatus {\n run: MJAIAgentRunEntity;\n status: AgentStatus;\n confidence: number | null;\n}\n\n/**\n * Manages agent state and provides real-time updates for active agents\n * Polls for agent status changes and provides reactive streams\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class AgentStateService implements OnDestroy {\n private _activeAgents$ = new BehaviorSubject<AgentWithStatus[]>([]);\n private pollSubscription?: Subscription;\n private currentUser?: UserInfo;\n /** The conversation and scope polling was started with, so a restart (SetPollInterval) keeps them. */\n private pollConversationId?: string;\n private pollScope: ConversationScope | null = null;\n private pollInterval: number = 30000; // Poll every 30 seconds (reduced from 3s to minimize DB load)\n private pollCycleCount = 0;\n /** Minimum poll cycles before allowing auto-stop. Prevents premature shutdown\n * when fire-and-forget ACK returns before the server creates the agent run record. */\n private readonly minimumPollCycles = 3;\n\n // Public observable streams\n public readonly ActiveAgents$ = this._activeAgents$.asObservable();\n\n /** @deprecated Use {@link ActiveAgents$}. */\n public get activeAgents$() {\n return this.ActiveAgents$;\n }\n\n private _provider: IMetadataProvider | null = null;\n\n constructor() {}\n\n /**\n * Set the metadata provider this service should use. When unset, falls back to Metadata.Provider.\n */\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n\n ngOnDestroy(): void {\n this.StopPolling();\n }\n\n /**\n * Starts polling for active agents\n * @param currentUser The current user context\n * @param conversationId Optional conversation ID to filter by\n * @param scope The conversation scope whose runs are read; the trunk of `conversationId` when null\n */\n StartPolling(currentUser: UserInfo, conversationId?: string, scope: ConversationScope | null = null): void {\n this.currentUser = currentUser;\n this.StopPolling();\n this.pollConversationId = conversationId;\n this.pollScope = scope;\n this.pollCycleCount = 0;\n\n // Initial load\n this.loadActiveAgents(conversationId, scope);\n\n // Start polling\n this.pollSubscription = interval(this.pollInterval)\n .pipe(switchMap(() => this.loadActiveAgents(conversationId, scope)))\n .subscribe();\n }\n\n /** @deprecated Use {@link StartPolling}. */\n startPolling(currentUser: UserInfo, conversationId?: string, scope: ConversationScope | null = null): void {\n return this.StartPolling(currentUser, conversationId, scope);\n }\n\n /**\n * Stops polling for active agents\n */\n StopPolling(): void {\n if (this.pollSubscription) {\n this.pollSubscription.unsubscribe();\n this.pollSubscription = undefined;\n }\n }\n\n /** @deprecated Use {@link StopPolling}. */\n stopPolling(): void {\n return this.StopPolling();\n }\n\n /**\n * Gets active agents as an observable\n * @param conversationId Optional conversation ID to filter by\n */\n GetActiveAgents(conversationId?: string): Observable<AgentWithStatus[]> {\n if (conversationId) {\n return this.ActiveAgents$.pipe(\n map(agents => agents.filter(a => UUIDsEqual(a.run.ConversationID, conversationId))),\n shareReplay(1)\n );\n }\n return this.ActiveAgents$;\n }\n\n /** @deprecated Use {@link GetActiveAgents}. */\n getActiveAgents(conversationId?: string): Observable<AgentWithStatus[]> {\n return this.GetActiveAgents(conversationId);\n }\n\n /**\n * Gets a specific agent by ID\n * @param agentRunId The agent run ID\n */\n GetAgent(agentRunId: string): AgentWithStatus | undefined {\n return this._activeAgents$.value.find(a => UUIDsEqual(a.run.ID, agentRunId));\n }\n\n /** @deprecated Use {@link GetAgent}. */\n getAgent(agentRunId: string): AgentWithStatus | undefined {\n return this.GetAgent(agentRunId);\n }\n\n /**\n * Manually refreshes active agents\n * @param conversationId Optional conversation ID to filter by\n * @param scope The conversation scope whose runs are read; the trunk of `conversationId` when null\n */\n async Refresh(conversationId?: string, scope: ConversationScope | null = null): Promise<void> {\n await this.loadActiveAgents(conversationId, scope);\n }\n\n /** @deprecated Use {@link Refresh}. */\n async refresh(conversationId?: string, scope: ConversationScope | null = null): Promise<void> {\n return this.Refresh(conversationId, scope);\n }\n\n /**\n * Loads the running and paused agent runs from the database. With a conversation, only runs\n * whose conversation detail is in `scope` (the trunk of `conversationId` when null), plus the\n * conversation's runs that have no conversation detail, which belong to every path.\n */\n private async loadActiveAgents(conversationId?: string, scope: ConversationScope | null = null): Promise<void> {\n if (!this.currentUser) {\n return;\n }\n\n this.pollCycleCount++;\n const timestamp = new Date().toISOString();\n LogStatusEx({message: `[${timestamp}] 🤖 AgentStateService.loadActiveAgents - Polling for active agents (conversation: ${conversationId || 'ALL'}, cycle: ${this.pollCycleCount})`, verboseOnly: true});\n\n try {\n const rv = RunView.FromMetadataProvider(this.Provider);\n // Valid statuses: Running, Completed, Paused, Failed, Cancelled\n let filter = `Status IN ('Running', 'Paused')`;\n\n if (conversationId) {\n const inScope = ConversationEngine.ScopeSubquery(scope ?? ConversationEngine.TrunkScope(conversationId));\n filter += ` AND (${inScope} OR ([ConversationID]='${EscapeSQLString(conversationId)}' AND [ConversationDetailID] IS NULL))`;\n }\n\n LogStatusEx({message: `[${timestamp}] 🤖 AgentStateService - Executing RunView for AI Agent Runs`, verboseOnly: true});\n const result = await rv.RunView<MJAIAgentRunEntity>(\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: filter,\n OrderBy: 'StartedAt DESC',\n MaxRows: 50,\n ResultType: 'entity_object'\n },\n this.currentUser\n );\n\n if (result.Success) {\n const runs = result.Results || [];\n LogStatusEx({message: `[${timestamp}] 🤖 AgentStateService - Found ${runs.length} active agent(s)`, verboseOnly: true});\n const agentsWithStatus = runs.map(run => this.mapRunToAgentWithStatus(run));\n this._activeAgents$.next(agentsWithStatus);\n\n // Stop polling if no active agents AND minimum cycles met (optimization to reduce DB load).\n // The minimum cycle guard prevents premature shutdown when fire-and-forget returns\n // before the server has created the agent run record.\n if (runs.length === 0 && this.pollSubscription && this.pollCycleCount >= this.minimumPollCycles) {\n LogStatusEx({message: `[${timestamp}] 🤖 AgentStateService - No active agents after ${this.pollCycleCount} cycles, stopping polling`, verboseOnly: true});\n this.StopPolling();\n }\n }\n } catch (error) {\n console.error('Failed to load active agents:', error);\n }\n }\n\n /**\n * Maps an agent run to include status and confidence information\n */\n private mapRunToAgentWithStatus(run: MJAIAgentRunEntity): AgentWithStatus {\n const status = this.determineAgentStatus(run);\n const confidence = this.extractConfidence(run);\n\n return {\n run,\n status,\n confidence\n };\n }\n\n /**\n * Determines the agent status based on the run entity\n */\n private determineAgentStatus(run: MJAIAgentRunEntity): AgentStatus {\n const status = run.Status?.toLowerCase() || 'running';\n\n // Check for errors\n if (status === 'error' || status === 'failed') {\n return 'error';\n }\n\n // Check for completion\n if (status === 'completed' || status === 'complete' || status === 'success') {\n return 'completed';\n }\n\n // Determine stage based on progress or elapsed time\n if (run.StartedAt) {\n const elapsed = Date.now() - new Date(run.StartedAt).getTime();\n const seconds = elapsed / 1000;\n\n // First 5 seconds: acknowledging\n if (seconds < 5) {\n return 'acknowledging';\n }\n\n // A run that is no longer Running has reached its final block\n if (run.Status !== 'Running') {\n return 'completing';\n }\n\n // Otherwise, working\n return 'working';\n }\n\n // Default to acknowledging if just started\n return 'acknowledging';\n }\n\n /**\n * Extracts confidence score from agent run if available\n */\n private extractConfidence(run: MJAIAgentRunEntity): number | null {\n // Try to parse confidence from the run payload (FinalPayload, or Result on older rows)\n // This is a placeholder - adjust based on actual data structure\n try {\n const payload = run.FinalPayload ?? run.Result;\n if (payload) {\n const result: { confidence?: number | string } | null = JSON.parse(payload);\n if (result?.confidence != null) {\n return parseFloat(String(result.confidence));\n }\n }\n } catch {\n // Ignore parse errors\n }\n\n return null;\n }\n\n /**\n * Stops an agent run that is still in flight.\n *\n * The run's row is the control channel: this marks it `Cancelled` with reason `User Request`,\n * and the server process that owns the run notices within a few seconds (the agent-run\n * watchdog's cancellation poll), aborts the in-flight step through the run's cancellation\n * token, and finalizes the run — keeping the payload as it stood — and its reply as stopped.\n * No request reaches the running process directly, so this works whichever replica owns it.\n *\n * The row is loaded fresh rather than taken from the polled active-agent list, which refreshes\n * every 30 seconds and may not hold a run that started a moment ago.\n *\n * @returns true when the row was marked; false when the run was not found, had already\n * finished (nothing to stop), or the save was refused.\n */\n async CancelAgent(agentRunId: string): Promise<boolean> {\n try {\n const run = await this.Provider.GetEntityObject<MJAIAgentRunEntity>('MJ: AI Agent Runs', this.currentUser);\n if (!await run.Load(agentRunId)) {\n return false;\n }\n if (run.Status !== 'Running' && run.Status !== 'Paused') {\n return false;\n }\n\n run.Status = 'Cancelled';\n run.CancellationReason = 'User Request';\n const saved = await run.Save();\n if (!saved) {\n console.error(`Failed to stop agent run ${agentRunId}: ${run.LatestResult?.CompleteMessage ?? 'unknown error'}`);\n return false;\n }\n\n await this.Refresh();\n return true;\n } catch (error) {\n console.error('Failed to cancel agent:', error);\n return false;\n }\n }\n\n /**\n * Stops the in-flight run behind an agent's reply message, for callers that know the\n * conversation detail but not yet the run (the run row is created a moment after the reply\n * placeholder). Finds the newest Running or Paused run for that detail and stops it.\n *\n * @returns true when a run was found and marked; false otherwise.\n */\n async CancelAgentForDetail(conversationDetailId: string): Promise<boolean> {\n try {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<{ ID: string }>(\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `ConversationDetailID='${conversationDetailId}' AND Status IN ('Running', 'Paused')`,\n OrderBy: 'StartedAt DESC',\n MaxRows: 1,\n Fields: ['ID'],\n ResultType: 'simple'\n },\n this.currentUser\n );\n const runId = result.Success ? result.Results?.[0]?.ID : undefined;\n if (!runId) {\n return false;\n }\n return await this.CancelAgent(runId);\n } catch (error) {\n console.error('Failed to find the agent run to cancel:', error);\n return false;\n }\n }\n\n /** @deprecated Use {@link CancelAgent}. */\n async cancelAgent(agentRunId: string): Promise<boolean> {\n return this.CancelAgent(agentRunId);\n }\n\n /**\n * Updates the poll interval\n * @param milliseconds The new poll interval in milliseconds\n */\n SetPollInterval(milliseconds: number): void {\n this.pollInterval = milliseconds;\n\n // Restart polling if currently active, on the same conversation and scope\n if (this.pollSubscription && this.currentUser) {\n this.StartPolling(this.currentUser, this.pollConversationId, this.pollScope);\n }\n }\n\n /** @deprecated Use {@link SetPollInterval}. */\n setPollInterval(milliseconds: number): void {\n return this.SetPollInterval(milliseconds);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agent-state.service.js","sourceRoot":"","sources":["../../../src/lib/services/agent-state.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, OnDestroy } from '@angular/core';\nimport { BehaviorSubject, Observable, interval, Subscription } from 'rxjs';\nimport { map, shareReplay, switchMap } from 'rxjs/operators';\nimport { LogStatusEx, RunView, UserInfo, Metadata, IMetadataProvider } from '@memberjunction/core';\nimport { EscapeSQLString, UUIDsEqual } from '@memberjunction/global';\nimport { ConversationEngine, MJAIAgentRunEntity, type ConversationScope } from '@memberjunction/core-entities';\n\nexport type AgentStatus = 'acknowledging' | 'working' | 'completing' | 'completed' | 'error';\n\nexport interface AgentWithStatus {\n run: MJAIAgentRunEntity;\n status: AgentStatus;\n confidence: number | null;\n}\n\n/**\n * Manages agent state and provides real-time updates for active agents\n * Polls for agent status changes and provides reactive streams\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class AgentStateService implements OnDestroy {\n private _activeAgents$ = new BehaviorSubject<AgentWithStatus[]>([]);\n private pollSubscription?: Subscription;\n private currentUser?: UserInfo;\n /** The conversation and scope polling was started with, so a restart (SetPollInterval) keeps them. */\n private pollConversationId?: string;\n private pollScope: ConversationScope | null = null;\n private pollInterval: number = 30000; // Poll every 30 seconds (reduced from 3s to minimize DB load)\n private pollCycleCount = 0;\n /** Minimum poll cycles before allowing auto-stop. Prevents premature shutdown\n * when fire-and-forget ACK returns before the server creates the agent run record. */\n private readonly minimumPollCycles = 3;\n\n // Public observable streams\n public readonly ActiveAgents$ = this._activeAgents$.asObservable();\n\n /** @deprecated Use {@link ActiveAgents$}. */\n public get activeAgents$() {\n return this.ActiveAgents$;\n }\n\n private _provider: IMetadataProvider | null = null;\n\n constructor() {}\n\n /**\n * Set the metadata provider this service should use. When unset, falls back to Metadata.Provider.\n */\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n\n ngOnDestroy(): void {\n this.StopPolling();\n }\n\n /**\n * Starts polling for active agents\n * @param currentUser The current user context\n * @param conversationId Optional conversation ID to filter by\n * @param scope The conversation scope whose runs are read; the trunk of `conversationId` when null\n */\n StartPolling(currentUser: UserInfo, conversationId?: string, scope: ConversationScope | null = null): void {\n this.currentUser = currentUser;\n this.StopPolling();\n this.pollConversationId = conversationId;\n this.pollScope = scope;\n this.pollCycleCount = 0;\n\n // Initial load\n this.loadActiveAgents(conversationId, scope);\n\n // Start polling\n this.pollSubscription = interval(this.pollInterval)\n .pipe(switchMap(() => this.loadActiveAgents(conversationId, scope)))\n .subscribe();\n }\n\n /** @deprecated Use {@link StartPolling}. */\n startPolling(currentUser: UserInfo, conversationId?: string, scope: ConversationScope | null = null): void {\n return this.StartPolling(currentUser, conversationId, scope);\n }\n\n /**\n * Stops polling for active agents\n */\n StopPolling(): void {\n if (this.pollSubscription) {\n this.pollSubscription.unsubscribe();\n this.pollSubscription = undefined;\n }\n }\n\n /** @deprecated Use {@link StopPolling}. */\n stopPolling(): void {\n return this.StopPolling();\n }\n\n /**\n * Gets active agents as an observable\n * @param conversationId Optional conversation ID to filter by\n */\n GetActiveAgents(conversationId?: string): Observable<AgentWithStatus[]> {\n if (conversationId) {\n return this.ActiveAgents$.pipe(\n map(agents => agents.filter(a => UUIDsEqual(a.run.ConversationID, conversationId))),\n shareReplay(1)\n );\n }\n return this.ActiveAgents$;\n }\n\n /** @deprecated Use {@link GetActiveAgents}. */\n getActiveAgents(conversationId?: string): Observable<AgentWithStatus[]> {\n return this.GetActiveAgents(conversationId);\n }\n\n /**\n * Gets a specific agent by ID\n * @param agentRunId The agent run ID\n */\n GetAgent(agentRunId: string): AgentWithStatus | undefined {\n return this._activeAgents$.value.find(a => UUIDsEqual(a.run.ID, agentRunId));\n }\n\n /** @deprecated Use {@link GetAgent}. */\n getAgent(agentRunId: string): AgentWithStatus | undefined {\n return this.GetAgent(agentRunId);\n }\n\n /**\n * Manually refreshes active agents\n * @param conversationId Optional conversation ID to filter by\n * @param scope The conversation scope whose runs are read; the trunk of `conversationId` when null\n */\n async Refresh(conversationId?: string, scope: ConversationScope | null = null): Promise<void> {\n await this.loadActiveAgents(conversationId, scope);\n }\n\n /** @deprecated Use {@link Refresh}. */\n async refresh(conversationId?: string, scope: ConversationScope | null = null): Promise<void> {\n return this.Refresh(conversationId, scope);\n }\n\n /**\n * Loads the running and paused agent runs from the database. With a conversation, only runs\n * whose conversation detail is in `scope` (the trunk of `conversationId` when null), plus the\n * conversation's runs that have no conversation detail, which belong to every path.\n */\n private async loadActiveAgents(conversationId?: string, scope: ConversationScope | null = null): Promise<void> {\n if (!this.currentUser) {\n return;\n }\n\n this.pollCycleCount++;\n const timestamp = new Date().toISOString();\n LogStatusEx({message: `[${timestamp}] 🤖 AgentStateService.loadActiveAgents - Polling for active agents (conversation: ${conversationId || 'ALL'}, cycle: ${this.pollCycleCount})`, verboseOnly: true});\n\n try {\n const rv = RunView.FromMetadataProvider(this.Provider);\n // Valid statuses: Running, Paused, AwaitingFeedback, Completed, Failed, Cancelled.\n //\n // AwaitingFeedback is NOT live: a Chat final step ends the run with CompletedAt stamped,\n // so it is how a conversational turn normally finishes. Counting it here kept every past\n // turn in the active set and polling never stopped. A reply that resumes the run sets it\n // back to Running; a run parked on a workflow is Paused. Both are read below.\n let filter = `Status IN ('Running', 'Paused')`;\n\n if (conversationId) {\n const inScope = ConversationEngine.ScopeSubquery(scope ?? ConversationEngine.TrunkScope(conversationId));\n filter += ` AND (${inScope} OR ([ConversationID]='${EscapeSQLString(conversationId)}' AND [ConversationDetailID] IS NULL))`;\n }\n\n LogStatusEx({message: `[${timestamp}] 🤖 AgentStateService - Executing RunView for AI Agent Runs`, verboseOnly: true});\n const result = await rv.RunView<MJAIAgentRunEntity>(\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: filter,\n OrderBy: 'StartedAt DESC',\n MaxRows: 50,\n ResultType: 'entity_object'\n },\n this.currentUser\n );\n\n if (result.Success) {\n const runs = result.Results || [];\n LogStatusEx({message: `[${timestamp}] 🤖 AgentStateService - Found ${runs.length} active agent(s)`, verboseOnly: true});\n const agentsWithStatus = runs.map(run => this.mapRunToAgentWithStatus(run));\n this._activeAgents$.next(agentsWithStatus);\n\n // Stop polling if no active agents AND minimum cycles met (optimization to reduce DB load).\n // The minimum cycle guard prevents premature shutdown when fire-and-forget returns\n // before the server has created the agent run record.\n if (runs.length === 0 && this.pollSubscription && this.pollCycleCount >= this.minimumPollCycles) {\n LogStatusEx({message: `[${timestamp}] 🤖 AgentStateService - No active agents after ${this.pollCycleCount} cycles, stopping polling`, verboseOnly: true});\n this.StopPolling();\n }\n }\n } catch (error) {\n console.error('Failed to load active agents:', error);\n }\n }\n\n /**\n * Maps an agent run to include status and confidence information\n */\n private mapRunToAgentWithStatus(run: MJAIAgentRunEntity): AgentWithStatus {\n const status = this.determineAgentStatus(run);\n const confidence = this.extractConfidence(run);\n\n return {\n run,\n status,\n confidence\n };\n }\n\n /**\n * Determines the agent status based on the run entity\n */\n private determineAgentStatus(run: MJAIAgentRunEntity): AgentStatus {\n const status = run.Status?.toLowerCase() || 'running';\n\n // Check for errors\n if (status === 'error' || status === 'failed') {\n return 'error';\n }\n\n // Check for completion\n if (status === 'completed' || status === 'complete' || status === 'success') {\n return 'completed';\n }\n\n // Determine stage based on progress or elapsed time\n if (run.StartedAt) {\n const elapsed = Date.now() - new Date(run.StartedAt).getTime();\n const seconds = elapsed / 1000;\n\n // First 5 seconds: acknowledging\n if (seconds < 5) {\n return 'acknowledging';\n }\n\n // A run that is no longer Running has reached its final block\n if (run.Status !== 'Running') {\n return 'completing';\n }\n\n // Otherwise, working\n return 'working';\n }\n\n // Default to acknowledging if just started\n return 'acknowledging';\n }\n\n /**\n * Extracts confidence score from agent run if available\n */\n private extractConfidence(run: MJAIAgentRunEntity): number | null {\n // Try to parse confidence from the run payload (FinalPayload, or Result on older rows)\n // This is a placeholder - adjust based on actual data structure\n try {\n const payload = run.FinalPayload ?? run.Result;\n if (payload) {\n const result: { confidence?: number | string } | null = JSON.parse(payload);\n if (result?.confidence != null) {\n return parseFloat(String(result.confidence));\n }\n }\n } catch {\n // Ignore parse errors\n }\n\n return null;\n }\n\n /**\n * Stops an agent run that is still in flight.\n *\n * The run's row is the control channel: this marks it `Cancelled` with reason `User Request`,\n * and the server process that owns the run notices within a few seconds (the agent-run\n * watchdog's cancellation poll), aborts the in-flight step through the run's cancellation\n * token, and finalizes the run — keeping the payload as it stood — and its reply as stopped.\n * No request reaches the running process directly, so this works whichever replica owns it.\n *\n * The row is loaded fresh rather than taken from the polled active-agent list, which refreshes\n * every 30 seconds and may not hold a run that started a moment ago.\n *\n * @returns true when the row was marked; false when the run was not found, had already\n * finished (nothing to stop), or the save was refused.\n */\n async CancelAgent(agentRunId: string): Promise<boolean> {\n try {\n const run = await this.Provider.GetEntityObject<MJAIAgentRunEntity>('MJ: AI Agent Runs', this.currentUser);\n if (!await run.Load(agentRunId)) {\n return false;\n }\n if (run.Status !== 'Running' && run.Status !== 'Paused') {\n return false;\n }\n\n run.Status = 'Cancelled';\n run.CancellationReason = 'User Request';\n const saved = await run.Save();\n if (!saved) {\n console.error(`Failed to stop agent run ${agentRunId}: ${run.LatestResult?.CompleteMessage ?? 'unknown error'}`);\n return false;\n }\n\n await this.Refresh();\n return true;\n } catch (error) {\n console.error('Failed to cancel agent:', error);\n return false;\n }\n }\n\n /**\n * Stops the in-flight run behind an agent's reply message, for callers that know the\n * conversation detail but not yet the run (the run row is created a moment after the reply\n * placeholder). Finds the newest Running or Paused run for that detail and stops it.\n *\n * @returns true when a run was found and marked; false otherwise.\n */\n async CancelAgentForDetail(conversationDetailId: string): Promise<boolean> {\n try {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<{ ID: string }>(\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `ConversationDetailID='${conversationDetailId}' AND Status IN ('Running', 'Paused')`,\n OrderBy: 'StartedAt DESC',\n MaxRows: 1,\n SkipTotalRowCount: true,\n Fields: ['ID'],\n ResultType: 'simple'\n },\n this.currentUser\n );\n const runId = result.Success ? result.Results?.[0]?.ID : undefined;\n if (!runId) {\n return false;\n }\n return await this.CancelAgent(runId);\n } catch (error) {\n console.error('Failed to find the agent run to cancel:', error);\n return false;\n }\n }\n\n /** @deprecated Use {@link CancelAgent}. */\n async cancelAgent(agentRunId: string): Promise<boolean> {\n return this.CancelAgent(agentRunId);\n }\n\n /**\n * Updates the poll interval\n * @param milliseconds The new poll interval in milliseconds\n */\n SetPollInterval(milliseconds: number): void {\n this.pollInterval = milliseconds;\n\n // Restart polling if currently active, on the same conversation and scope\n if (this.pollSubscription && this.currentUser) {\n this.StartPolling(this.currentUser, this.pollConversationId, this.pollScope);\n }\n }\n\n /** @deprecated Use {@link SetPollInterval}. */\n setPollInterval(milliseconds: number): void {\n return this.SetPollInterval(milliseconds);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-permission.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/artifact-permission.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAqB,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAE,0BAA0B,EAAgD,MAAM,+BAA+B,CAAC;AAEzH,OAAO,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;;AAQ9E,MAAM,WAAW,kBAAkB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,EAAE,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC3D,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,YAAY,CAAC;IAC5C,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACrB;AAED,qBAGa,yBAAyB;IAI9B,OAAO,CAAC,2BAA2B;IAHvC,OAAO,CAAC,SAAS,CAAkC;gBAGvC,2BAA2B,EAAE,2BAA2B;IAGpE;;;OAGG;IACH,IAAW,QAAQ,IAAI,iBAAiB,CAEvC;IACD,IAAW,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,EAKlD;IAED;;OAEG;IACG,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAe/F,+CAA+C;IACzC,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAI/F;;;OAGG;IACG,eAAe,CACjB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,EACrC,WAAW,EAAE,QAAQ,GACtB,OAAO,CAAC,OAAO,CAAC;IA+BnB,+CAA+C;IACzC,eAAe,CACjB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,EACrC,WAAW,EAAE,QAAQ,GACtB,OAAO,CAAC,OAAO,CAAC;IAInB;;OAEG;IACG,qBAAqB,CACvB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,QAAQ,GACtB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"artifact-permission.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/artifact-permission.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -81,6 +81,7 @@ export class ArtifactPermissionService {
|
|
|
81
81
|
EntityName: 'MJ: Artifact Permissions',
|
|
82
82
|
ExtraFilter: `ArtifactID='${artifactId}' AND UserID='${userId}'`,
|
|
83
83
|
MaxRows: 1,
|
|
84
|
+
SkipTotalRowCount: true,
|
|
84
85
|
ResultType: 'entity_object'
|
|
85
86
|
}, currentUser);
|
|
86
87
|
if (result.Success && result.Results && result.Results.length > 0) {
|
|
@@ -369,6 +370,7 @@ export class ArtifactPermissionService {
|
|
|
369
370
|
EntityName: 'MJ: Artifacts',
|
|
370
371
|
ExtraFilter: `ID='${artifactId}'`,
|
|
371
372
|
MaxRows: 1,
|
|
373
|
+
SkipTotalRowCount: true,
|
|
372
374
|
ResultType: 'entity_object'
|
|
373
375
|
}, currentUser);
|
|
374
376
|
if (result.Success && result.Results && result.Results.length > 0) {
|