11// Copyright 2026, Command Line Inc.
22// SPDX-License-Identifier: Apache-2.0
33
4- import { useWaveEnv , WaveEnv } from "@/app/waveenv/waveenv" ;
4+ import { WaveEnv , WaveEnvSubset } from "@/app/waveenv/waveenv" ;
55import { atom , Atom , PrimitiveAtom } from "jotai" ;
66import { createContext , useContext } from "react" ;
77import { globalStore } from "./jotaiStore" ;
88import * as WOS from "./wos" ;
99
10+ export type TabModelEnv = WaveEnvSubset < {
11+ wos : WaveEnv [ "wos" ] ;
12+ } > ;
13+
1014const tabModelCache = new Map < string , TabModel > ( ) ;
1115export const activeTabIdAtom = atom < string > ( null ) as PrimitiveAtom < string > ;
1216
1317export class TabModel {
1418 tabId : string ;
15- waveEnv : WaveEnv ;
19+ waveEnv : TabModelEnv ;
1620 tabAtom : Atom < Tab > ;
1721 tabNumBlocksAtom : Atom < number > ;
1822 isTermMultiInput = atom ( false ) as PrimitiveAtom < boolean > ;
1923 metaCache : Map < string , Atom < any > > = new Map ( ) ;
2024
21- constructor ( tabId : string , waveEnv ?: WaveEnv ) {
25+ constructor ( tabId : string , waveEnv ?: TabModelEnv ) {
2226 this . tabId = tabId ;
2327 this . waveEnv = waveEnv ;
2428 this . tabAtom = atom ( ( get ) => {
@@ -46,16 +50,25 @@ export class TabModel {
4650 }
4751}
4852
49- export function getTabModelByTabId ( tabId : string , waveEnv ?: WaveEnv ) : TabModel {
50- let model = tabModelCache . get ( tabId ) ;
53+ export function getTabModelByTabId ( tabId : string , waveEnv ?: TabModelEnv ) : TabModel {
54+ if ( ! waveEnv ?. isMock ) {
55+ let model = tabModelCache . get ( tabId ) ;
56+ if ( model == null ) {
57+ model = new TabModel ( tabId , waveEnv ) ;
58+ tabModelCache . set ( tabId , model ) ;
59+ }
60+ return model ;
61+ }
62+ const key = `TabModel:${ tabId } ` ;
63+ let model = waveEnv . mockModels . get ( key ) ;
5164 if ( model == null ) {
5265 model = new TabModel ( tabId , waveEnv ) ;
53- tabModelCache . set ( tabId , model ) ;
66+ waveEnv . mockModels . set ( key , model ) ;
5467 }
5568 return model ;
5669}
5770
58- export function getActiveTabModel ( waveEnv ?: WaveEnv ) : TabModel | null {
71+ export function getActiveTabModel ( waveEnv ?: TabModelEnv ) : TabModel | null {
5972 const activeTabId = globalStore . get ( activeTabIdAtom ) ;
6073 if ( activeTabId == null ) {
6174 return null ;
@@ -66,22 +79,13 @@ export function getActiveTabModel(waveEnv?: WaveEnv): TabModel | null {
6679export const TabModelContext = createContext < TabModel | undefined > ( undefined ) ;
6780
6881export function useTabModel ( ) : TabModel {
69- const waveEnv = useWaveEnv ( ) ;
7082 const ctxModel = useContext ( TabModelContext ) ;
71- if ( waveEnv ?. mockTabModel != null ) {
72- return waveEnv . mockTabModel ;
73- }
7483 if ( ctxModel == null ) {
7584 throw new Error ( "useTabModel must be used within a TabModelProvider" ) ;
7685 }
7786 return ctxModel ;
7887}
7988
8089export function useTabModelMaybe ( ) : TabModel {
81- const waveEnv = useWaveEnv ( ) ;
82- const ctxModel = useContext ( TabModelContext ) ;
83- if ( waveEnv ?. mockTabModel != null ) {
84- return waveEnv . mockTabModel ;
85- }
86- return ctxModel ;
90+ return useContext ( TabModelContext ) ;
8791}
0 commit comments