@memberjunction/ng-conversations 6.2.0-edge.4 → 6.2.0-edge.5
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 +29 -0
- package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts +1 -1
- package/dist/lib/components/conversation/conversation-agent-picker.component.js +3 -3
- package/dist/lib/components/conversation/conversation-agent-picker.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +75 -14
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +711 -359
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
- package/dist/lib/components/message/message-input.component.js +9 -9
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/message/message-item.component.d.ts +137 -16
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-item.component.js +1361 -296
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/components/message/message-list.component.d.ts +20 -2
- package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-list.component.js +28 -4
- package/dist/lib/components/message/message-list.component.js.map +1 -1
- package/dist/lib/components/sidebar/routines-section.component.js +1 -1
- package/dist/lib/components/sidebar/routines-section.component.js.map +1 -1
- package/dist/lib/components/task/tasks-full-view.component.d.ts +152 -31
- package/dist/lib/components/task/tasks-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/task/tasks-full-view.component.js +2227 -214
- package/dist/lib/components/task/tasks-full-view.component.js.map +1 -1
- package/dist/lib/components/tasks/tasks-dropdown.component.js +4 -4
- package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts +11 -1
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.js +25 -28
- package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
- package/dist/lib/services/agent-state.service.d.ts.map +1 -1
- package/dist/lib/services/agent-state.service.js +8 -8
- package/dist/lib/services/agent-state.service.js.map +1 -1
- package/dist/lib/services/browser-realtime-media-host.d.ts +7 -7
- package/dist/lib/services/browser-realtime-media-host.js +8 -78
- package/dist/lib/services/browser-realtime-media-host.js.map +1 -1
- package/dist/lib/services/conversation-agent.service.d.ts +16 -8
- package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-agent.service.js +57 -27
- package/dist/lib/services/conversation-agent.service.js.map +1 -1
- package/dist/lib/services/conversation-naming.d.ts.map +1 -1
- package/dist/lib/services/conversation-naming.js +9 -2
- package/dist/lib/services/conversation-naming.js.map +1 -1
- package/dist/lib/services/conversation-tasks-filter.d.ts +15 -0
- package/dist/lib/services/conversation-tasks-filter.d.ts.map +1 -0
- package/dist/lib/services/conversation-tasks-filter.js +69 -0
- package/dist/lib/services/conversation-tasks-filter.js.map +1 -0
- package/dist/lib/services/realtime-audio-recorder.d.ts +94 -86
- package/dist/lib/services/realtime-audio-recorder.d.ts.map +1 -1
- package/dist/lib/services/realtime-audio-recorder.js +222 -195
- package/dist/lib/services/realtime-audio-recorder.js.map +1 -1
- package/dist/lib/services/realtime-session.service.d.ts +30 -2
- package/dist/lib/services/realtime-session.service.d.ts.map +1 -1
- package/dist/lib/services/realtime-session.service.js +33 -6
- package/dist/lib/services/realtime-session.service.js.map +1 -1
- package/dist/lib/services/recording/libopus-wasm-binary.d.ts +3 -0
- package/dist/lib/services/recording/libopus-wasm-binary.d.ts.map +1 -0
- package/dist/lib/services/recording/libopus-wasm-binary.js +489 -0
- package/dist/lib/services/recording/libopus-wasm-binary.js.map +1 -0
- package/dist/lib/services/recording/libopus-worker-source.d.ts +48 -0
- package/dist/lib/services/recording/libopus-worker-source.d.ts.map +1 -0
- package/dist/lib/services/recording/libopus-worker-source.js +170 -0
- package/dist/lib/services/recording/libopus-worker-source.js.map +1 -0
- package/dist/lib/services/recording/linear-resampler.d.ts +45 -0
- package/dist/lib/services/recording/linear-resampler.d.ts.map +1 -0
- package/dist/lib/services/recording/linear-resampler.js +85 -0
- package/dist/lib/services/recording/linear-resampler.js.map +1 -0
- package/dist/lib/services/recording/opus-packet-encoder.d.ts +50 -0
- package/dist/lib/services/recording/opus-packet-encoder.d.ts.map +1 -0
- package/dist/lib/services/recording/opus-packet-encoder.js +41 -0
- package/dist/lib/services/recording/opus-packet-encoder.js.map +1 -0
- package/dist/lib/services/recording/wasm-opus-encoder.d.ts +86 -0
- package/dist/lib/services/recording/wasm-opus-encoder.d.ts.map +1 -0
- package/dist/lib/services/recording/wasm-opus-encoder.js +232 -0
- package/dist/lib/services/recording/wasm-opus-encoder.js.map +1 -0
- package/dist/lib/services/recording/webcodecs-opus-encoder.d.ts +39 -0
- package/dist/lib/services/recording/webcodecs-opus-encoder.d.ts.map +1 -0
- package/dist/lib/services/recording/webcodecs-opus-encoder.js +101 -0
- package/dist/lib/services/recording/webcodecs-opus-encoder.js.map +1 -0
- package/dist/lib/services/search.service.d.ts.map +1 -1
- package/dist/lib/services/search.service.js +3 -16
- package/dist/lib/services/search.service.js.map +1 -1
- package/dist/lib/utils/distinct-artifacts.d.ts +9 -3
- package/dist/lib/utils/distinct-artifacts.d.ts.map +1 -1
- package/dist/lib/utils/distinct-artifacts.js +24 -5
- package/dist/lib/utils/distinct-artifacts.js.map +1 -1
- package/package.json +36 -36
- package/dist/lib/services/browser-recording-unload-guard.d.ts +0 -30
- package/dist/lib/services/browser-recording-unload-guard.d.ts.map +0 -1
- package/dist/lib/services/browser-recording-unload-guard.js +0 -43
- package/dist/lib/services/browser-recording-unload-guard.js.map +0 -1
- package/dist/lib/services/realtime-pcm-wav.d.ts +0 -79
- package/dist/lib/services/realtime-pcm-wav.d.ts.map +0 -1
- package/dist/lib/services/realtime-pcm-wav.js +0 -213
- package/dist/lib/services/realtime-pcm-wav.js.map +0 -1
|
@@ -201,7 +201,7 @@ export class RoutinesSectionComponent extends BaseAngularComponent {
|
|
|
201
201
|
this.cdr.markForCheck();
|
|
202
202
|
}
|
|
203
203
|
rebuildCounts(engine) {
|
|
204
|
-
const routines = engine.Routines;
|
|
204
|
+
const routines = engine.Routines.filter((r) => r.RoutineType !== 'AgentWake');
|
|
205
205
|
this.TotalCount = routines.length;
|
|
206
206
|
this.ActiveCount = routines.filter((r) => r.Status === 'Active').length;
|
|
207
207
|
this.cdr.markForCheck();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routines-section.component.js","sourceRoot":"","sources":["../../../../src/lib/components/sidebar/routines-section.component.ts","../../../../src/lib/components/sidebar/routines-section.component.html"],"names":[],"mappings":"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","sourcesContent":["import { CompositeKey } from '@memberjunction/core';\nimport { ChangeDetectorRef, Component, EventEmitter, Input, OnDestroy, OnInit, Output, inject } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { MJUserRoutineEntity, UserRoutineEngine } from '@memberjunction/core-entities';\nimport { ConversationOpenedEventArgs, HistoryRecordOpenedEventArgs } from '@memberjunction/ng-user-routines';\n\n/**\n * Compact \"Routines\" entry pinned at the very bottom of the conversations left\n * sidebar: a single header row — mark, \"Routines\", the ACTIVE routine count, a \"+\"\n * (straight into the New Routine editor) and a details chevron. No routine rows —\n * the full command-center slide-in is one click away and owns all detail.\n *\n * Visibility gates (both must pass):\n * 1. `ShowRoutines` — host opt-out input bubbled from the top-level conversations\n * workspace (default true).\n * 2. The current user must have Read permission on 'MJ: User Routines'\n * (EntityInfo user-permission check) — hidden entirely otherwise.\n */\n@Component({\n standalone: false,\n selector: 'mj-conversation-routines-section',\n templateUrl: './routines-section.component.html',\n styleUrls: ['./routines-section.component.css'],\n})\nexport class RoutinesSectionComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n private destroy$ = new Subject<void>();\n\n private _showRoutines = true;\n /** Host opt-out (bubbled from the top-level conversations component). Default true. */\n @Input()\n public set ShowRoutines(value: boolean) {\n if (value !== this._showRoutines) {\n this._showRoutines = value;\n if (value && !this.initialized) {\n void this.initialize();\n }\n this.cdr.markForCheck();\n }\n }\n public get ShowRoutines(): boolean {\n return this._showRoutines;\n }\n\n /** True when the current user may read routines (permission gate). */\n public CanRead = false;\n /** Number of Active routines — the header badge. */\n public ActiveCount = 0;\n /** Total routines of any status (for the header tooltip). */\n public TotalCount = 0;\n\n /**\n * A run history row's linked execution record (Agent Run / Prompt Run / Action Log)\n * was clicked. Same shape as the chat area's openEntityRecord — the host (Explorer\n * wrapper or workspace) routes it to navigation; this package never navigates itself.\n */\n @Output() OpenEntityRecord = new EventEmitter<{ entityName: string; compositeKey: CompositeKey }>();\n\n /**\n * @deprecated Use {@link OpenEntityRecord}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (openEntityRecord) keeps working. Must stay AFTER OpenEntityRecord: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() openEntityRecord = this.OpenEntityRecord;\n\n /**\n * The user asked to open a routine's dedicated conversation (the hidden,\n * Application-scoped thread its runs append to). Emits the conversation ID;\n * the host selects it in chat — this component closes the slide-in first.\n */\n @Output() OpenConversation = new EventEmitter<string>();\n\n /**\n * @deprecated Use {@link OpenConversation}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (openConversation) keeps working. Must stay AFTER OpenConversation: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() openConversation = this.OpenConversation;\n\n /** Slide-in open state. */\n public SlideInVisible = false;\n /** Routine to open the slide-in on (history view). */\n public SlideInRoutineID: string | null = null;\n /** Whether the slide-in opens straight on the New Routine editor. */\n public SlideInNewRoutine = false;\n\n private initialized = false;\n\n /** Section renders only when the opt-out AND permission gates both pass. */\n public get IsVisible(): boolean {\n return this._showRoutines && this.CanRead;\n }\n\n /** Header tooltip: active/total breakdown. */\n public get HeaderTitle(): string {\n if (this.TotalCount === 0) {\n return 'Routines — none yet, click + to create one';\n }\n return `Routines — ${this.ActiveCount} active of ${this.TotalCount}. Click to open.`;\n }\n\n async ngOnInit(): Promise<void> {\n if (this._showRoutines) {\n await this.initialize();\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /** Opens the slide-in on the routines list (header / details click). */\n public OpenRoutines(): void {\n this.SlideInRoutineID = null;\n this.SlideInNewRoutine = false;\n this.SlideInVisible = true;\n this.cdr.markForCheck();\n }\n\n /** Opens the slide-in straight on the New Routine editor (\"+\" affordance). */\n public NewRoutine(event: Event): void {\n event.stopPropagation();\n this.SlideInRoutineID = null;\n this.SlideInNewRoutine = true;\n this.SlideInVisible = true;\n this.cdr.markForCheck();\n }\n\n /** Opens the routine's conversation in the host chat surface (closing the slide-in). */\n public OnConversationOpened(args: ConversationOpenedEventArgs): void {\n this.OnSlideInClosed();\n this.OpenConversation.emit(args.ConversationID);\n }\n\n /** Bridges the slide-in's HistoryRecordOpened to the standard openEntityRecord chain. */\n public OnHistoryRecordOpened(args: HistoryRecordOpenedEventArgs): void {\n this.OpenEntityRecord.emit({ entityName: args.EntityName, compositeKey: CompositeKey.FromURLSegment(this.ProviderToUse.EntityByName(args.EntityName), args.RecordID) });\n }\n\n public OnSlideInClosed(): void {\n this.SlideInVisible = false;\n this.SlideInRoutineID = null;\n this.SlideInNewRoutine = false;\n this.cdr.markForCheck();\n }\n\n // ---------------------------------------------------------------\n // Internals\n // ---------------------------------------------------------------\n private async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n this.initialized = true;\n const p = this.ProviderToUse;\n\n // Permission gate: hide entirely when the user lacks Read on the entity\n // (or the entity isn't present in this instance's metadata).\n const entityInfo = p.EntityByName('MJ: User Routines');\n const permissions = entityInfo && p.CurrentUser ? entityInfo.GetUserPermisions(p.CurrentUser) : null;\n this.CanRead = permissions?.CanRead === true;\n if (!this.CanRead) {\n this.cdr.markForCheck();\n return;\n }\n\n try {\n const engine = UserRoutineEngine.GetProviderInstance<UserRoutineEngine>(p, UserRoutineEngine) as UserRoutineEngine;\n await engine.Config(false, p.CurrentUser, p);\n engine.Routines$.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.rebuildCounts(engine);\n });\n this.rebuildCounts(engine);\n } catch (e) {\n console.error('[RoutinesSection] Failed to load routines:', e);\n this.ActiveCount = 0;\n this.TotalCount = 0;\n }\n this.cdr.markForCheck();\n }\n\n private rebuildCounts(engine: UserRoutineEngine): void {\n const routines = engine.Routines;\n this.TotalCount = routines.length;\n this.ActiveCount = routines.filter((r: MJUserRoutineEntity) => r.Status === 'Active').length;\n this.cdr.markForCheck();\n }\n}\n","@if (IsVisible) {\n <div class=\"crs-section\">\n <button type=\"button\" class=\"crs-header\" [title]=\"HeaderTitle\" (click)=\"OpenRoutines()\">\n <i class=\"fa-solid fa-business-time crs-mark\"></i>\n <span class=\"crs-title\">Routines</span>\n @if (ActiveCount > 0) {\n <span class=\"crs-count\">{{ ActiveCount }}</span>\n }\n <span class=\"crs-spacer\"></span>\n <span class=\"crs-add\" role=\"button\" title=\"New routine\" (click)=\"NewRoutine($event)\">\n <i class=\"fa-solid fa-plus\"></i>\n </span>\n <span class=\"crs-details\" role=\"button\" title=\"Open routines\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </span>\n </button>\n\n <mj-user-routines-slide-in\n [Provider]=\"Provider\"\n [(Visible)]=\"SlideInVisible\"\n [InitialRoutineID]=\"SlideInRoutineID\"\n [StartInNewRoutine]=\"SlideInNewRoutine\"\n (Closed)=\"OnSlideInClosed()\"\n (HistoryRecordOpened)=\"OnHistoryRecordOpened($event)\"\n (ConversationOpened)=\"OnConversationOpened($event)\">\n </mj-user-routines-slide-in>\n </div>\n}\n"]}
|
|
1
|
+
{"version":3,"file":"routines-section.component.js","sourceRoot":"","sources":["../../../../src/lib/components/sidebar/routines-section.component.ts","../../../../src/lib/components/sidebar/routines-section.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAqB,MAAM,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACrH,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAuB,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;;;;ICC/E,+BAAwB;IAAA,YAAiB;IAAA,iBAAO;;;IAAxB,cAAiB;IAAjB,wCAAiB;;;;IAJ7C,AADF,8BAAyB,gBACiE;IAAzB,4LAAS,qBAAc,KAAC;IACrF,uBAAkD;IAClD,+BAAwB;IAAA,wBAAQ;IAAA,iBAAO;IACvC,yGAAuB;IAGvB,0BAAgC;IAChC,+BAAqF;IAA7B,gMAAS,yBAAkB,KAAC;IAClF,uBAAgC;IAClC,iBAAO;IACP,+BAA8D;IAC5D,wBAAyC;IAE7C,AADE,iBAAO,EACA;IAET,sDAOsD;IALpD,iVAA4B;IAK5B,AADA,AADA,kNAAU,wBAAiB,KAAC,qOACL,oCAA6B,KAAC,mOAC/B,mCAA4B,KAAC;IAEvD,AADE,iBAA4B,EACxB;;;IAxBqC,cAAqB;IAArB,0CAAqB;IAG5D,eAEC;IAFD,iDAEC;IAWD,eAAqB;IAArB,0CAAqB;IACrB,qDAA4B;IAE5B,AADA,0DAAqC,+CACE;;ADb7C;;;;;;;;;;;GAWG;AAOH,MAAM,OAAO,wBAAyB,SAAQ,oBAAoB;IACtD,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAChC,QAAQ,GAAG,IAAI,OAAO,EAAQ,CAAC;IAE/B,aAAa,GAAG,IAAI,CAAC;IAC7B,uFAAuF;IACvF,IACW,YAAY,CAAC,KAAc;QAClC,IAAI,KAAK,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC;YAC/B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC3B,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC7B,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;YAC3B,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC5B,CAAC;IACL,CAAC;IACD,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED,sEAAsE;IAC/D,OAAO,GAAG,KAAK,CAAC;IACvB,oDAAoD;IAC7C,WAAW,GAAG,CAAC,CAAC;IACvB,6DAA6D;IACtD,UAAU,GAAG,CAAC,CAAC;IAEtB;;;;OAIG;IACO,gBAAgB,GAAG,IAAI,YAAY,EAAsD,CAAC;IAEpG;;;;;;OAMG;IACO,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;IAEnD;;;;OAIG;IACO,gBAAgB,GAAG,IAAI,YAAY,EAAU,CAAC;IAExD;;;;;;OAMG;IACO,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;IAEnD,2BAA2B;IACpB,cAAc,GAAG,KAAK,CAAC;IAC9B,sDAAsD;IAC/C,gBAAgB,GAAkB,IAAI,CAAC;IAC9C,qEAAqE;IAC9D,iBAAiB,GAAG,KAAK,CAAC;IAEzB,WAAW,GAAG,KAAK,CAAC;IAE5B,4EAA4E;IAC5E,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,CAAC;IAC9C,CAAC;IAED,8CAA8C;IAC9C,IAAW,WAAW;QAClB,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,4CAA4C,CAAC;QACxD,CAAC;QACD,OAAO,cAAc,IAAI,CAAC,WAAW,cAAc,IAAI,CAAC,UAAU,kBAAkB,CAAC;IACzF,CAAC;IAED,KAAK,CAAC,QAAQ;QACV,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAC5B,CAAC;IACL,CAAC;IAED,WAAW;QACP,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC;IAED,wEAAwE;IACjE,YAAY;QACf,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAED,8EAA8E;IACvE,UAAU,CAAC,KAAY;QAC1B,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAED,wFAAwF;IACjF,oBAAoB,CAAC,IAAiC;QACzD,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACpD,CAAC;IAED,yFAAyF;IAClF,qBAAqB,CAAC,IAAkC;QAC3D,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC5K,CAAC;IAEM,eAAe;QAClB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAED,kEAAkE;IAClE,YAAY;IACZ,kEAAkE;IAC1D,KAAK,CAAC,UAAU;QACpB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO;QACX,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC;QAE7B,wEAAwE;QACxE,6DAA6D;QAC7D,MAAM,UAAU,GAAG,CAAC,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,UAAU,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrG,IAAI,CAAC,OAAO,GAAG,WAAW,EAAE,OAAO,KAAK,IAAI,CAAC;QAC7C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YACxB,OAAO;QACX,CAAC;QAED,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,iBAAiB,CAAC,mBAAmB,CAAoB,CAAC,EAAE,iBAAiB,CAAsB,CAAC;YACnH,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE;gBAC3D,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC/B,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,CAAC,CAAC,CAAC;YAC/D,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAEO,aAAa,CAAC,MAAyB;QAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAsB,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC;QACnG,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAsB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;QAC7F,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;6QAvKQ,wBAAwB,yBAAxB,wBAAwB;6DAAxB,wBAAwB;YC1BrC,2FAAiB;;YAAjB,wCA2BC;;;iFDDY,wBAAwB;cANpC,SAAS;6BACM,KAAK,YACP,kCAAkC;;kBAU3C,KAAK;;kBA0BL,MAAM;;kBASN,MAAM;;kBAON,MAAM;;kBASN,MAAM;;kFAzDE,wBAAwB","sourcesContent":["import { CompositeKey } from '@memberjunction/core';\nimport { ChangeDetectorRef, Component, EventEmitter, Input, OnDestroy, OnInit, Output, inject } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { MJUserRoutineEntity, UserRoutineEngine } from '@memberjunction/core-entities';\nimport { ConversationOpenedEventArgs, HistoryRecordOpenedEventArgs } from '@memberjunction/ng-user-routines';\n\n/**\n * Compact \"Routines\" entry pinned at the very bottom of the conversations left\n * sidebar: a single header row — mark, \"Routines\", the ACTIVE routine count, a \"+\"\n * (straight into the New Routine editor) and a details chevron. No routine rows —\n * the full command-center slide-in is one click away and owns all detail.\n *\n * Visibility gates (both must pass):\n * 1. `ShowRoutines` — host opt-out input bubbled from the top-level conversations\n * workspace (default true).\n * 2. The current user must have Read permission on 'MJ: User Routines'\n * (EntityInfo user-permission check) — hidden entirely otherwise.\n */\n@Component({\n standalone: false,\n selector: 'mj-conversation-routines-section',\n templateUrl: './routines-section.component.html',\n styleUrls: ['./routines-section.component.css'],\n})\nexport class RoutinesSectionComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n private destroy$ = new Subject<void>();\n\n private _showRoutines = true;\n /** Host opt-out (bubbled from the top-level conversations component). Default true. */\n @Input()\n public set ShowRoutines(value: boolean) {\n if (value !== this._showRoutines) {\n this._showRoutines = value;\n if (value && !this.initialized) {\n void this.initialize();\n }\n this.cdr.markForCheck();\n }\n }\n public get ShowRoutines(): boolean {\n return this._showRoutines;\n }\n\n /** True when the current user may read routines (permission gate). */\n public CanRead = false;\n /** Number of Active routines — the header badge. */\n public ActiveCount = 0;\n /** Total routines of any status (for the header tooltip). */\n public TotalCount = 0;\n\n /**\n * A run history row's linked execution record (Agent Run / Prompt Run / Action Log)\n * was clicked. Same shape as the chat area's openEntityRecord — the host (Explorer\n * wrapper or workspace) routes it to navigation; this package never navigates itself.\n */\n @Output() OpenEntityRecord = new EventEmitter<{ entityName: string; compositeKey: CompositeKey }>();\n\n /**\n * @deprecated Use {@link OpenEntityRecord}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (openEntityRecord) keeps working. Must stay AFTER OpenEntityRecord: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() openEntityRecord = this.OpenEntityRecord;\n\n /**\n * The user asked to open a routine's dedicated conversation (the hidden,\n * Application-scoped thread its runs append to). Emits the conversation ID;\n * the host selects it in chat — this component closes the slide-in first.\n */\n @Output() OpenConversation = new EventEmitter<string>();\n\n /**\n * @deprecated Use {@link OpenConversation}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (openConversation) keeps working. Must stay AFTER OpenConversation: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() openConversation = this.OpenConversation;\n\n /** Slide-in open state. */\n public SlideInVisible = false;\n /** Routine to open the slide-in on (history view). */\n public SlideInRoutineID: string | null = null;\n /** Whether the slide-in opens straight on the New Routine editor. */\n public SlideInNewRoutine = false;\n\n private initialized = false;\n\n /** Section renders only when the opt-out AND permission gates both pass. */\n public get IsVisible(): boolean {\n return this._showRoutines && this.CanRead;\n }\n\n /** Header tooltip: active/total breakdown. */\n public get HeaderTitle(): string {\n if (this.TotalCount === 0) {\n return 'Routines — none yet, click + to create one';\n }\n return `Routines — ${this.ActiveCount} active of ${this.TotalCount}. Click to open.`;\n }\n\n async ngOnInit(): Promise<void> {\n if (this._showRoutines) {\n await this.initialize();\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /** Opens the slide-in on the routines list (header / details click). */\n public OpenRoutines(): void {\n this.SlideInRoutineID = null;\n this.SlideInNewRoutine = false;\n this.SlideInVisible = true;\n this.cdr.markForCheck();\n }\n\n /** Opens the slide-in straight on the New Routine editor (\"+\" affordance). */\n public NewRoutine(event: Event): void {\n event.stopPropagation();\n this.SlideInRoutineID = null;\n this.SlideInNewRoutine = true;\n this.SlideInVisible = true;\n this.cdr.markForCheck();\n }\n\n /** Opens the routine's conversation in the host chat surface (closing the slide-in). */\n public OnConversationOpened(args: ConversationOpenedEventArgs): void {\n this.OnSlideInClosed();\n this.OpenConversation.emit(args.ConversationID);\n }\n\n /** Bridges the slide-in's HistoryRecordOpened to the standard openEntityRecord chain. */\n public OnHistoryRecordOpened(args: HistoryRecordOpenedEventArgs): void {\n this.OpenEntityRecord.emit({ entityName: args.EntityName, compositeKey: CompositeKey.FromURLSegment(this.ProviderToUse.EntityByName(args.EntityName), args.RecordID) });\n }\n\n public OnSlideInClosed(): void {\n this.SlideInVisible = false;\n this.SlideInRoutineID = null;\n this.SlideInNewRoutine = false;\n this.cdr.markForCheck();\n }\n\n // ---------------------------------------------------------------\n // Internals\n // ---------------------------------------------------------------\n private async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n this.initialized = true;\n const p = this.ProviderToUse;\n\n // Permission gate: hide entirely when the user lacks Read on the entity\n // (or the entity isn't present in this instance's metadata).\n const entityInfo = p.EntityByName('MJ: User Routines');\n const permissions = entityInfo && p.CurrentUser ? entityInfo.GetUserPermisions(p.CurrentUser) : null;\n this.CanRead = permissions?.CanRead === true;\n if (!this.CanRead) {\n this.cdr.markForCheck();\n return;\n }\n\n try {\n const engine = UserRoutineEngine.GetProviderInstance<UserRoutineEngine>(p, UserRoutineEngine) as UserRoutineEngine;\n await engine.Config(false, p.CurrentUser, p);\n engine.Routines$.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.rebuildCounts(engine);\n });\n this.rebuildCounts(engine);\n } catch (e) {\n console.error('[RoutinesSection] Failed to load routines:', e);\n this.ActiveCount = 0;\n this.TotalCount = 0;\n }\n this.cdr.markForCheck();\n }\n\n private rebuildCounts(engine: UserRoutineEngine): void {\n const routines = engine.Routines.filter((r: MJUserRoutineEntity) => r.RoutineType !== 'AgentWake');\n this.TotalCount = routines.length;\n this.ActiveCount = routines.filter((r: MJUserRoutineEntity) => r.Status === 'Active').length;\n this.cdr.markForCheck();\n }\n}\n","@if (IsVisible) {\n <div class=\"crs-section\">\n <button type=\"button\" class=\"crs-header\" [title]=\"HeaderTitle\" (click)=\"OpenRoutines()\">\n <i class=\"fa-solid fa-business-time crs-mark\"></i>\n <span class=\"crs-title\">Routines</span>\n @if (ActiveCount > 0) {\n <span class=\"crs-count\">{{ ActiveCount }}</span>\n }\n <span class=\"crs-spacer\"></span>\n <span class=\"crs-add\" role=\"button\" title=\"New routine\" (click)=\"NewRoutine($event)\">\n <i class=\"fa-solid fa-plus\"></i>\n </span>\n <span class=\"crs-details\" role=\"button\" title=\"Open routines\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </span>\n </button>\n\n <mj-user-routines-slide-in\n [Provider]=\"Provider\"\n [(Visible)]=\"SlideInVisible\"\n [InitialRoutineID]=\"SlideInRoutineID\"\n [StartInNewRoutine]=\"SlideInNewRoutine\"\n (Closed)=\"OnSlideInClosed()\"\n (HistoryRecordOpened)=\"OnHistoryRecordOpened($event)\"\n (ConversationOpened)=\"OnConversationOpened($event)\">\n </mj-user-routines-slide-in>\n </div>\n}\n"]}
|
|
@@ -1,14 +1,90 @@
|
|
|
1
|
-
import { EventEmitter, OnInit, OnChanges, SimpleChanges } from '@angular/core';
|
|
1
|
+
import { EventEmitter, OnInit, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';
|
|
2
2
|
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
3
3
|
import { UserInfo } from '@memberjunction/core';
|
|
4
4
|
import { MJTaskEntity, MJTaskDependencyEntity } from '@memberjunction/core-entities';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
8
|
-
* Generic component that displays tasks based on provided filter
|
|
9
|
-
* Supports drilling into individual tasks to see sub-tasks
|
|
7
|
+
* Normalized status filter categories in the AI Agent Workflows & Tasks Command Center.
|
|
10
8
|
*/
|
|
11
|
-
export
|
|
9
|
+
export type WorkflowStatusFilter = 'all' | 'active' | 'completed' | 'failed';
|
|
10
|
+
/**
|
|
11
|
+
* Primary display modes for the AI Agent Workflows & Tasks Command Center.
|
|
12
|
+
*/
|
|
13
|
+
export type WorkflowCommandCenterViewMode = 'workflows' | 'timeline';
|
|
14
|
+
/**
|
|
15
|
+
* Enriched representation of an individual step within a workflow group,
|
|
16
|
+
* including timing offsets for the second-resolution execution waterfall.
|
|
17
|
+
*/
|
|
18
|
+
export interface EnrichedWorkflowStep {
|
|
19
|
+
Task: MJTaskEntity;
|
|
20
|
+
StepNumber: number;
|
|
21
|
+
AgentName: string | null;
|
|
22
|
+
AgentID: string | null;
|
|
23
|
+
AgentRunID: string | null;
|
|
24
|
+
Instructions: string;
|
|
25
|
+
Output: string | null;
|
|
26
|
+
IsErrorOutput: boolean;
|
|
27
|
+
OutputPreview: string;
|
|
28
|
+
DurationText: string;
|
|
29
|
+
DurationMs: number;
|
|
30
|
+
/** Offset percentage (0-92) from the workflow's start timestamp */
|
|
31
|
+
TimelineOffsetPercent: number;
|
|
32
|
+
/** Bar width percentage (8-100) relative to the workflow's total duration */
|
|
33
|
+
TimelineWidthPercent: number;
|
|
34
|
+
StartOffsetLabel: string;
|
|
35
|
+
DependsOnNames: string[];
|
|
36
|
+
DependsOnTaskIds: string[];
|
|
37
|
+
DependsOnConditions: string[];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Hierarchy-aware workflow group combining a parent orchestration container task
|
|
41
|
+
* (or standalone task) with its ordered specialist agent execution steps.
|
|
42
|
+
*/
|
|
43
|
+
export interface WorkflowGroupViewModel {
|
|
44
|
+
RootTaskId: string;
|
|
45
|
+
ParentTask: MJTaskEntity;
|
|
46
|
+
Title: string;
|
|
47
|
+
SummaryInstruction: string;
|
|
48
|
+
Status: MJTaskEntity['Status'];
|
|
49
|
+
NormalizedCategory: 'active' | 'completed' | 'failed';
|
|
50
|
+
PercentComplete: number;
|
|
51
|
+
TotalSteps: number;
|
|
52
|
+
CompletedSteps: number;
|
|
53
|
+
SkippedSteps: number;
|
|
54
|
+
ActiveSteps: number;
|
|
55
|
+
FailedSteps: number;
|
|
56
|
+
Steps: EnrichedWorkflowStep[];
|
|
57
|
+
AgentPipeline: Array<{
|
|
58
|
+
id: string;
|
|
59
|
+
name: string;
|
|
60
|
+
}>;
|
|
61
|
+
StartedAt: Date | null;
|
|
62
|
+
CompletedAt: Date | null;
|
|
63
|
+
DurationText: string;
|
|
64
|
+
DurationMs: number;
|
|
65
|
+
RelativeTimeText: string;
|
|
66
|
+
ConversationDetailID: string | null;
|
|
67
|
+
IsMultiStep: boolean;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Summary KPI metrics displayed in the top command-center ribbon.
|
|
71
|
+
*/
|
|
72
|
+
export interface WorkflowCommandCenterKPIs {
|
|
73
|
+
TotalWorkflows: number;
|
|
74
|
+
TotalSteps: number;
|
|
75
|
+
ActiveWorkflows: number;
|
|
76
|
+
CompletedSteps: number;
|
|
77
|
+
SuccessRatePercent: number;
|
|
78
|
+
AvgExecutionTimeText: string;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* AI Agent Workflows & Tasks Command Center (`mj-tasks-full-view`).
|
|
82
|
+
*
|
|
83
|
+
* Provides a hierarchy-aware, real-time command center for monitoring and inspecting
|
|
84
|
+
* multi-agent task graphs and durable background agent executions launched from conversations.
|
|
85
|
+
*/
|
|
86
|
+
export declare class TasksFullViewComponent extends BaseAngularComponent implements OnInit, OnChanges, OnDestroy {
|
|
87
|
+
private cdr;
|
|
12
88
|
EnvironmentId: string;
|
|
13
89
|
/** @deprecated Use {@link EnvironmentId}. */
|
|
14
90
|
set environmentId(value: string);
|
|
@@ -24,6 +100,11 @@ export declare class TasksFullViewComponent extends BaseAngularComponent impleme
|
|
|
24
100
|
set baseFilter(value: string);
|
|
25
101
|
/** @deprecated Use {@link BaseFilter}. */
|
|
26
102
|
get baseFilter(): string;
|
|
103
|
+
/**
|
|
104
|
+
* Builds the task filter each time the view loads or refreshes, so the list includes tasks
|
|
105
|
+
* created since the last load. Replaces {@link BaseFilter} when set.
|
|
106
|
+
*/
|
|
107
|
+
BaseFilterResolver: (() => Promise<string>) | null;
|
|
27
108
|
ActiveTaskId?: string;
|
|
28
109
|
/** @deprecated Use {@link ActiveTaskId}. */
|
|
29
110
|
set activeTaskId(value: string | undefined);
|
|
@@ -33,25 +114,13 @@ export declare class TasksFullViewComponent extends BaseAngularComponent impleme
|
|
|
33
114
|
entityName: string;
|
|
34
115
|
recordId: string;
|
|
35
116
|
}>;
|
|
36
|
-
/**
|
|
37
|
-
* @deprecated Use {@link OpenEntityRecord}.
|
|
38
|
-
*
|
|
39
|
-
* The same emitter under the old binding name, so a template still binding
|
|
40
|
-
* (openEntityRecord) keeps working. Must stay AFTER OpenEntityRecord: class fields
|
|
41
|
-
* initialise in order, and the other way round this captures undefined.
|
|
42
|
-
*/
|
|
117
|
+
/** @deprecated Use {@link OpenEntityRecord}. */
|
|
43
118
|
openEntityRecord: EventEmitter<{
|
|
44
119
|
entityName: string;
|
|
45
120
|
recordId: string;
|
|
46
121
|
}>;
|
|
47
122
|
TaskSelected: EventEmitter<string | null>;
|
|
48
|
-
/**
|
|
49
|
-
* @deprecated Use {@link TaskSelected}.
|
|
50
|
-
*
|
|
51
|
-
* The same emitter under the old binding name, so a template still binding
|
|
52
|
-
* (taskSelected) keeps working. Must stay AFTER TaskSelected: class fields
|
|
53
|
-
* initialise in order, and the other way round this captures undefined.
|
|
54
|
-
*/
|
|
123
|
+
/** @deprecated Use {@link TaskSelected}. */
|
|
55
124
|
taskSelected: EventEmitter<string | null>;
|
|
56
125
|
AllTasks: MJTaskEntity[];
|
|
57
126
|
/** @deprecated Use {@link AllTasks}. */
|
|
@@ -95,31 +164,70 @@ export declare class TasksFullViewComponent extends BaseAngularComponent impleme
|
|
|
95
164
|
set showDetailAnimation(value: boolean);
|
|
96
165
|
isLoading: boolean;
|
|
97
166
|
private aiEngineConfigured;
|
|
167
|
+
CommandViewMode: WorkflowCommandCenterViewMode;
|
|
168
|
+
StatusFilter: WorkflowStatusFilter;
|
|
169
|
+
SearchQuery: string;
|
|
170
|
+
SelectedAgentFilter: string;
|
|
171
|
+
WorkflowGroups: WorkflowGroupViewModel[];
|
|
172
|
+
FilteredWorkflowGroups: WorkflowGroupViewModel[];
|
|
173
|
+
AvailableAgents: Array<{
|
|
174
|
+
id: string;
|
|
175
|
+
name: string;
|
|
176
|
+
count: number;
|
|
177
|
+
}>;
|
|
178
|
+
InspectedGroup: WorkflowGroupViewModel | null;
|
|
179
|
+
InspectedStep: EnrichedWorkflowStep | null;
|
|
180
|
+
CopiedOutput: boolean;
|
|
181
|
+
Kpis: WorkflowCommandCenterKPIs;
|
|
182
|
+
private allHierarchyTasks;
|
|
183
|
+
private streamSubscription;
|
|
184
|
+
private livePollTimer;
|
|
98
185
|
ngOnInit(): void;
|
|
99
186
|
ngOnChanges(changes: SimpleChanges): void;
|
|
187
|
+
ngOnDestroy(): void;
|
|
188
|
+
private setupLiveTaskGraphSubscription;
|
|
189
|
+
private updateLivePollingState;
|
|
190
|
+
private stopLivePolling;
|
|
100
191
|
LoadTasks(): Promise<void>;
|
|
101
192
|
/** @deprecated Use {@link LoadTasks}. */
|
|
102
193
|
loadTasks(): Promise<void>;
|
|
194
|
+
/**
|
|
195
|
+
* Ensures child step tasks and dependencies are loaded even when the primary filter
|
|
196
|
+
* scopes to top-level (`ParentID IS NULL`) tasks.
|
|
197
|
+
*/
|
|
198
|
+
private loadChildTasksAndDependencies;
|
|
199
|
+
/**
|
|
200
|
+
* Builds the hierarchy-aware `WorkflowGroups`, KPI metrics, and agent filter options.
|
|
201
|
+
*/
|
|
202
|
+
private rebuildWorkflowCommandCenter;
|
|
203
|
+
private computeCommandCenterKPIs;
|
|
204
|
+
ApplyWorkflowFilters(): void;
|
|
205
|
+
/** @deprecated Use {@link ApplyWorkflowFilters}. */
|
|
206
|
+
applyWorkflowFilters(): void;
|
|
207
|
+
SetCommandViewMode(mode: WorkflowCommandCenterViewMode): void;
|
|
208
|
+
SetStatusFilter(filter: WorkflowStatusFilter): void;
|
|
209
|
+
SetAgentFilter(agentId: string): void;
|
|
210
|
+
OnFilterCriteriaChanged(): void;
|
|
211
|
+
ClearSearch(): void;
|
|
212
|
+
ResetAllFilters(): void;
|
|
213
|
+
CountByCategory(category: 'active' | 'completed' | 'failed'): number;
|
|
214
|
+
GetStepCategory(status: MJTaskEntity['Status']): 'active' | 'completed' | 'failed' | 'skipped';
|
|
215
|
+
IsGroupInspected(group: WorkflowGroupViewModel): boolean;
|
|
216
|
+
IsStepInspected(task: MJTaskEntity): boolean;
|
|
217
|
+
InspectWorkflowGroup(group: WorkflowGroupViewModel, step?: EnrichedWorkflowStep, event?: MouseEvent): void;
|
|
218
|
+
SelectInspectorStep(step: EnrichedWorkflowStep): void;
|
|
219
|
+
private selectTaskById;
|
|
103
220
|
OnTaskClick(task: MJTaskEntity): Promise<void>;
|
|
104
221
|
/** @deprecated Use {@link OnTaskClick}. */
|
|
105
222
|
onTaskClick(task: MJTaskEntity): Promise<void>;
|
|
106
|
-
private loadTaskHierarchy;
|
|
107
|
-
private loadTaskDependencies;
|
|
108
|
-
/**
|
|
109
|
-
* Builds the TaskID -> AgentRunID map from each task's own AgentRunID column.
|
|
110
|
-
*
|
|
111
|
-
* Previously this joined tasks to runs through the shared ConversationDetailID, which meant
|
|
112
|
-
* every sibling task in a graph resolved to the SAME agent run — the run link in the Gantt
|
|
113
|
-
* and detail panel was wrong for all but one task. Each task now records the specific run
|
|
114
|
-
* that executed it (Task.AgentRunID), so the mapping is direct and needs no query at all.
|
|
115
|
-
*/
|
|
116
|
-
private loadAgentRuns;
|
|
117
223
|
BackToTaskList(): void;
|
|
118
224
|
/** @deprecated Use {@link BackToTaskList}. */
|
|
119
225
|
backToTaskList(): void;
|
|
120
226
|
OnSubTaskClick(subTask: MJTaskEntity): void;
|
|
121
227
|
/** @deprecated Use {@link OnSubTaskClick}. */
|
|
122
228
|
onSubTaskClick(subTask: MJTaskEntity): void;
|
|
229
|
+
OnAgentChipClicked(event: MouseEvent, agentId: string): void;
|
|
230
|
+
OnOpenAgentRunClicked(event: MouseEvent, agentRunId: string): void;
|
|
123
231
|
OnOpenEntityRecord(event: {
|
|
124
232
|
entityName: string;
|
|
125
233
|
recordId: string;
|
|
@@ -129,11 +237,24 @@ export declare class TasksFullViewComponent extends BaseAngularComponent impleme
|
|
|
129
237
|
entityName: string;
|
|
130
238
|
recordId: string;
|
|
131
239
|
}): void;
|
|
240
|
+
CopyStepOutput(output: string): void;
|
|
241
|
+
private loadAgentRuns;
|
|
242
|
+
private resolveAgentName;
|
|
243
|
+
private splitTaskDescription;
|
|
244
|
+
/**
|
|
245
|
+
* Strips upstream keys inherited unchanged from earlier workflow steps and returns a formatted
|
|
246
|
+
* human-readable or JSON excerpt for the step inspector drawer.
|
|
247
|
+
*/
|
|
248
|
+
private resolveDeltaStepOutput;
|
|
249
|
+
private toEpochMs;
|
|
250
|
+
private formatDurationMs;
|
|
251
|
+
private formatRelativeTime;
|
|
252
|
+
FormatDateTime(date: Date | null): string;
|
|
132
253
|
getDescription(): string;
|
|
133
254
|
GetTaskDetailDescription(): string;
|
|
134
255
|
/** @deprecated Use {@link GetTaskDetailDescription}. */
|
|
135
256
|
getTaskDetailDescription(): string;
|
|
136
257
|
static ɵfac: i0.ɵɵFactoryDeclaration<TasksFullViewComponent, never>;
|
|
137
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<TasksFullViewComponent, "mj-tasks-full-view", never, { "EnvironmentId": { "alias": "EnvironmentId"; "required": false; }; "environmentId": { "alias": "environmentId"; "required": false; }; "CurrentUser": { "alias": "CurrentUser"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; "BaseFilter": { "alias": "BaseFilter"; "required": false; }; "baseFilter": { "alias": "baseFilter"; "required": false; }; "ActiveTaskId": { "alias": "ActiveTaskId"; "required": false; }; "activeTaskId": { "alias": "activeTaskId"; "required": false; }; }, { "OpenEntityRecord": "OpenEntityRecord"; "openEntityRecord": "openEntityRecord"; "TaskSelected": "TaskSelected"; "taskSelected": "taskSelected"; }, never, never, true, never>;
|
|
258
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TasksFullViewComponent, "mj-tasks-full-view", never, { "EnvironmentId": { "alias": "EnvironmentId"; "required": false; }; "environmentId": { "alias": "environmentId"; "required": false; }; "CurrentUser": { "alias": "CurrentUser"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; "BaseFilter": { "alias": "BaseFilter"; "required": false; }; "baseFilter": { "alias": "baseFilter"; "required": false; }; "BaseFilterResolver": { "alias": "BaseFilterResolver"; "required": false; }; "ActiveTaskId": { "alias": "ActiveTaskId"; "required": false; }; "activeTaskId": { "alias": "activeTaskId"; "required": false; }; }, { "OpenEntityRecord": "OpenEntityRecord"; "openEntityRecord": "openEntityRecord"; "TaskSelected": "TaskSelected"; "taskSelected": "taskSelected"; }, never, never, true, never>;
|
|
138
259
|
}
|
|
139
260
|
//# sourceMappingURL=tasks-full-view.component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks-full-view.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/task/tasks-full-view.component.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"tasks-full-view.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/task/tasks-full-view.component.ts"],"names":[],"mappings":"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"}
|