@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.
@@ -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)",
@@ -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":"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"}
1
+ {"version":3,"file":"chat-driver.d.ts","sourceRoot":"","sources":["../../../../src/components/chat-driver/chat-driver.ts"],"names":[],"mappings":"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"}
@@ -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":"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"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../src/main/main.ts"],"names":[],"mappings":"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"}
@@ -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 = (_b = executedById.get(tc.id)) === null || _b === void 0 ? void 0 : _b.content.startsWith('Fold closed:');
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
  });
@@ -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.7",
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.7",
63
- "@genesislcap/genx": "14.409.0-FUI-2495.7",
64
- "@genesislcap/rollup-builder": "14.409.0-FUI-2495.7",
65
- "@genesislcap/ts-builder": "14.409.0-FUI-2495.7",
66
- "@genesislcap/uvu-playwright-builder": "14.409.0-FUI-2495.7",
67
- "@genesislcap/vite-builder": "14.409.0-FUI-2495.7",
68
- "@genesislcap/webpack-builder": "14.409.0-FUI-2495.7",
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.7",
74
- "@genesislcap/foundation-logger": "14.409.0-FUI-2495.7",
75
- "@genesislcap/foundation-ui": "14.409.0-FUI-2495.7",
76
- "@genesislcap/foundation-utils": "14.409.0-FUI-2495.7",
77
- "@genesislcap/rapid-design-system": "14.409.0-FUI-2495.7",
78
- "@genesislcap/web-core": "14.409.0-FUI-2495.7",
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": "6072bec9e2529c4bef0761c9ce49ff2a01a162c0"
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.startsWith('Fold opened:');
742
- const isFoldClose = executedById.get(tc.id)?.content.startsWith('Fold closed:');
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],