@genesislcap/ai-assistant 14.409.0-FUI-2495.7 → 14.409.0-FUI-2495.9
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/ai-assistant.api.json +155 -0
- package/dist/ai-assistant.d.ts +11 -0
- package/dist/dts/components/chat-driver/chat-driver.d.ts.map +1 -1
- package/dist/dts/main/main.d.ts +11 -0
- package/dist/dts/main/main.d.ts.map +1 -1
- package/dist/esm/components/chat-driver/chat-driver.js +10 -3
- package/dist/esm/main/main.js +50 -0
- package/package.json +15 -15
- package/src/components/chat-driver/chat-driver.ts +12 -2
- package/src/main/main.ts +56 -0
|
@@ -3666,6 +3666,37 @@
|
|
|
3666
3666
|
"isProtected": false,
|
|
3667
3667
|
"isAbstract": false
|
|
3668
3668
|
},
|
|
3669
|
+
{
|
|
3670
|
+
"kind": "Method",
|
|
3671
|
+
"canonicalReference": "@genesislcap/ai-assistant!FoundationAiAssistant#enabledAnimationsChanged:member(1)",
|
|
3672
|
+
"docComment": "",
|
|
3673
|
+
"excerptTokens": [
|
|
3674
|
+
{
|
|
3675
|
+
"kind": "Content",
|
|
3676
|
+
"text": "enabledAnimationsChanged(): "
|
|
3677
|
+
},
|
|
3678
|
+
{
|
|
3679
|
+
"kind": "Content",
|
|
3680
|
+
"text": "void"
|
|
3681
|
+
},
|
|
3682
|
+
{
|
|
3683
|
+
"kind": "Content",
|
|
3684
|
+
"text": ";"
|
|
3685
|
+
}
|
|
3686
|
+
],
|
|
3687
|
+
"isStatic": false,
|
|
3688
|
+
"returnTypeTokenRange": {
|
|
3689
|
+
"startIndex": 1,
|
|
3690
|
+
"endIndex": 2
|
|
3691
|
+
},
|
|
3692
|
+
"releaseTag": "Beta",
|
|
3693
|
+
"isProtected": false,
|
|
3694
|
+
"overloadIndex": 1,
|
|
3695
|
+
"parameters": [],
|
|
3696
|
+
"isOptional": false,
|
|
3697
|
+
"isAbstract": false,
|
|
3698
|
+
"name": "enabledAnimationsChanged"
|
|
3699
|
+
},
|
|
3669
3700
|
{
|
|
3670
3701
|
"kind": "Method",
|
|
3671
3702
|
"canonicalReference": "@genesislcap/ai-assistant!FoundationAiAssistant#getDebugLog:member(1)",
|
|
@@ -4474,6 +4505,37 @@
|
|
|
4474
4505
|
"isProtected": false,
|
|
4475
4506
|
"isAbstract": false
|
|
4476
4507
|
},
|
|
4508
|
+
{
|
|
4509
|
+
"kind": "Method",
|
|
4510
|
+
"canonicalReference": "@genesislcap/ai-assistant!FoundationAiAssistant#showAgentSwitchIndicatorChanged:member(1)",
|
|
4511
|
+
"docComment": "",
|
|
4512
|
+
"excerptTokens": [
|
|
4513
|
+
{
|
|
4514
|
+
"kind": "Content",
|
|
4515
|
+
"text": "showAgentSwitchIndicatorChanged(): "
|
|
4516
|
+
},
|
|
4517
|
+
{
|
|
4518
|
+
"kind": "Content",
|
|
4519
|
+
"text": "void"
|
|
4520
|
+
},
|
|
4521
|
+
{
|
|
4522
|
+
"kind": "Content",
|
|
4523
|
+
"text": ";"
|
|
4524
|
+
}
|
|
4525
|
+
],
|
|
4526
|
+
"isStatic": false,
|
|
4527
|
+
"returnTypeTokenRange": {
|
|
4528
|
+
"startIndex": 1,
|
|
4529
|
+
"endIndex": 2
|
|
4530
|
+
},
|
|
4531
|
+
"releaseTag": "Beta",
|
|
4532
|
+
"isProtected": false,
|
|
4533
|
+
"overloadIndex": 1,
|
|
4534
|
+
"parameters": [],
|
|
4535
|
+
"isOptional": false,
|
|
4536
|
+
"isAbstract": false,
|
|
4537
|
+
"name": "showAgentSwitchIndicatorChanged"
|
|
4538
|
+
},
|
|
4477
4539
|
{
|
|
4478
4540
|
"kind": "Property",
|
|
4479
4541
|
"canonicalReference": "@genesislcap/ai-assistant!FoundationAiAssistant#showHalo:member",
|
|
@@ -4687,6 +4749,37 @@
|
|
|
4687
4749
|
"isProtected": false,
|
|
4688
4750
|
"isAbstract": false
|
|
4689
4751
|
},
|
|
4752
|
+
{
|
|
4753
|
+
"kind": "Method",
|
|
4754
|
+
"canonicalReference": "@genesislcap/ai-assistant!FoundationAiAssistant#showThinkingStepsChanged:member(1)",
|
|
4755
|
+
"docComment": "",
|
|
4756
|
+
"excerptTokens": [
|
|
4757
|
+
{
|
|
4758
|
+
"kind": "Content",
|
|
4759
|
+
"text": "showThinkingStepsChanged(): "
|
|
4760
|
+
},
|
|
4761
|
+
{
|
|
4762
|
+
"kind": "Content",
|
|
4763
|
+
"text": "void"
|
|
4764
|
+
},
|
|
4765
|
+
{
|
|
4766
|
+
"kind": "Content",
|
|
4767
|
+
"text": ";"
|
|
4768
|
+
}
|
|
4769
|
+
],
|
|
4770
|
+
"isStatic": false,
|
|
4771
|
+
"returnTypeTokenRange": {
|
|
4772
|
+
"startIndex": 1,
|
|
4773
|
+
"endIndex": 2
|
|
4774
|
+
},
|
|
4775
|
+
"releaseTag": "Beta",
|
|
4776
|
+
"isProtected": false,
|
|
4777
|
+
"overloadIndex": 1,
|
|
4778
|
+
"parameters": [],
|
|
4779
|
+
"isOptional": false,
|
|
4780
|
+
"isAbstract": false,
|
|
4781
|
+
"name": "showThinkingStepsChanged"
|
|
4782
|
+
},
|
|
4690
4783
|
{
|
|
4691
4784
|
"kind": "Property",
|
|
4692
4785
|
"canonicalReference": "@genesislcap/ai-assistant!FoundationAiAssistant#showToolCalls:member",
|
|
@@ -4717,6 +4810,37 @@
|
|
|
4717
4810
|
"isProtected": false,
|
|
4718
4811
|
"isAbstract": false
|
|
4719
4812
|
},
|
|
4813
|
+
{
|
|
4814
|
+
"kind": "Method",
|
|
4815
|
+
"canonicalReference": "@genesislcap/ai-assistant!FoundationAiAssistant#showToolCallsChanged:member(1)",
|
|
4816
|
+
"docComment": "",
|
|
4817
|
+
"excerptTokens": [
|
|
4818
|
+
{
|
|
4819
|
+
"kind": "Content",
|
|
4820
|
+
"text": "showToolCallsChanged(): "
|
|
4821
|
+
},
|
|
4822
|
+
{
|
|
4823
|
+
"kind": "Content",
|
|
4824
|
+
"text": "void"
|
|
4825
|
+
},
|
|
4826
|
+
{
|
|
4827
|
+
"kind": "Content",
|
|
4828
|
+
"text": ";"
|
|
4829
|
+
}
|
|
4830
|
+
],
|
|
4831
|
+
"isStatic": false,
|
|
4832
|
+
"returnTypeTokenRange": {
|
|
4833
|
+
"startIndex": 1,
|
|
4834
|
+
"endIndex": 2
|
|
4835
|
+
},
|
|
4836
|
+
"releaseTag": "Beta",
|
|
4837
|
+
"isProtected": false,
|
|
4838
|
+
"overloadIndex": 1,
|
|
4839
|
+
"parameters": [],
|
|
4840
|
+
"isOptional": false,
|
|
4841
|
+
"isAbstract": false,
|
|
4842
|
+
"name": "showToolCallsChanged"
|
|
4843
|
+
},
|
|
4720
4844
|
{
|
|
4721
4845
|
"kind": "Property",
|
|
4722
4846
|
"canonicalReference": "@genesislcap/ai-assistant!FoundationAiAssistant#state:member",
|
|
@@ -4810,6 +4934,37 @@
|
|
|
4810
4934
|
"isProtected": false,
|
|
4811
4935
|
"isAbstract": false
|
|
4812
4936
|
},
|
|
4937
|
+
{
|
|
4938
|
+
"kind": "Method",
|
|
4939
|
+
"canonicalReference": "@genesislcap/ai-assistant!FoundationAiAssistant#suggestionsStateChanged:member(1)",
|
|
4940
|
+
"docComment": "",
|
|
4941
|
+
"excerptTokens": [
|
|
4942
|
+
{
|
|
4943
|
+
"kind": "Content",
|
|
4944
|
+
"text": "suggestionsStateChanged(): "
|
|
4945
|
+
},
|
|
4946
|
+
{
|
|
4947
|
+
"kind": "Content",
|
|
4948
|
+
"text": "void"
|
|
4949
|
+
},
|
|
4950
|
+
{
|
|
4951
|
+
"kind": "Content",
|
|
4952
|
+
"text": ";"
|
|
4953
|
+
}
|
|
4954
|
+
],
|
|
4955
|
+
"isStatic": false,
|
|
4956
|
+
"returnTypeTokenRange": {
|
|
4957
|
+
"startIndex": 1,
|
|
4958
|
+
"endIndex": 2
|
|
4959
|
+
},
|
|
4960
|
+
"releaseTag": "Beta",
|
|
4961
|
+
"isProtected": false,
|
|
4962
|
+
"overloadIndex": 1,
|
|
4963
|
+
"parameters": [],
|
|
4964
|
+
"isOptional": false,
|
|
4965
|
+
"isAbstract": false,
|
|
4966
|
+
"name": "suggestionsStateChanged"
|
|
4967
|
+
},
|
|
4813
4968
|
{
|
|
4814
4969
|
"kind": "Method",
|
|
4815
4970
|
"canonicalReference": "@genesislcap/ai-assistant!FoundationAiAssistant#toggleSettings:member(1)",
|
package/dist/ai-assistant.d.ts
CHANGED
|
@@ -571,6 +571,8 @@ export declare class FoundationAiAssistant extends GenesisElement {
|
|
|
571
571
|
private loadingTimer;
|
|
572
572
|
private unsubBus?;
|
|
573
573
|
private haloStartPublished;
|
|
574
|
+
/** True during connectedCallback setup — suppresses cache writes until recovery is applied. */
|
|
575
|
+
private _settingUp;
|
|
574
576
|
showHalo: 'no' | 'orchestrating' | 'agent';
|
|
575
577
|
private syncShowHalo;
|
|
576
578
|
/** True when there is a pending (unresolved) interaction — disables the popout button. */
|
|
@@ -591,6 +593,11 @@ export declare class FoundationAiAssistant extends GenesisElement {
|
|
|
591
593
|
private syncShowingSplash;
|
|
592
594
|
stateChanged(): void;
|
|
593
595
|
messagesChanged(): void;
|
|
596
|
+
showToolCallsChanged(): void;
|
|
597
|
+
showThinkingStepsChanged(): void;
|
|
598
|
+
showAgentSwitchIndicatorChanged(): void;
|
|
599
|
+
enabledAnimationsChanged(): void;
|
|
600
|
+
suggestionsStateChanged(): void;
|
|
594
601
|
showLoadingIndicatorChanged(): void;
|
|
595
602
|
private scrollToBottom;
|
|
596
603
|
private static readonly DEFAULT_LOADING_DELAY_S;
|
|
@@ -603,6 +610,10 @@ export declare class FoundationAiAssistant extends GenesisElement {
|
|
|
603
610
|
handlePopout(): void;
|
|
604
611
|
/** Applies a serialized state snapshot to this live instance (used on collapse path). */
|
|
605
612
|
applyState(state: AiAssistantSerializedState): void;
|
|
613
|
+
/** Returns a cache key for this instance, or undefined if the component has no identity. */
|
|
614
|
+
private getStateKey;
|
|
615
|
+
private persistStateIfTracked;
|
|
616
|
+
private recoverStateIfAvailable;
|
|
606
617
|
private serializeState;
|
|
607
618
|
toggleSettings(): void;
|
|
608
619
|
toggleShowToolCalls(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-driver.d.ts","sourceRoot":"","sources":["../../../../src/components/chat-driver/chat-driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,WAAW,EAGX,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvD,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAOxE,wFAAwF;AACxF,eAAO,MAAM,yBAAyB,yBAAyB,CAAC;AAMhE;;;;GAIG;AACH,MAAM,MAAM,uBAAuB,GAAG,WAAW,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;AAQ9E;;;;;;;GAOG;AACH,qBAAa,UAAW,SAAQ,WAAY,YAAW,QAAQ;IA0B3D,OAAO,CAAC,QAAQ,CAAC,UAAU;IAK3B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IA9BpC,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,mBAAmB,CAGvB;IAEJ,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,YAAY,CAAmB;IACvC,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,eAAe,CAAC,CAAS;IACjC;;;OAGG;IACH,OAAO,CAAC,wBAAwB,CAAC,CAA4C;IAE7E,8EAA8E;IAC9E,OAAO,CAAC,SAAS,CAAwB;IACzC,8FAA8F;IAC9F,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;gBAGxB,UAAU,EAAE,UAAU,EACvC,YAAY,GAAE,gBAAqB,EACnC,eAAe,GAAE,kBAAkB,EAAO,EAC1C,YAAY,CAAC,EAAE,MAAM,EACrB,aAAa,CAAC,EAAE,WAAW,EAAE,EACZ,iBAAiB,GAAE,MAAoC,EACxE,iBAAiB,GAAE,MAAoC;IAUzD;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAWrC;;;OAGG;IACH,2BAA2B,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,GAAG,IAAI;IAIxF,UAAU,IAAI,aAAa,CAAC,WAAW,CAAC;IAIxC,aAAa,IAAI,SAAS,WAAW,EAAE;IAIvC;;;OAGG;IACH,YAAY,IAAI,mBAAmB,EAAE;IAOrC;;;OAGG;IACH,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,IAAI;IAuB/C,cAAc,CAClB,OAAO,EAAE,WAAW,EAAE,EACtB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,YAAY,CAAC,EAAE,eAAe,EAAE,GAC/B,OAAO,CAAC,MAAM,EAAE,CAAC;IA4EpB,MAAM,IAAI,OAAO;IAIjB;;;;;;OAMG;IACU,kBAAkB,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;IAYhF;;;OAGG;IACI,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI;IAsBnE;;;OAGG;IACI,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI;IAS3C,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAqB/F;;;OAGG;IACG,mBAAmB,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuBrF,wFAAwF;IACxF,OAAO,CAAC,OAAO;IAKf;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IA+BxB,uFAAuF;IACvF,OAAO,CAAC,QAAQ;IAqChB,OAAO,CAAC,aAAa;IAQrB,8EAA8E;IAC9E,OAAO,CAAC,SAAS;IAWjB,mFAAmF;IACnF,OAAO,CAAC,2BAA2B;YAiCrB,WAAW;
|
|
1
|
+
{"version":3,"file":"chat-driver.d.ts","sourceRoot":"","sources":["../../../../src/components/chat-driver/chat-driver.ts"],"names":[],"mappings":"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"}
|
package/dist/dts/main/main.d.ts
CHANGED
|
@@ -64,6 +64,8 @@ export declare class FoundationAiAssistant extends GenesisElement {
|
|
|
64
64
|
private loadingTimer;
|
|
65
65
|
private unsubBus?;
|
|
66
66
|
private haloStartPublished;
|
|
67
|
+
/** True during connectedCallback setup — suppresses cache writes until recovery is applied. */
|
|
68
|
+
private _settingUp;
|
|
67
69
|
showHalo: 'no' | 'orchestrating' | 'agent';
|
|
68
70
|
private syncShowHalo;
|
|
69
71
|
/** True when there is a pending (unresolved) interaction — disables the popout button. */
|
|
@@ -84,6 +86,11 @@ export declare class FoundationAiAssistant extends GenesisElement {
|
|
|
84
86
|
private syncShowingSplash;
|
|
85
87
|
stateChanged(): void;
|
|
86
88
|
messagesChanged(): void;
|
|
89
|
+
showToolCallsChanged(): void;
|
|
90
|
+
showThinkingStepsChanged(): void;
|
|
91
|
+
showAgentSwitchIndicatorChanged(): void;
|
|
92
|
+
enabledAnimationsChanged(): void;
|
|
93
|
+
suggestionsStateChanged(): void;
|
|
87
94
|
showLoadingIndicatorChanged(): void;
|
|
88
95
|
private scrollToBottom;
|
|
89
96
|
private static readonly DEFAULT_LOADING_DELAY_S;
|
|
@@ -96,6 +103,10 @@ export declare class FoundationAiAssistant extends GenesisElement {
|
|
|
96
103
|
handlePopout(): void;
|
|
97
104
|
/** Applies a serialized state snapshot to this live instance (used on collapse path). */
|
|
98
105
|
applyState(state: AiAssistantSerializedState): void;
|
|
106
|
+
/** Returns a cache key for this instance, or undefined if the component has no identity. */
|
|
107
|
+
private getStateKey;
|
|
108
|
+
private persistStateIfTracked;
|
|
109
|
+
private recoverStateIfAvailable;
|
|
99
110
|
private serializeState;
|
|
100
111
|
toggleSettings(): void;
|
|
101
112
|
toggleShowToolCalls(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../src/main/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE1F,OAAO,EAGL,cAAc,EAIf,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AASjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAOpD,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EACjB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../src/main/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE1F,OAAO,EAGL,cAAc,EAIf,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AASjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAOpD,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EACjB,MAAM,cAAc,CAAC;AA6BtB;;;;;;;;;GASG;AACH,qBAOa,qBAAsB,SAAQ,cAAc;IAC3C,UAAU,EAAG,UAAU,CAAC;IAExB,kBAAkB,EAAE,MAAM,CAAW;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC5C,WAAW,EAAE,MAAM,CAA0B;IACrD;;;;;OAKG;IACiC,UAAU,CAAC,EAAE,UAAU,CAAC;IAC5D;;;OAGG;IACS,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,UAAU,EAAE,UAAU,CAAM;IAC5B,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC;IAElC,QAAQ,EAAE,WAAW,EAAE,CAAM;IAC7B,KAAK,EAAE,gBAAgB,CAAU;IACjC,UAAU,SAAM;IAChB,WAAW,EAAE,cAAc,EAAE,CAAM;IACnC,gBAAgB,EAAE,MAAM,EAAE,CAAM;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,gBAAgB,EAAE,gBAAgB,CAAsB;IACpE,OAAO,CAAC,sBAAsB,CAAK;IAEnC,iEAAiE;IACrD,aAAa,UAAS;IAClC,qEAAqE;IACzD,iBAAiB,UAAS;IACtC,8EAA8E;IAClE,wBAAwB,UAAS;IAC7C,oCAAoC;IACxB,iBAAiB,EAAE,oBAAoB,EAAE,CAAM;IAC3D,+FAA+F;IACnF,oBAAoB,UAAS;IACzC,0CAA0C;IAC9B,YAAY,UAAS;IACjC,yEAAyE;IAC7D,aAAa,EAAE,MAAM,GAAG,SAAS,CAAa;IAC1D,0DAA0D;IAC9C,YAAY,EAAE,MAAM,GAAG,SAAS,CAAa;IACzD,6IAA6I;IACjI,aAAa,UAAS;IAElC,OAAO,CAAC,MAAM,CAAC,CAAW;IAC1B,OAAO,CAAC,YAAY,CAA4C;IAChE,OAAO,CAAC,QAAQ,CAAC,CAAa;IAC9B,OAAO,CAAC,kBAAkB,CAAS;IACnC,+FAA+F;IAC/F,OAAO,CAAC,UAAU,CAAS;IAEf,QAAQ,EAAE,IAAI,GAAG,eAAe,GAAG,OAAO,CAAQ;IAE9D,OAAO,CAAC,YAAY;IAapB,0FAA0F;IAC1F,IACI,2BAA2B,IAAI,OAAO,CAIzC;IAED,eAAe;IAWf,OAAO,CAAC,kBAAkB;IAU1B;;;;OAIG;IACH,IACI,eAAe,IAAI,WAAW,EAAE,CA0BnC;IAED,iBAAiB;IAmEjB,oBAAoB;YAWN,mBAAmB;IAWjC,iBAAiB;IAIjB,oBAAoB;IAWpB,OAAO,CAAC,iBAAiB;IAIzB,YAAY;IAIZ,eAAe;IAwCf,oBAAoB;IAIpB,wBAAwB;IAIxB,+BAA+B;IAI/B,wBAAwB;IAIxB,uBAAuB;IAIvB,2BAA2B;IAQ3B,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAK;IACpD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAK;IACrD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAQ;IAE7C,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,gBAAgB;IAKxB,qDAAqD;IACrD,YAAY,IAAI,IAAI;IAQpB,yFAAyF;IACzF,UAAU,CAAC,KAAK,EAAE,0BAA0B,GAAG,IAAI;IAiBnD,4FAA4F;IAC5F,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,qBAAqB;IAM7B,OAAO,CAAC,uBAAuB;IAO/B,OAAO,CAAC,cAAc;IAatB,cAAc;IAqBd,mBAAmB;IAInB,uBAAuB;IAIvB,8BAA8B;IAI9B,oBAAoB,CAAC,UAAU,EAAE,oBAAoB,EAAE;IAIvD,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAoBX,gBAAgB;IAehB,gBAAgB,IAAI,IAAI;IAIxB,gBAAgB,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;IAIhC,gBAAgB,CAAC,UAAU,EAAE,cAAc,GAAG,IAAI;IAIlD,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAU5C,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,cAAc;YASR,iBAAiB;IAmC/B,eAAe;IAIf,qBAAqB,CAAC,UAAU,EAAE,MAAM;YAK1B,gBAAgB;YAyChB,IAAI;IAuBlB,OAAO,CAAC,yBAAyB;IAQjC,qBAAqB,CAAC,CAAC,EAAE,UAAU;IAYnC,0BAA0B,CAAC,CAAC,EAAE,KAAK;CAQpC"}
|
|
@@ -611,13 +611,13 @@ export class ChatDriver extends EventTarget {
|
|
|
611
611
|
if (tcMsgIdx !== -1) {
|
|
612
612
|
const tcMsg = this.history[tcMsgIdx];
|
|
613
613
|
const annotatedCalls = tcMsg.toolCalls.map((tc) => {
|
|
614
|
-
var _a, _b;
|
|
614
|
+
var _a, _b, _c, _d;
|
|
615
615
|
const isFoldOpen = !!this.getFold(tc.name) ||
|
|
616
616
|
(
|
|
617
617
|
// Was a fold facade at time of the call (now the tool set has changed)
|
|
618
618
|
// — detect by checking if the result message indicated a fold open
|
|
619
|
-
(_a = executedById.get(tc.id)) === null || _a === void 0 ? void 0 : _a.content.startsWith('Fold opened:'));
|
|
620
|
-
const isFoldClose = (
|
|
619
|
+
(_b = (_a = executedById.get(tc.id)) === null || _a === void 0 ? void 0 : _a.content) === null || _b === void 0 ? void 0 : _b.startsWith('Fold opened:'));
|
|
620
|
+
const isFoldClose = (_d = (_c = executedById.get(tc.id)) === null || _c === void 0 ? void 0 : _c.content) === null || _d === void 0 ? void 0 : _d.startsWith('Fold closed:');
|
|
621
621
|
return Object.assign(Object.assign({}, tc), { foldEvent: isFoldOpen
|
|
622
622
|
? 'open'
|
|
623
623
|
: isFoldClose
|
|
@@ -627,6 +627,9 @@ export class ChatDriver extends EventTarget {
|
|
|
627
627
|
foldPath: !isFoldOpen && !isFoldClose && foldPath.length > 0 ? foldPath : undefined });
|
|
628
628
|
});
|
|
629
629
|
this.history[tcMsgIdx] = Object.assign(Object.assign({}, tcMsg), { toolCalls: annotatedCalls });
|
|
630
|
+
this.dispatchEvent(new CustomEvent('history-updated', {
|
|
631
|
+
detail: this.history,
|
|
632
|
+
}));
|
|
630
633
|
}
|
|
631
634
|
const firstContinuation = systemCalls[0];
|
|
632
635
|
if (firstContinuation) {
|
|
@@ -637,6 +640,10 @@ export class ChatDriver extends EventTarget {
|
|
|
637
640
|
}
|
|
638
641
|
if (iterations >= this.maxToolIterations) {
|
|
639
642
|
logger.warn('ChatDriver: reached max tool iterations, stopping');
|
|
643
|
+
this.appendToHistory({
|
|
644
|
+
role: 'assistant',
|
|
645
|
+
content: "I've reached my limit for this response. You can ask me to continue and I'll pick up where I left off.",
|
|
646
|
+
});
|
|
640
647
|
}
|
|
641
648
|
return { reason: 'done' };
|
|
642
649
|
});
|
package/dist/esm/main/main.js
CHANGED
|
@@ -25,6 +25,13 @@ const MODEL_CONTEXT_LIMITS = {
|
|
|
25
25
|
'gpt-4o-mini': 128000,
|
|
26
26
|
'gpt-4-turbo': 128000,
|
|
27
27
|
};
|
|
28
|
+
/**
|
|
29
|
+
* Module-level cache for surviving unintentional DOM lifecycle events (e.g. layout systems
|
|
30
|
+
* removing and re-inserting components). Keyed by the component's identity string (see
|
|
31
|
+
* `getStateKey`). Intentionally never evicted — entries are small in number and each is simply
|
|
32
|
+
* overwritten on every state change.
|
|
33
|
+
*/
|
|
34
|
+
const stateCache = new Map();
|
|
28
35
|
// Register supporting components when the main component module is imported.
|
|
29
36
|
avoidTreeShaking(AiChatMarkdown, AiChatInteractionWrapper, AiHaloOverlay, AiChatBubble, AiActivityHalo, ChatSuggestions);
|
|
30
37
|
/**
|
|
@@ -69,6 +76,8 @@ let FoundationAiAssistant = FoundationAiAssistant_1 = class FoundationAiAssistan
|
|
|
69
76
|
/** Whether the splash overlay is currently showing (no messages and showSplash is enabled). Reflected as a boolean attribute on the host. */
|
|
70
77
|
this.showingSplash = false;
|
|
71
78
|
this.haloStartPublished = false;
|
|
79
|
+
/** True during connectedCallback setup — suppresses cache writes until recovery is applied. */
|
|
80
|
+
this._settingUp = false;
|
|
72
81
|
this.showHalo = 'no';
|
|
73
82
|
}
|
|
74
83
|
syncShowHalo() {
|
|
@@ -148,6 +157,7 @@ let FoundationAiAssistant = FoundationAiAssistant_1 = class FoundationAiAssistan
|
|
|
148
157
|
connectedCallback() {
|
|
149
158
|
var _a, _b, _c, _d, _e, _f;
|
|
150
159
|
super.connectedCallback();
|
|
160
|
+
this._settingUp = true;
|
|
151
161
|
const ui = (_a = this.chatConfig.ui) !== null && _a !== void 0 ? _a : {};
|
|
152
162
|
const agent = (_b = this.chatConfig.agent) !== null && _b !== void 0 ? _b : {};
|
|
153
163
|
this.showToolCalls = ui.showToolCalls === true;
|
|
@@ -191,6 +201,8 @@ let FoundationAiAssistant = FoundationAiAssistant_1 = class FoundationAiAssistan
|
|
|
191
201
|
this.applyState(state);
|
|
192
202
|
});
|
|
193
203
|
}
|
|
204
|
+
this.recoverStateIfAvailable();
|
|
205
|
+
this._settingUp = false;
|
|
194
206
|
this.syncShowingSplash();
|
|
195
207
|
this.fetchSuggestions();
|
|
196
208
|
void this.resolveContextLimit();
|
|
@@ -201,6 +213,8 @@ let FoundationAiAssistant = FoundationAiAssistant_1 = class FoundationAiAssistan
|
|
|
201
213
|
super.disconnectedCallback();
|
|
202
214
|
this.stopLoadingTimer();
|
|
203
215
|
this.state = 'idle';
|
|
216
|
+
// Persist before clearing the driver so foldStack is still accessible.
|
|
217
|
+
this.persistStateIfTracked();
|
|
204
218
|
(_a = this.unsubBus) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
205
219
|
this.unsubBus = undefined;
|
|
206
220
|
this.driver = undefined;
|
|
@@ -242,6 +256,7 @@ let FoundationAiAssistant = FoundationAiAssistant_1 = class FoundationAiAssistan
|
|
|
242
256
|
}
|
|
243
257
|
messagesChanged() {
|
|
244
258
|
var _a, _b;
|
|
259
|
+
this.persistStateIfTracked();
|
|
245
260
|
// Reset the loading timer when an assistant message arrives mid-loop so each
|
|
246
261
|
// individual step gets a fresh window before the spinner appears.
|
|
247
262
|
// If the last message is a blocking interaction, stop the timer — the AI is
|
|
@@ -280,6 +295,21 @@ let FoundationAiAssistant = FoundationAiAssistant_1 = class FoundationAiAssistan
|
|
|
280
295
|
}
|
|
281
296
|
this.scrollToBottom();
|
|
282
297
|
}
|
|
298
|
+
showToolCallsChanged() {
|
|
299
|
+
this.persistStateIfTracked();
|
|
300
|
+
}
|
|
301
|
+
showThinkingStepsChanged() {
|
|
302
|
+
this.persistStateIfTracked();
|
|
303
|
+
}
|
|
304
|
+
showAgentSwitchIndicatorChanged() {
|
|
305
|
+
this.persistStateIfTracked();
|
|
306
|
+
}
|
|
307
|
+
enabledAnimationsChanged() {
|
|
308
|
+
this.persistStateIfTracked();
|
|
309
|
+
}
|
|
310
|
+
suggestionsStateChanged() {
|
|
311
|
+
this.persistStateIfTracked();
|
|
312
|
+
}
|
|
283
313
|
showLoadingIndicatorChanged() {
|
|
284
314
|
if (this.showLoadingIndicator) {
|
|
285
315
|
this.scrollToBottom();
|
|
@@ -347,6 +377,26 @@ let FoundationAiAssistant = FoundationAiAssistant_1 = class FoundationAiAssistan
|
|
|
347
377
|
this.suggestionsState = { status: 'loaded', suggestions: state.suggestions };
|
|
348
378
|
}
|
|
349
379
|
}
|
|
380
|
+
/** Returns a cache key for this instance, or undefined if the component has no identity. */
|
|
381
|
+
getStateKey() {
|
|
382
|
+
const parts = [this.id, this.headerTitle].filter(Boolean);
|
|
383
|
+
return parts.length ? parts.join('::') : undefined;
|
|
384
|
+
}
|
|
385
|
+
persistStateIfTracked() {
|
|
386
|
+
if (this._settingUp)
|
|
387
|
+
return;
|
|
388
|
+
const key = this.getStateKey();
|
|
389
|
+
if (key)
|
|
390
|
+
stateCache.set(key, this.serializeState());
|
|
391
|
+
}
|
|
392
|
+
recoverStateIfAvailable() {
|
|
393
|
+
const key = this.getStateKey();
|
|
394
|
+
if (!key)
|
|
395
|
+
return;
|
|
396
|
+
const saved = stateCache.get(key);
|
|
397
|
+
if (saved)
|
|
398
|
+
this.applyState(saved);
|
|
399
|
+
}
|
|
350
400
|
serializeState() {
|
|
351
401
|
return {
|
|
352
402
|
messages: [...this.messages],
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@genesislcap/ai-assistant",
|
|
3
3
|
"description": "Genesis AI Assistant micro-frontend",
|
|
4
|
-
"version": "14.409.0-FUI-2495.
|
|
4
|
+
"version": "14.409.0-FUI-2495.9",
|
|
5
5
|
"license": "SEE LICENSE IN license.txt",
|
|
6
6
|
"main": "dist/esm/index.js",
|
|
7
7
|
"types": "dist/ai-assistant.d.ts",
|
|
@@ -59,23 +59,23 @@
|
|
|
59
59
|
}
|
|
60
60
|
},
|
|
61
61
|
"devDependencies": {
|
|
62
|
-
"@genesislcap/foundation-testing": "14.409.0-FUI-2495.
|
|
63
|
-
"@genesislcap/genx": "14.409.0-FUI-2495.
|
|
64
|
-
"@genesislcap/rollup-builder": "14.409.0-FUI-2495.
|
|
65
|
-
"@genesislcap/ts-builder": "14.409.0-FUI-2495.
|
|
66
|
-
"@genesislcap/uvu-playwright-builder": "14.409.0-FUI-2495.
|
|
67
|
-
"@genesislcap/vite-builder": "14.409.0-FUI-2495.
|
|
68
|
-
"@genesislcap/webpack-builder": "14.409.0-FUI-2495.
|
|
62
|
+
"@genesislcap/foundation-testing": "14.409.0-FUI-2495.9",
|
|
63
|
+
"@genesislcap/genx": "14.409.0-FUI-2495.9",
|
|
64
|
+
"@genesislcap/rollup-builder": "14.409.0-FUI-2495.9",
|
|
65
|
+
"@genesislcap/ts-builder": "14.409.0-FUI-2495.9",
|
|
66
|
+
"@genesislcap/uvu-playwright-builder": "14.409.0-FUI-2495.9",
|
|
67
|
+
"@genesislcap/vite-builder": "14.409.0-FUI-2495.9",
|
|
68
|
+
"@genesislcap/webpack-builder": "14.409.0-FUI-2495.9",
|
|
69
69
|
"@types/dompurify": "^3.0.5",
|
|
70
70
|
"@types/marked": "^5.0.2"
|
|
71
71
|
},
|
|
72
72
|
"dependencies": {
|
|
73
|
-
"@genesislcap/foundation-ai": "14.409.0-FUI-2495.
|
|
74
|
-
"@genesislcap/foundation-logger": "14.409.0-FUI-2495.
|
|
75
|
-
"@genesislcap/foundation-ui": "14.409.0-FUI-2495.
|
|
76
|
-
"@genesislcap/foundation-utils": "14.409.0-FUI-2495.
|
|
77
|
-
"@genesislcap/rapid-design-system": "14.409.0-FUI-2495.
|
|
78
|
-
"@genesislcap/web-core": "14.409.0-FUI-2495.
|
|
73
|
+
"@genesislcap/foundation-ai": "14.409.0-FUI-2495.9",
|
|
74
|
+
"@genesislcap/foundation-logger": "14.409.0-FUI-2495.9",
|
|
75
|
+
"@genesislcap/foundation-ui": "14.409.0-FUI-2495.9",
|
|
76
|
+
"@genesislcap/foundation-utils": "14.409.0-FUI-2495.9",
|
|
77
|
+
"@genesislcap/rapid-design-system": "14.409.0-FUI-2495.9",
|
|
78
|
+
"@genesislcap/web-core": "14.409.0-FUI-2495.9",
|
|
79
79
|
"dompurify": "^3.3.1",
|
|
80
80
|
"marked": "^17.0.3"
|
|
81
81
|
},
|
|
@@ -87,5 +87,5 @@
|
|
|
87
87
|
"publishConfig": {
|
|
88
88
|
"access": "public"
|
|
89
89
|
},
|
|
90
|
-
"gitHead": "
|
|
90
|
+
"gitHead": "79df39dc559df3b11085a61b02c0bb2457c98d13"
|
|
91
91
|
}
|
|
@@ -738,8 +738,8 @@ export class ChatDriver extends EventTarget implements AiDriver {
|
|
|
738
738
|
!!this.getFold(tc.name) ||
|
|
739
739
|
// Was a fold facade at time of the call (now the tool set has changed)
|
|
740
740
|
// — detect by checking if the result message indicated a fold open
|
|
741
|
-
executedById.get(tc.id)?.content
|
|
742
|
-
const isFoldClose = executedById.get(tc.id)?.content
|
|
741
|
+
executedById.get(tc.id)?.content?.startsWith('Fold opened:');
|
|
742
|
+
const isFoldClose = executedById.get(tc.id)?.content?.startsWith('Fold closed:');
|
|
743
743
|
return {
|
|
744
744
|
...tc,
|
|
745
745
|
foldEvent: isFoldOpen
|
|
@@ -752,6 +752,11 @@ export class ChatDriver extends EventTarget implements AiDriver {
|
|
|
752
752
|
};
|
|
753
753
|
});
|
|
754
754
|
this.history[tcMsgIdx] = { ...tcMsg, toolCalls: annotatedCalls };
|
|
755
|
+
this.dispatchEvent(
|
|
756
|
+
new CustomEvent<ReadonlyArray<ChatMessage>>('history-updated', {
|
|
757
|
+
detail: this.history,
|
|
758
|
+
}),
|
|
759
|
+
);
|
|
755
760
|
}
|
|
756
761
|
|
|
757
762
|
const firstContinuation = systemCalls[0];
|
|
@@ -768,6 +773,11 @@ export class ChatDriver extends EventTarget implements AiDriver {
|
|
|
768
773
|
|
|
769
774
|
if (iterations >= this.maxToolIterations) {
|
|
770
775
|
logger.warn('ChatDriver: reached max tool iterations, stopping');
|
|
776
|
+
this.appendToHistory({
|
|
777
|
+
role: 'assistant',
|
|
778
|
+
content:
|
|
779
|
+
"I've reached my limit for this response. You can ask me to continue and I'll pick up where I left off.",
|
|
780
|
+
});
|
|
771
781
|
}
|
|
772
782
|
|
|
773
783
|
return { reason: 'done' };
|
package/src/main/main.ts
CHANGED
|
@@ -42,6 +42,14 @@ const MODEL_CONTEXT_LIMITS: Record<string, number> = {
|
|
|
42
42
|
'gpt-4-turbo': 128_000,
|
|
43
43
|
};
|
|
44
44
|
|
|
45
|
+
/**
|
|
46
|
+
* Module-level cache for surviving unintentional DOM lifecycle events (e.g. layout systems
|
|
47
|
+
* removing and re-inserting components). Keyed by the component's identity string (see
|
|
48
|
+
* `getStateKey`). Intentionally never evicted — entries are small in number and each is simply
|
|
49
|
+
* overwritten on every state change.
|
|
50
|
+
*/
|
|
51
|
+
const stateCache = new Map<string, AiAssistantSerializedState>();
|
|
52
|
+
|
|
45
53
|
// Register supporting components when the main component module is imported.
|
|
46
54
|
avoidTreeShaking(
|
|
47
55
|
AiChatMarkdown,
|
|
@@ -123,6 +131,8 @@ export class FoundationAiAssistant extends GenesisElement {
|
|
|
123
131
|
private loadingTimer: ReturnType<typeof setTimeout> | undefined;
|
|
124
132
|
private unsubBus?: () => void;
|
|
125
133
|
private haloStartPublished = false;
|
|
134
|
+
/** True during connectedCallback setup — suppresses cache writes until recovery is applied. */
|
|
135
|
+
private _settingUp = false;
|
|
126
136
|
|
|
127
137
|
@observable showHalo: 'no' | 'orchestrating' | 'agent' = 'no';
|
|
128
138
|
|
|
@@ -204,6 +214,7 @@ export class FoundationAiAssistant extends GenesisElement {
|
|
|
204
214
|
|
|
205
215
|
connectedCallback() {
|
|
206
216
|
super.connectedCallback();
|
|
217
|
+
this._settingUp = true;
|
|
207
218
|
const ui = this.chatConfig.ui ?? {};
|
|
208
219
|
const agent = this.chatConfig.agent ?? {};
|
|
209
220
|
|
|
@@ -259,6 +270,9 @@ export class FoundationAiAssistant extends GenesisElement {
|
|
|
259
270
|
});
|
|
260
271
|
}
|
|
261
272
|
|
|
273
|
+
this.recoverStateIfAvailable();
|
|
274
|
+
this._settingUp = false;
|
|
275
|
+
|
|
262
276
|
this.syncShowingSplash();
|
|
263
277
|
this.fetchSuggestions();
|
|
264
278
|
void this.resolveContextLimit();
|
|
@@ -269,6 +283,8 @@ export class FoundationAiAssistant extends GenesisElement {
|
|
|
269
283
|
super.disconnectedCallback();
|
|
270
284
|
this.stopLoadingTimer();
|
|
271
285
|
this.state = 'idle';
|
|
286
|
+
// Persist before clearing the driver so foldStack is still accessible.
|
|
287
|
+
this.persistStateIfTracked();
|
|
272
288
|
this.unsubBus?.();
|
|
273
289
|
this.unsubBus = undefined;
|
|
274
290
|
this.driver = undefined;
|
|
@@ -309,6 +325,7 @@ export class FoundationAiAssistant extends GenesisElement {
|
|
|
309
325
|
}
|
|
310
326
|
|
|
311
327
|
messagesChanged() {
|
|
328
|
+
this.persistStateIfTracked();
|
|
312
329
|
// Reset the loading timer when an assistant message arrives mid-loop so each
|
|
313
330
|
// individual step gets a fresh window before the spinner appears.
|
|
314
331
|
// If the last message is a blocking interaction, stop the timer — the AI is
|
|
@@ -347,6 +364,26 @@ export class FoundationAiAssistant extends GenesisElement {
|
|
|
347
364
|
this.scrollToBottom();
|
|
348
365
|
}
|
|
349
366
|
|
|
367
|
+
showToolCallsChanged() {
|
|
368
|
+
this.persistStateIfTracked();
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
showThinkingStepsChanged() {
|
|
372
|
+
this.persistStateIfTracked();
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
showAgentSwitchIndicatorChanged() {
|
|
376
|
+
this.persistStateIfTracked();
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
enabledAnimationsChanged() {
|
|
380
|
+
this.persistStateIfTracked();
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
suggestionsStateChanged() {
|
|
384
|
+
this.persistStateIfTracked();
|
|
385
|
+
}
|
|
386
|
+
|
|
350
387
|
showLoadingIndicatorChanged() {
|
|
351
388
|
if (this.showLoadingIndicator) {
|
|
352
389
|
this.scrollToBottom();
|
|
@@ -419,6 +456,25 @@ export class FoundationAiAssistant extends GenesisElement {
|
|
|
419
456
|
}
|
|
420
457
|
}
|
|
421
458
|
|
|
459
|
+
/** Returns a cache key for this instance, or undefined if the component has no identity. */
|
|
460
|
+
private getStateKey(): string | undefined {
|
|
461
|
+
const parts = [this.id, this.headerTitle].filter(Boolean);
|
|
462
|
+
return parts.length ? parts.join('::') : undefined;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
private persistStateIfTracked(): void {
|
|
466
|
+
if (this._settingUp) return;
|
|
467
|
+
const key = this.getStateKey();
|
|
468
|
+
if (key) stateCache.set(key, this.serializeState());
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
private recoverStateIfAvailable(): void {
|
|
472
|
+
const key = this.getStateKey();
|
|
473
|
+
if (!key) return;
|
|
474
|
+
const saved = stateCache.get(key);
|
|
475
|
+
if (saved) this.applyState(saved);
|
|
476
|
+
}
|
|
477
|
+
|
|
422
478
|
private serializeState(): AiAssistantSerializedState {
|
|
423
479
|
return {
|
|
424
480
|
messages: [...this.messages],
|